Merge new root
This commit is contained in:
commit
18b9528c43
1253 files changed
+350622
No files matched your search
@@ -13,3 +13,429 @@ cc6273db844d391455840a0cb63fbd8e78b704c7 web_shop-5.8.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
|
||||
@@ -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 SHOPIFY_PASSWORD SHOPIFY_URL TRYTOND_WEB_SHOP_SHOPIFY__API_BACKOFF_TIME
|
||||
- POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
|
||||
secrets: [ shopify_password, shopify_url, trytond_web_shop_shopify__api_backoff_time ]
|
||||
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
|
||||
@@ -0,0 +1,2 @@
|
||||
[flake8]
|
||||
ignore=E123,E124,E126,E128,E741,W503
|
||||
@@ -0,0 +1,3 @@
|
||||
[settings]
|
||||
multi_line_output=4
|
||||
known_first_party=trytond
|
||||
@@ -0,0 +1,18 @@
|
||||
Version 6.6.0 - 2022-10-31
|
||||
--------------------------
|
||||
* Bug fixes (see mercurial logs for details)
|
||||
* Replace deprecated fulfillment by fulfillment order
|
||||
|
||||
Version 6.4.0 - 2022-05-02
|
||||
--------------------------
|
||||
* Bug fixes (see mercurial logs for details)
|
||||
* Support webhook for orders
|
||||
* Remove API backoff time
|
||||
* Support edit orders from Shopify
|
||||
* Define the metafields managed by Tryton
|
||||
* Add support for Python 3.10
|
||||
* Remove support for Python 3.6
|
||||
|
||||
Version 6.2.0 - 2021-11-01
|
||||
--------------------------
|
||||
* Initial release
|
||||
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
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
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
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
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,6 @@
|
||||
include CHANGELOG
|
||||
include COPYRIGHT
|
||||
include LICENSE
|
||||
include README.rst
|
||||
include icons/LICENSE
|
||||
graft doc
|
||||
+1
@@ -0,0 +1 @@
|
||||
doc/index.rst
|
||||
@@ -0,0 +1,71 @@
|
||||
# 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, ir, party, product, routes, sale, shopify_retry, stock, web)
|
||||
|
||||
__all__ = ['register', 'routes']
|
||||
|
||||
shopify_retry.patch()
|
||||
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
ir.Cron,
|
||||
web.Shop,
|
||||
web.ShopShopifyIdentifier,
|
||||
web.Shop_Warehouse,
|
||||
web.Shop_Attribute,
|
||||
web.ShopShopifyPaymentJournal,
|
||||
product.Category,
|
||||
product.TemplateCategory,
|
||||
product.Template,
|
||||
product.Product,
|
||||
product.ShopifyInventoryItem,
|
||||
product.ProductIdentifier,
|
||||
product.AttributeSet,
|
||||
product.Attribute,
|
||||
party.Party,
|
||||
party.Address,
|
||||
sale.Sale,
|
||||
sale.Line,
|
||||
account.Payment,
|
||||
account.PaymentJournal,
|
||||
stock.ShipmentOut,
|
||||
stock.ShipmentShopifyIdentifier,
|
||||
stock.Move,
|
||||
module='web_shop_shopify', type_='model')
|
||||
Pool.register(
|
||||
product.ShopifyInventoryItem_Customs,
|
||||
product.Product_TariffCode,
|
||||
module='web_shop_shopify', type_='model', depends=['customs'])
|
||||
Pool.register(
|
||||
product.Image,
|
||||
module='web_shop_shopify', type_='model', depends=['product_image'])
|
||||
Pool.register(
|
||||
product.Image_Attribute,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['product_attribute', 'product_image_attribute'])
|
||||
Pool.register(
|
||||
sale.Line_Discount,
|
||||
module='web_shop_shopify', type_='model', depends=['sale_discount'])
|
||||
Pool.register(
|
||||
product.Template_SaleSecondaryUnit,
|
||||
product.Product_SaleSecondaryUnit,
|
||||
sale.Line_SaleSecondaryUnit,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['sale_secondary_unit'])
|
||||
Pool.register(
|
||||
sale.Sale_ShipmentCost,
|
||||
sale.Line_ShipmentCost,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['sale_shipment_cost'])
|
||||
Pool.register(
|
||||
stock.ShipmentOut_PackageShipping,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['stock_package_shipping'])
|
||||
Pool.register(
|
||||
party.Replace,
|
||||
module='web_shop_shopify', type_='wizard')
|
||||
@@ -0,0 +1,135 @@
|
||||
# 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 trytond.model import Unique
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
from .common import IdentifierMixin
|
||||
|
||||
|
||||
class Payment(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'account.payment'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shopify_identifier_unique',
|
||||
Unique(t, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_payment_unique'),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def _get_shopify_payment_journal_pattern(cls, sale, transaction):
|
||||
return {
|
||||
'gateway': transaction.gateway,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def _get_from_shopify(cls, sale, transaction):
|
||||
assert transaction.kind in {'authorization', 'sale'}
|
||||
payment = cls(shopify_identifier=transaction.id)
|
||||
payment.company = sale.company
|
||||
payment.journal = sale.web_shop.get_payment_journal(
|
||||
transaction.currency,
|
||||
cls._get_shopify_payment_journal_pattern(
|
||||
sale, transaction))
|
||||
payment.kind = 'receivable'
|
||||
payment.amount = Decimal(transaction.amount)
|
||||
payment.origin = sale
|
||||
payment.party = sale.party
|
||||
return payment
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, order):
|
||||
pool = Pool()
|
||||
Group = pool.get('account.payment.group')
|
||||
|
||||
id2payments = {}
|
||||
to_process = defaultdict(list)
|
||||
transactions = [
|
||||
t for t in order.transactions() if t.status == 'success']
|
||||
# Order transactions to process parent first
|
||||
kinds = ['authorization', 'capture', 'sale', 'void', 'refund']
|
||||
transactions.sort(key=lambda t: kinds.index(t.kind))
|
||||
amounts = defaultdict(Decimal)
|
||||
for transaction in transactions:
|
||||
if transaction.kind not in {'authorization', 'sale'}:
|
||||
continue
|
||||
payments = cls.search([
|
||||
('shopify_identifier', '=', transaction.id),
|
||||
])
|
||||
if payments:
|
||||
payment, = payments
|
||||
else:
|
||||
payment = cls._get_from_shopify(sale, transaction)
|
||||
to_process[payment.company, payment.journal].append(payment)
|
||||
id2payments[transaction.id] = payment
|
||||
amounts[transaction.id] = Decimal(transaction.amount)
|
||||
cls.save(list(id2payments.values()))
|
||||
|
||||
for (company, journal), payments in to_process.items():
|
||||
group = Group(
|
||||
company=company,
|
||||
journal=journal,
|
||||
kind='receivable')
|
||||
group.save()
|
||||
cls.submit(payments)
|
||||
cls.process(payments, lambda: group)
|
||||
|
||||
captured = defaultdict(Decimal)
|
||||
voided = defaultdict(Decimal)
|
||||
refunded = defaultdict(Decimal)
|
||||
for transaction in transactions:
|
||||
if transaction.kind == 'sale':
|
||||
payment = id2payments[transaction.id]
|
||||
captured[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'capture':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
id2payments[transaction.id] = payment
|
||||
captured[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'void':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
voided[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'refund':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
captured[payment] -= Decimal(transaction.amount)
|
||||
refunded[payment] += Decimal(transaction.amount)
|
||||
|
||||
to_save = []
|
||||
for payment in id2payments.values():
|
||||
if captured[payment] and payment.amount != captured[payment]:
|
||||
payment.amount = captured[payment]
|
||||
to_save.append(payment)
|
||||
cls.proceed(to_save)
|
||||
cls.save(to_save)
|
||||
|
||||
to_succeed, to_fail, to_proceed = set(), set(), set()
|
||||
for transaction_id, payment in id2payments.items():
|
||||
if amounts[transaction_id] == (
|
||||
captured[payment] + voided[payment] + refunded[payment]):
|
||||
if payment.amount:
|
||||
if payment.state != 'succeeded':
|
||||
to_succeed.add(payment)
|
||||
else:
|
||||
if payment.state != 'failed':
|
||||
to_fail.add(payment)
|
||||
elif payment.state != 'processing':
|
||||
to_proceed.add(payment)
|
||||
cls.fail(to_fail)
|
||||
cls.proceed(to_proceed)
|
||||
cls.succeed(to_succeed)
|
||||
|
||||
return list(id2payments.values())
|
||||
|
||||
|
||||
class PaymentJournal(metaclass=PoolMeta):
|
||||
__name__ = 'account.payment.journal'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.process_method.selection.append(('shopify', "Shopify"))
|
||||
@@ -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.
|
||||
from trytond.i18n import lazy_gettext
|
||||
from trytond.model import fields
|
||||
from trytond.pool import Pool
|
||||
|
||||
|
||||
class IdentifierMixin:
|
||||
__slots__ = ()
|
||||
|
||||
shopify_identifier_signed = fields.BigInteger(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier'))
|
||||
shopify_identifier = fields.Function(fields.BigInteger(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier')),
|
||||
'get_shopify_identifier', setter='set_shopify_identifier',
|
||||
searcher='search_shopify_identifier')
|
||||
shopify_identifier_char = fields.Function(fields.Char(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier')),
|
||||
'get_shopify_identifier', setter='set_shopify_identifier',
|
||||
searcher='search_shopify_identifier')
|
||||
|
||||
def get_shopify_identifier(self, name):
|
||||
if self.shopify_identifier_signed is not None:
|
||||
value = self.shopify_identifier_signed + (1 << 63)
|
||||
if name == 'shopify_identifier_char':
|
||||
value = str(value)
|
||||
return value
|
||||
|
||||
@classmethod
|
||||
def set_shopify_identifier(cls, records, name, value):
|
||||
cls.write(records, {
|
||||
'shopify_identifier_signed': int(value) - (1 << 63),
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, name, domain):
|
||||
_, operator, value = domain
|
||||
if operator in {'in', 'not in'}:
|
||||
value = [
|
||||
int(v) - (1 << 63) if v is not None else None for v in value]
|
||||
elif value is not None:
|
||||
value = int(value) - (1 << 63)
|
||||
return [('shopify_identifier_signed', operator, value)]
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifier_signed')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
|
||||
class IdentifiersUpdateMixin:
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields = set()
|
||||
|
||||
@classmethod
|
||||
def set_shopify_to_update(cls, records):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
identifiers = cls.get_shopify_identifier_to_update(records)
|
||||
Identifier.write(identifiers, {
|
||||
'to_update': True,
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
raise NotImplementedError
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
to_update = set()
|
||||
for records, values in zip(actions, actions):
|
||||
if values.keys() & cls._shopify_fields:
|
||||
to_update.update(records)
|
||||
if to_update:
|
||||
cls.set_shopify_to_update(cls.browse(list(to_update)))
|
||||
super().write(*args)
|
||||
|
||||
|
||||
class IdentifiersMixin(IdentifiersUpdateMixin):
|
||||
__slots__ = ()
|
||||
|
||||
shopify_identifiers = fields.One2Many(
|
||||
'web.shop.shopify_identifier', 'record',
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifiers'))
|
||||
|
||||
def get_shopify_identifier(self, web_shop):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
return record.shopify_identifier
|
||||
|
||||
def set_shopify_identifier(self, web_shop, identifier=None):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
if not identifier:
|
||||
Identifier.delete([record])
|
||||
return
|
||||
else:
|
||||
if record.shopify_identifier != identifier:
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
if identifier:
|
||||
record = Identifier(record=self, web_shop=web_shop)
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, web_shop, identifier):
|
||||
records = cls.search([
|
||||
('shopify_identifiers', 'where', [
|
||||
('web_shop', '=', web_shop.id),
|
||||
('shopify_identifier', '=', identifier),
|
||||
]),
|
||||
])
|
||||
if records:
|
||||
record, = records
|
||||
return record
|
||||
|
||||
def is_shopify_to_update(self, web_shop, **extra):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
return (record.to_update
|
||||
or (record.to_update_extra or {}) != extra)
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifiers')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
Identifier.delete(sum((r.shopify_identifiers for r in records), ()))
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
return sum((list(r.shopify_identifiers) for r in records), [])
|
||||
|
||||
|
||||
def setattr_changed(record, name, value):
|
||||
if getattr(record, name, None) != value:
|
||||
setattr(record, name, value)
|
||||
@@ -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
|
||||
@@ -0,0 +1,17 @@
|
||||
*************
|
||||
Configuration
|
||||
*************
|
||||
|
||||
The *Web Shop Shopify Module* uses values from settings in the
|
||||
``[web_shop_shopify]`` section of the :doc:`configuration file
|
||||
<trytond:topics/configuration>`.
|
||||
|
||||
.. _config-web_shop_shopify.locations_cache:
|
||||
|
||||
``locations_cache``
|
||||
====================
|
||||
|
||||
The ``locations_cache`` defines the duration in seconds the Shopify locations
|
||||
are kept in the cache.
|
||||
|
||||
The default value is: ``900`` (15 minutes)
|
||||
@@ -0,0 +1,57 @@
|
||||
******
|
||||
Design
|
||||
******
|
||||
|
||||
The *Web Shop Shopify Module* introduces some new concepts.
|
||||
|
||||
.. _model-web.shop.shopify_identifier:
|
||||
|
||||
Shopify Identifier
|
||||
==================
|
||||
|
||||
A *Shopify Identifier* stores the Shopify ID for records from other models for
|
||||
each different :doc:`Web Shop <web_shop:index>`.
|
||||
|
||||
.. seealso::
|
||||
|
||||
Identifiers are found by opening the main menu item:
|
||||
|
||||
|Administration --> Models --> Shopify Identifiers|__
|
||||
|
||||
.. |Administration --> Models --> Shopify Identifiers| replace:: :menuselection:`Administration --> Models --> Shopify Identifiers`
|
||||
__ https://demo.tryton.org/model/web.shop.shopify_identifier
|
||||
|
||||
.. _model-web.shop.shopify_payment_journal:
|
||||
|
||||
Shopify Payment Journal
|
||||
=======================
|
||||
|
||||
The *Shopify Payment Journal* stores the rules which are used to determine on
|
||||
which :doc:`Payment Journal <account_payment:index>` the transactions are
|
||||
entered.
|
||||
|
||||
.. _model-stock.shipment.shopify_identifier:
|
||||
|
||||
Shopify Shipment Identifier
|
||||
===========================
|
||||
|
||||
The *Shopify Shipment Identifier* concept stores the Shopify ID for the shipments
|
||||
for each `Sale <sale:model-sale.sale>`.
|
||||
|
||||
.. seealso::
|
||||
|
||||
Identifiers are found by opening the main menu item:
|
||||
|
||||
|Administration --> Models --> Shopify Identifiers --> Shipment Identifiers|__
|
||||
|
||||
.. |Administration --> Models --> Shopify Identifiers --> Shipment Identifiers| replace:: :menuselection:`Administration --> Models --> Shopify Identifiers --> Shipment Identifiers`
|
||||
__ https://demo.tryton.org/model/stock.shipment.shopify_identifier
|
||||
|
||||
|
||||
.. _model-web.shop.shopify_inventory_item:
|
||||
|
||||
Shopify Inventory Item
|
||||
======================
|
||||
|
||||
The *Shopify Inventory Item* concept manages the Shopify inventory item of each
|
||||
`Varient <product:model-product.product>`.
|
||||
@@ -0,0 +1,16 @@
|
||||
#######################
|
||||
Web Shop Shopify Module
|
||||
#######################
|
||||
|
||||
The *Web Shop Shopify Module* provides a way to manage `Shopify
|
||||
<https://www.shopify.com/>`_ stores.
|
||||
It uploads products, variants and collections to Shopify, and downloads orders,
|
||||
transactions and creates fulfilments.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
usage
|
||||
configuration
|
||||
design
|
||||
releases
|
||||
@@ -0,0 +1,7 @@
|
||||
.. _releases-index:
|
||||
|
||||
=============
|
||||
Release notes
|
||||
=============
|
||||
|
||||
.. include:: ../CHANGELOG
|
||||
@@ -0,0 +1,43 @@
|
||||
*****
|
||||
Usage
|
||||
*****
|
||||
|
||||
.. _Configure Shopify Web Shop:
|
||||
|
||||
Configure Shopify Web Shop
|
||||
==========================
|
||||
|
||||
First you must create a new `custom app
|
||||
<https://help.shopify.com/en/manual/apps/app-types#custom-apps>`_ for your
|
||||
Shopify store with, as a minimum, the following permissions:
|
||||
|
||||
* Fulfillment services: Read and write
|
||||
|
||||
* Inventory: Read and write
|
||||
|
||||
* Orders: Read and write
|
||||
|
||||
* Product listings: Read and write
|
||||
|
||||
* Products: Read and write
|
||||
|
||||
* Assigned fulfillment: Read and write
|
||||
|
||||
* Merchant-managed fulfillment orders: Read and write
|
||||
|
||||
You also need to copy the password that is generated.
|
||||
|
||||
When setting the :doc:`Web Shop <web_shop:index>`'s type to "Shopify", you
|
||||
must fill in the "Shop URL" (e.g. ``https://<store-name>.myshopify.com``) and
|
||||
the "Password" with the copied one.
|
||||
|
||||
.. note::
|
||||
|
||||
At least one `Payment Journal <model-web.shop.shopify_payment_journal>` is
|
||||
needed to book the transactions.
|
||||
|
||||
Different scheduled tasks are responsible for uploading products and
|
||||
inventories and fetching and updating orders as `Sales <sale:model-sale.sale>`.
|
||||
|
||||
You can also register a `webhook <https://shopify.dev/apps/webhooks>`_ for each
|
||||
order event to get updates when they happen.
|
||||
@@ -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 ShopifyError(UserError):
|
||||
pass
|
||||
@@ -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
|
||||
|
||||
|
||||
class Cron(metaclass=PoolMeta):
|
||||
__name__ = 'ir.cron'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.method.selection.extend([
|
||||
('web.shop|shopify_update_product', "Update Shopify Products"),
|
||||
('web.shop|shopify_update_inventory',
|
||||
"Update Shopify Inventory"),
|
||||
('web.shop|shopify_fetch_order', "Fetch Shopify Orders"),
|
||||
('web.shop|shopify_update_order', "Update Shopify Orders"),
|
||||
])
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data noupdate="1">
|
||||
<record model="ir.cron" id="cron_update_product">
|
||||
<field name="method">web.shop|shopify_update_product</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_update_inventory">
|
||||
<field name="method">web.shop|shopify_update_inventory</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">hours</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_fetch_order">
|
||||
<field name="method">web.shop|shopify_fetch_order</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_update_order">
|
||||
<field name="method">web.shop|shopify_update_order</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,326 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Opció 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Opció 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Opció 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Producte"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajust d'impostos de Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Venda"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Albarà"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Token d'accés"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Diaris de pagament"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la tenda"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versió"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magatzems"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "URL Webhook comandes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secret compartit del webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID de Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Només zona d'emmagatzematge"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registre"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "A actualitzar"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "A actualitzar extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Tenda web"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Pasarel·la"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Diari"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Tenda"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "L'URL que ha de cridar Shopify per als esdeveniments de la comanda."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Marcar per utilitzar només la quantitat de la zona d'emmagatzematge."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"El nom de la passarel·la de pagament per a la qual s’ha d’utilitzar el "
|
||||
"diari."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadors d'albarà"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la col·lecció personalitzada \"%(category)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el compliment de la venda \"%(sale)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"No s'ha pogut trobar una orde de copliment per la quantitat \"%(quantity)s\""
|
||||
" del moviment \"%(move)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Una transacció de Shopify només es pot importar com a pagament una vegada."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"El registre no pot tenir més d’un identificador de Shopify per tenda web."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Una comanda de Shopify només es pot importar com a venda una vegada."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr "L’albarà no pot tenir més d’un identificador de Shopify per venda."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar l'article d'inventari del producte \"%(product)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Cada ubicació de Shopify només es pot enllaçar a un magatzem."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Per canviar la plantilla del producte \"%(product)s\" l'heu de despublicar "
|
||||
"de les botigues web de Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el producte \"%(template)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la imatge \"%(image)s\" per al producte \"%(template)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
"Per actualitzar el producte \"%(product)s\" a Shopify, heu d'utilitzar una "
|
||||
"UdM sense dígits."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el reemborsament per la venda \"%(sale)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Per processar la venda \"%(sale)s\", heu d'establir un producte a la línia "
|
||||
"\"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Per actualitzar els productes de la tenda \"%(shop)s\", heu d'establir la "
|
||||
"moneda a \"%(shopify_currency)s\" en lloc de \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Per actualitzar els productes de la botiga \"%(shop)s\", heu d'establir "
|
||||
"l'idioma a \"%(shopify_primary_locale)s\" en lloc de \"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la variant \"%(product)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Marca per actualitzar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadors d'albarà"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Article d’inventari de Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identificador d'albarà de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Diari de pagament de Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Obtenir comandes de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Actualitzar l'inventari de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Actualitzar l'inventari de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Actualitzar els productes de Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Albarà de client"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Opcions de Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,333 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Option 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Option 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Option 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "Shopify Maßeinheit"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Artikel"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "Shopify Maßeinheit"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Shopify Steuerkorrektur"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Verkauf"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Lieferung"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Zugangstoken"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Zahlungsjournale"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "Shop URL"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Logistikstandorte"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Endpoint Webhook Bestellung"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Shared Secret Webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "Shopfiy ID"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Nur Lagerzone"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Datensatz"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "Aktualisierung erforderlich"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Aktualisierung erforderlich Extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Webshop"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Gateway"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Webshop"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
"Die URL die von Shopify bei Auftragsereignissen aufgerufen werden soll."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Aktivieren, um nur den Bestand aus der Lagerzone zu verwenden."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"Der Name des Zahlungsanbieters für den das Journal verwendet werden muss."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopfiy Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Lieferungsidentifkatoren"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der benutzerdefinierten Zusammenstellung \"%(category)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Auftragsabwicklung für den Verkauf \"%(sale)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"Fulfillment-Auftrag für %(quantity)s der Warenbewegung \"%(move)s\" konnte "
|
||||
"nicht gefunden werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Eine Shopify Transaktion kann nur einmal als Zahlung importiert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"Es kann für den Datensatz jeweils nur ein Shopify Identifikator pro Webshop "
|
||||
"vergeben werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Ein Shopify Auftrag kann nur einmal als Verkauf importiert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"Für die Lieferung kann jeweils nur einen Shopify Identifikator pro Webshop "
|
||||
"vergeben werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Lagerinformationen für den Artikel \"%(product)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
"Ein Shopify Lagerort kann jeweils nur einem Logistikstandort zugeordnet "
|
||||
"werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Um die Vorlage des Artikels \"%(product)s\" bearbeiten zu können, muss "
|
||||
"zuerst die Veröffentlichung im Shopfiy Webshop zurückgenommen werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern des Artikels \"%(template)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern des Bildes \"%(image)s\" für Artikel \"%(template)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
"Damit der Artikel \"%(product)s\" auf Shopify aktualisiert werden kann, muss"
|
||||
" eine Maßeinheit ohne Nachkommastellen verwendet werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Erstattung für den Verkauf \"%(sale)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Damit der Verkauf \"%(sale)s\" ausgeführt werden kann, muss ein Artikel auf "
|
||||
"Position \"%(line)s\" erfasst werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Damit die Artikel im Webshop \"%(shop)s\" aktualisiert werden können, muss "
|
||||
"die Währung von \"%(shop_currency)s\" auf \"%(shopify_currency)s\" geändert "
|
||||
"werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Damit die Artikel für den Webshop \"%(shop)s\" aktualisiert werden können, "
|
||||
"muss die Sprache von \"%(shop_language)s\" auf "
|
||||
"\"%(shopify_primary_locale)s\" geändert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify Identifikator"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Variante \"%(product)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Zur Aktualisierung markieren"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Lieferungsidentifikatoren"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Shopify Lagerinformationen"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Shopify Lieferungsidentifikator"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify Identifikator"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Shopify Zahlungsjournal"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Shopify Aufträge abrufen"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Shopify Lagerinformationen aktualisieren"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Shopify Aufträge aktualisieren"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Shopify Artikel aktualisieren"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Kundenlieferung"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Shopify Optionen"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
@@ -0,0 +1,326 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Opción 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Opción 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Opción 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Producto"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajuste de impuestos de Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Venta"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Albarán"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Token de acceso"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Diarios de pagos"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la tienda"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versión"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Almacenes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "URL Webhook Ordenes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secreto compartido del webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID de Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Solo zona de almacenamiento"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registro"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "A actualizar"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "A actualizar extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Tienda web"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Pasarela"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Diario"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Tienda"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "La URL que será llamada por Shopify para eventos de pedidos."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Marcar para usar solo la cantidad de la zona de almacenamiento."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"El nombre de la pasarela de pago para la que se debe utilizar el diario."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadores de albarán"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la colección personalizada \"%(category)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el cumplimiento para la venta \"%(sale)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"No se ha podido encontrar una orden de cumplimiento para la cantidad "
|
||||
"%(quantity)s del movimiento \"%(move)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr "Una transacción de Shopify solo se puede importar como pago una vez."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"El registro no puede tener más de un identificador de Shopify por tienda "
|
||||
"web."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Un pedido de Shopify solo se puede importar como venta una vez."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"El albarán no puede tener más de un identificador de Shopify por venta."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el artículo de inventario para el producto \"%(product)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Cada ubicación de Shopify solo se puede vincular a un almacén."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Para cambiar la plantilla del producto \"%(product)s\" debes anular su "
|
||||
"publicación de las tiendas web de Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el producto \"%(template)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la imagen \"%(image)s\" para el producto \"%(template)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
"Para actualizar el producto \"%(product)s\" en Shopify, debe usar una UdM "
|
||||
"sin dígitos."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el reembolso de la venta \"%(sale)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Para procesar la venta \"%(sale)s\" debe establecer un producto en la línea "
|
||||
"\"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Para actualizar los productos de la tienda \"%(shop)s\", debe establecer la "
|
||||
"moneda en \"%(shopify_currency)s\" en lugar de \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Para actualizar los productos de la tienda \"%(shop)s\", debe establecer el "
|
||||
"idioma en \"%(shopify_primary_locale)s\" en lugar de \"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la variante \"%(product)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Marcar para actualizar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadores de albarán"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Artículo de inventario de Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identificador de albarán de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Diario de pago de Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Obtener pedidos de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Actualizar el inventario de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Actualizar pedidos de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Actualizar productos de Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Albarán de cliente"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Opciones de Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,333 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Option 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Option 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Option 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "UGS"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Produit"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajustement de tax Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Vente"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Expédition"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Jeton d'accès"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Journaux de paiement"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la boutique"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Entrepôts"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Point de terminaison du webhook de commande"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secret partagé du webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Zone de magasin uniquement"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Enregistrement"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "À mettre à jour"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Supplément à mettre à jour"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Boutique en ligne"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Passerelle"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Boutique"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "L'URL à appeler par Shopify pour les événements de commande."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_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:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"Le nom de la passerelle de paiement pour laquelle le journal doit être "
|
||||
"utilisé."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identifiants d'expédition"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de la collection personnalisée « %(category)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du traitement pour la vente « %(sale)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"Impossible de trouver la commande d'exécution pour %(quantity)s du mouvement"
|
||||
" « %(move)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Une transaction Shopify ne peut être importée qu'une seule fois en tant que "
|
||||
"paiement."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"L'enregistrement ne peut pas avoir plus d'un identifiant Shopify par "
|
||||
"boutique en ligne."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
"Une commande Shopify ne peut être importée qu'une seule fois en tant que "
|
||||
"vente."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"L'expédition ne peut pas avoir plus d'un identifiant Shopify par vente."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de l'article d'inventaire pour le produit « %(product)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Chaque emplacement Shopify ne peut être lié qu'à un seul entrepôt."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Pour modifier le modèle du produit « %(product)s », vous devez le dé-publier"
|
||||
" des boutiques en ligne Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du produit « %(template)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de l'image « %(image)s » pour le produit « %(template)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
"Pour mettre à jour le produit « %(product)s » sur Shopify, vous devez "
|
||||
"utiliser une UdM sans décimales."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du remboursement pour la vente « %(sale)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Pour traiter la vente « %(sale)s » vous devez définir un produit sur la "
|
||||
"ligne « %(line)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Pour mettre à jour les produits de la boutique « %(shop)s », vous devez "
|
||||
"mettre la devise à « %(shopify_currency)s » au lieu de "
|
||||
"« %(shop_currency)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Pour mettre à jour les produits de la boutique « %(shop)s », vous devez "
|
||||
"mettre la langue à « %(shopify_primary_locale)s » au lieu de "
|
||||
"« %(shop_language)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identifiant Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du la variante « %(product)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Définir à mettre à jour"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identifiants d'expédition"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Article d'inventaire Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identifiant d'expédition Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identifiant Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Journal de paiement Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Récupérer les commandes Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Mettre à jour l'inventaire Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Mettre à jour les commandes Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Mettre à jour les produits Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Expédition cliente"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Options Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Produk"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versi"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Jurnal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Toko"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magazzini"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,325 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Optie 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Optie 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Optie 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "Shopify maateenheid"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Product"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr "Shopify maateenheid"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Shopify Belastingaanpassing"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Verkoop"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Levering"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Toegangssleutel"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Betalingsdagboeken"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "Winkel-URL"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versie"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magazijnen"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Webhook order eindpunt"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Webhook gedeeld geheim"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Enige opslagzone"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Record"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "Bijwerken"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Extra bijwerken"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Webwinkel"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "poort"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Dagboek"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Winkel"
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "De url die aangeroepen wordt door Shopify voor order gebeurtenissen."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Vink aan om alleen de hoeveelheid van de opslagzone te gebruiken."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"De naam van de betalingsgateway waarvoor het journaal moet worden gebruikt."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Zendings-ID's"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de gepersonaliseerde compilatie \"%(category)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Kan uitvoering voor verkoop \"%(sale)s\" niet opslaan met fout:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr "Kan opdracht voor %(quantity)s van boeking \"%(move)s\" niet vinden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Een shopify-transactie kan slechts één keer als betaling worden "
|
||||
"geïmporteerd."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr "Het record kan niet meer dan één Shopify-ID per webshop bevatten."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
"Een Shopify-bestelling kan slechts één keer als verkoop worden geïmporteerd."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr "De zending mag niet meer dan één Shopify-ID per verkoop hebben."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de voorraadinformatie voor het artikel \"%(product)s\"\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Elke Shopify-locatie kan slechts aan één magazijn worden gekoppeld."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Om het sjabloon van het artikel \"%(product)\" te kunnen bewerken, moet de "
|
||||
"publicatie in de Shopfiy webshop eerst worden ingetrokken."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van het artikel \"%(template)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de afbeelding \"%(image)s\" voor artikel \"%(template)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
"Om product \"%(product)s\" op Shopify bij te werken, moet je een maateenheid"
|
||||
" zonder cijfers gebruiken."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van het tegoed voor de verkoop \"%(sale)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Om de verkoop \"%(sale)s\" te verwerken, moet u een product instellen op de "
|
||||
"regel \"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Om producten in de winkel \"%(shop)s\" bij te werken, moet u de valuta "
|
||||
"instellen op \"%(shopify_currency)s\" in plaats van \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Om producten in de winkel \"%(shop)s\" bij te werken, moet u de taal "
|
||||
"instellen op \"%(shopify_primary_locale)s\" in plaats van "
|
||||
"\"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Kan variant \"%(product)s\" niet opslaan met fout:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Instellen om te updaten"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Zendings-ID's"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Shopify-voorraaditem"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Shopify Verzend-ID"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Shopify-betalingsdagboek"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Shopify-bestellingen ophalen"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Shopify-inventaris bijwerken"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Shopify-bestellingen bijwerken"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Update Shopify-producten"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Klant zending"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Shopify-opties"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,296 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UOM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an UOM without "
|
||||
"digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data grouped="1">
|
||||
<record model="ir.message" id="msg_shopify_identifier">
|
||||
<field name="text">Shopify Identifier</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_record_web_shop_unique">
|
||||
<field name="text">The record cannot have more than one Shopify identifier per web shop.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_location_id_unique">
|
||||
<field name="text">Each Shopify location can only be linked to one warehouse.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shopify_identifiers">
|
||||
<field name="text">Shopify Identifiers</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_sale_web_shop_unique">
|
||||
<field name="text">A Shopify order can only be imported as a sale once.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shop_currency_different">
|
||||
<field name="text">To update products on the shop "%(shop)s", you must set the currency to "%(shopify_currency)s" instead of "%(shop_currency)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shop_locale_different">
|
||||
<field name="text">To update products on the shop "%(shop)s", you must set the language to "%(shopify_primary_locale)s" instead of "%(shop_language)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_shopify_uom_digits">
|
||||
<field name="text">To update product "%(product)s" on Shopify, you must use an UOM without digits.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_change_template">
|
||||
<field name="text">To change the template of product "%(product)s" you must unpublish it from the Shopify web shops.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_custom_collection_fail">
|
||||
<field name="text">Failed to save custom collection "%(category)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_fail">
|
||||
<field name="text">Failed to save product "%(template)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_image_fail">
|
||||
<field name="text">Failed to save image "%(image)s" for product "%(template)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_variant_fail">
|
||||
<field name="text">Failed to save variant "%(product)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_inventory_item_fail">
|
||||
<field name="text">Failed to save inventory item for product "%(product)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_fulfillment_fail">
|
||||
<field name="text">Failed to save fulfillment for sale "%(sale)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_refund_fail">
|
||||
<field name="text">Failed to save refund for sale "%(sale)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_payment_unique">
|
||||
<field name="text">A shopify transaction can only be imported as payment once.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_shipment_sale_unique">
|
||||
<field name="text">The shipment can not have more than one Shopify identifier per sale.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_sale_line_without_product">
|
||||
<field name="text">To process the sale "%(sale)s" you must set a product on the line "%(line)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_fulfillment_order_line_not_found">
|
||||
<field name="text">Failed to find fulfillment order for %(quantity)s of move "%(move)s".</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -0,0 +1,113 @@
|
||||
# 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 remove_forbidden_chars
|
||||
|
||||
from .common import IdentifiersMixin, setattr_changed
|
||||
|
||||
|
||||
class Party(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'party.party'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, customer):
|
||||
pool = Pool()
|
||||
ContactMechanism = pool.get('party.contact_mechanism')
|
||||
party = cls.search_shopify_identifier(shop, customer.id)
|
||||
if not party:
|
||||
party = cls()
|
||||
setattr_changed(party, 'name', remove_forbidden_chars(
|
||||
' '.join(filter(None, [
|
||||
customer.first_name, customer.last_name]))))
|
||||
contact_mechanisms = list(getattr(party, 'contact_mechanisms', []))
|
||||
for types, value in [
|
||||
(['email'], customer.email),
|
||||
(['phone', 'mobile'], customer.phone),
|
||||
]:
|
||||
value = remove_forbidden_chars(value)
|
||||
if not value:
|
||||
continue
|
||||
for contact_mechanism in contact_mechanisms:
|
||||
if (contact_mechanism.type in types
|
||||
and contact_mechanism.value == value):
|
||||
break
|
||||
else:
|
||||
contact_mechanisms.append(ContactMechanism(
|
||||
type=types[0], value=value))
|
||||
party.contact_mechanisms = contact_mechanisms
|
||||
# TODO tax_exempt
|
||||
return party
|
||||
|
||||
def get_address_from_shopify(self, shopify_address):
|
||||
pool = Pool()
|
||||
Address = pool.get('party.address')
|
||||
shopify_values = Address.get_shopify_values(shopify_address)
|
||||
for address in self.addresses:
|
||||
if address.shopify_values() == shopify_values:
|
||||
return address
|
||||
address = Address(**shopify_values)
|
||||
address.party = self
|
||||
address.save()
|
||||
return address
|
||||
|
||||
|
||||
class Address(metaclass=PoolMeta):
|
||||
__name__ = 'party.address'
|
||||
|
||||
@classmethod
|
||||
def get_shopify_values(self, address):
|
||||
pool = Pool()
|
||||
Country = pool.get('country.country')
|
||||
Subdivision = pool.get('country.subdivision')
|
||||
SubdivisionType = pool.get('party.address.subdivision_type')
|
||||
|
||||
values = {}
|
||||
values['party_name'] = remove_forbidden_chars(address.name or '')
|
||||
values['name'] = remove_forbidden_chars(address.company or '')
|
||||
values['street'] = '\n'.join(filter(None, [
|
||||
address.address1, address.address2]))
|
||||
values['city'] = remove_forbidden_chars(address.city or '')
|
||||
values['postal_code'] = address.zip or ''
|
||||
if address.country_code:
|
||||
country, = Country.search([
|
||||
('code', '=', address.country_code),
|
||||
], limit=1)
|
||||
values['country'] = country.id
|
||||
if address.province_code:
|
||||
subdivision_code = '-'.join(
|
||||
[address.country_code, address.province_code])
|
||||
subdivision_domain = [
|
||||
('country', '=', country.id),
|
||||
('code', 'like', subdivision_code + '%'),
|
||||
]
|
||||
types = SubdivisionType.get_types(country)
|
||||
if types:
|
||||
subdivision_domain.append(('type', 'in', types))
|
||||
subdivisions = Subdivision.search(subdivision_domain, limit=1)
|
||||
if subdivisions:
|
||||
subdivision, = subdivisions
|
||||
values['subdivision'] = subdivision.id
|
||||
return values
|
||||
|
||||
def shopify_values(self):
|
||||
values = {}
|
||||
values['party_name'] = self.party_name or ''
|
||||
values['name'] = self.name or ''
|
||||
values['street'] = self.street or ''
|
||||
values['city'] = self.city or ''
|
||||
values['postal_code'] = self.postal_code or ''
|
||||
if self.country:
|
||||
values['country'] = self.country.id
|
||||
if self.subdivision:
|
||||
values['subdivision'] = self.subdivision.id
|
||||
return values
|
||||
|
||||
|
||||
class Replace(metaclass=PoolMeta):
|
||||
__name__ = 'party.replace'
|
||||
|
||||
@classmethod
|
||||
def fields_to_replace(cls):
|
||||
return super().fields_to_replace() + [
|
||||
('web.shop.shopify_identifier', 'record'),
|
||||
]
|
||||
@@ -0,0 +1,622 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from decimal import Decimal
|
||||
|
||||
import pyactiveresource
|
||||
import shopify
|
||||
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import ModelSQL, ModelView, fields
|
||||
from trytond.model.exceptions import AccessError
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Bool, Eval, If
|
||||
from trytond.tools import grouped_slice, slugify
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
from .common import IdentifiersMixin, IdentifiersUpdateMixin
|
||||
|
||||
|
||||
class Category(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.category'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.add('name')
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
custom_collection = None
|
||||
if shopify_id:
|
||||
try:
|
||||
custom_collection = shopify.CustomCollection.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if custom_collection is None:
|
||||
custom_collection = shopify.CustomCollection()
|
||||
custom_collection.title = self.name[:255]
|
||||
custom_collection.published = False
|
||||
return custom_collection
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
|
||||
class TemplateCategory(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.template-product.category'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['template', 'category'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
records = super().create(vlist)
|
||||
cls.set_shopify_to_update(records)
|
||||
return records
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
cls.set_shopify_to_update(records)
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
return sum((list(r.template.shopify_identifiers) for r in records), [])
|
||||
|
||||
|
||||
class Template(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.template'
|
||||
|
||||
shopify_uom = fields.Many2One(
|
||||
'product.uom', "Shopify UOM",
|
||||
states={
|
||||
'readonly': Bool(Eval('shopify_identifiers', [-1])),
|
||||
'invisible': ~Eval('salable', False),
|
||||
},
|
||||
depends={'default_uom_category'})
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update([
|
||||
'name', 'web_shop_description', 'attribute_set',
|
||||
'customs_category', 'tariff_codes_category',
|
||||
'country_of_origin'])
|
||||
categories = cls._shopify_uom_categories()
|
||||
cls.shopify_uom.domain = [
|
||||
('category', 'in', [Eval(c, -1) for c in categories]),
|
||||
('digits', '=', 0),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def _shopify_uom_categories(cls):
|
||||
return ['default_uom_category']
|
||||
|
||||
def get_shopify_uom(self):
|
||||
return self.sale_uom
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, templates):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
products = [p for t in templates for p in t.products]
|
||||
return (super().get_shopify_identifier_to_update(templates)
|
||||
+ Product.get_shopify_identifier_to_update(products))
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
product = None
|
||||
if shopify_id:
|
||||
try:
|
||||
product = shopify.Product.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if product is None:
|
||||
product = shopify.Product()
|
||||
product.title = self.name
|
||||
product.body_html = self.web_shop_description
|
||||
options = []
|
||||
for attribute in self.shopify_attributes:
|
||||
options.append({'name': attribute.string})
|
||||
product.options = options[:3] or [{'name': "Title"}]
|
||||
return product
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
@property
|
||||
def shopify_attributes(self):
|
||||
if not self.attribute_set:
|
||||
return []
|
||||
return filter(None, [
|
||||
self.attribute_set.shopify_option1,
|
||||
self.attribute_set.shopify_option2,
|
||||
self.attribute_set.shopify_option3])
|
||||
|
||||
|
||||
class Template_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'product.template'
|
||||
|
||||
@classmethod
|
||||
def _shopify_uom_categories(cls):
|
||||
return super()._shopify_uom_categories() + [
|
||||
'sale_secondary_uom_category']
|
||||
|
||||
def get_shopify_uom(self):
|
||||
uom = super().get_shopify_uom()
|
||||
if self.sale_secondary_uom and not self.sale_secondary_uom.digits:
|
||||
uom = self.sale_secondary_uom
|
||||
return uom
|
||||
|
||||
|
||||
class Product(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.product'
|
||||
|
||||
shopify_sku = fields.Function(
|
||||
fields.Char("SKU"), 'get_shopify_sku', searcher='search_shopify_sku')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update([
|
||||
'code', 'weight', 'weight_uom', 'attributes'])
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
items = InventoryItem.browse(records)
|
||||
return (super().get_shopify_identifier_to_update(records)
|
||||
+ sum((list(i.shopify_identifiers) for i in items), []))
|
||||
|
||||
def set_shopify_identifier(self, web_shop, identifier=None):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
if not identifier:
|
||||
inventory_item = InventoryItem(self.id)
|
||||
inventory_item.set_shopify_identifier(web_shop)
|
||||
return super().set_shopify_identifier(web_shop, identifier=identifier)
|
||||
|
||||
def get_shopify_sku(self, name):
|
||||
return self.code
|
||||
|
||||
@classmethod
|
||||
def search_shopify_sku(cls, name, clause):
|
||||
return [('code',) + tuple(clause[1:])]
|
||||
|
||||
def get_shopify(
|
||||
self, shop, price, tax, shop_taxes_included=True,
|
||||
shop_weight_unit=None):
|
||||
pool = Pool()
|
||||
ModelData = pool.get('ir.model.data')
|
||||
Uom = pool.get('product.uom')
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
variant = None
|
||||
if shopify_id:
|
||||
try:
|
||||
variant = shopify.Variant.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if variant is None:
|
||||
variant = shopify.Variant()
|
||||
product_id = self.template.get_shopify_identifier(shop)
|
||||
if product_id is not None:
|
||||
variant.product_id = product_id
|
||||
variant.sku = self.shopify_sku
|
||||
price = self.shopify_price(
|
||||
price, tax, taxes_included=shop_taxes_included)
|
||||
if price is not None:
|
||||
variant.price = str(price.quantize(Decimal('.00')))
|
||||
else:
|
||||
variant.price = None
|
||||
variant.taxable = bool(tax)
|
||||
for identifier in self.identifiers:
|
||||
if identifier.type == 'ean':
|
||||
variant.barcode = identifier.code
|
||||
break
|
||||
for i, attribute in enumerate(self.template.shopify_attributes, 1):
|
||||
if self.attributes:
|
||||
value = self.attributes.get(attribute.name)
|
||||
else:
|
||||
value = None
|
||||
value = attribute.format(value)
|
||||
setattr(variant, 'option%i' % i, value)
|
||||
if getattr(self, 'weight', None) and shop_weight_unit:
|
||||
units = {}
|
||||
units['kg'] = ModelData.get_id('product', 'uom_kilogram')
|
||||
units['g'] = ModelData.get_id('product', 'uom_gram')
|
||||
units['lb'] = ModelData.get_id('product', 'uom_pound')
|
||||
units['oz'] = ModelData.get_id('product', 'uom_ounce')
|
||||
weight = self.weight
|
||||
weight_unit = self.weight_uom
|
||||
if self.weight_uom.id not in units.values():
|
||||
weight_unit = Uom(units[shop_weight_unit])
|
||||
weight = Uom.compute_qty(self.weight_uom, weight, weight_unit)
|
||||
variant.weight = weight
|
||||
variant.weight_unit = {
|
||||
v: k for k, v in units.items()}[weight_unit.id]
|
||||
for image in getattr(self, 'images_used', []):
|
||||
if image.web_shop:
|
||||
variant.image_id = image.get_shopify_identifier(shop)
|
||||
break
|
||||
else:
|
||||
variant.image_id = None
|
||||
return variant
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
def shopify_price(self, price, tax, taxes_included=True):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
if price is None or tax is None:
|
||||
return None
|
||||
if taxes_included:
|
||||
price += tax
|
||||
return Uom.compute_price(
|
||||
self.sale_uom, price, self.shopify_uom,
|
||||
factor=self.shopify_uom_factor, rate=self.shopify_uom_rate)
|
||||
|
||||
@property
|
||||
def shopify_uom_factor(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def shopify_uom_rate(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def shopify_quantity(self):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
quantity = self.forecast_quantity
|
||||
if quantity < 0:
|
||||
quantity = 0
|
||||
return Uom.compute_qty(
|
||||
self.default_uom, quantity, self.shopify_uom, round=True,
|
||||
factor=self.shopify_uom_factor, rate=self.shopify_uom_rate)
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
for products, values in zip(actions, actions):
|
||||
if 'template' in values:
|
||||
for product in products:
|
||||
if (product.template.id != values.get('template')
|
||||
and product.shopify_identifiers):
|
||||
raise AccessError(gettext(
|
||||
'web_shop_shopify.msg_product_change_template',
|
||||
product=product.rec_name))
|
||||
super().write(*args)
|
||||
|
||||
|
||||
class ShopifyInventoryItem(IdentifiersMixin, ModelSQL, ModelView):
|
||||
"Shopify Inventory Item"
|
||||
__name__ = 'product.shopify_inventory_item'
|
||||
|
||||
product = fields.Function(
|
||||
fields.Many2One('product.product', "Product"), 'get_product')
|
||||
|
||||
@classmethod
|
||||
def table_query(cls):
|
||||
return Pool().get('product.product').__table__()
|
||||
|
||||
def get_product(self, name):
|
||||
return self.id
|
||||
|
||||
def get_shopify(self, shop):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
Move = pool.get('stock.move')
|
||||
# TODO: replace with product_types from sale line
|
||||
move_types = Move.get_product_types()
|
||||
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
inventory_item = None
|
||||
if shopify_id:
|
||||
try:
|
||||
inventory_item = shopify.InventoryItem.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if inventory_item is None:
|
||||
product = Product(self.id)
|
||||
variant_id = product.get_shopify_identifier(shop)
|
||||
if not variant_id:
|
||||
return
|
||||
try:
|
||||
variant = shopify.Variant.find(variant_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
return
|
||||
inventory_item = shopify.InventoryItem.find(
|
||||
variant.inventory_item_id)
|
||||
inventory_item.tracked = (
|
||||
self.product.type in move_types and not self.product.consumable)
|
||||
inventory_item.requires_shipping = self.product.type in move_types
|
||||
return inventory_item
|
||||
|
||||
|
||||
class ShopifyInventoryItem_Customs(metaclass=PoolMeta):
|
||||
__name__ = 'product.shopify_inventory_item'
|
||||
|
||||
def get_shopify(self, shop):
|
||||
pool = Pool()
|
||||
Date = pool.get('ir.date')
|
||||
inventory_item = super().get_shopify(shop)
|
||||
if inventory_item:
|
||||
with Transaction().set_context(company=shop.company.id):
|
||||
today = Date.today()
|
||||
inventory_item.country_code_of_origin = (
|
||||
self.product.country_of_origin.code
|
||||
if self.product.country_of_origin else None)
|
||||
tariff_code = self.product.get_tariff_code(
|
||||
{'date': today, 'country': None})
|
||||
inventory_item.harmonized_system_code = (
|
||||
tariff_code.code if tariff_code else None)
|
||||
country_harmonized_system_codes = []
|
||||
countries = set()
|
||||
for tariff_code in self.product.get_tariff_codes({'date': today}):
|
||||
if (tariff_code.country
|
||||
and tariff_code.country not in countries):
|
||||
country_harmonized_system_codes.append({
|
||||
'harmonized_system_code': tariff_code.code,
|
||||
'country_code': tariff_code.country.code,
|
||||
})
|
||||
countries.add(tariff_code.country)
|
||||
inventory_item.country_harmonized_system_codes = (
|
||||
country_harmonized_system_codes)
|
||||
return inventory_item
|
||||
|
||||
|
||||
class Product_TariffCode(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product-customs.tariff.code'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['product', 'tariff_code'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
identifiers = super().create(vlist)
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
return identifiers
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
cls.set_shopify_to_update(records)
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
pool = Pool()
|
||||
Template = pool.get('product.template')
|
||||
Category = pool.get('product.category')
|
||||
templates = set()
|
||||
categories = set()
|
||||
for record in records:
|
||||
if isinstance(record.product, Template):
|
||||
templates.add(record.product)
|
||||
elif isinstance(record.product, Category):
|
||||
categories.add(record.product)
|
||||
if categories:
|
||||
for sub_categories in grouped_slice(list(categories)):
|
||||
templates.update(Template.search([
|
||||
('customs_category', 'in',
|
||||
[c.id for c in sub_categories]),
|
||||
]))
|
||||
templates = Template.browse(list(templates))
|
||||
return Template.get_shopify_identifier_to_update(templates)
|
||||
|
||||
|
||||
class ProductIdentifier(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.identifier'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['product', 'code'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
identifiers = super().create(vlist)
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
return identifiers
|
||||
|
||||
@classmethod
|
||||
def delete(cls, identifiers):
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
super().delete(identifiers)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, identifiers):
|
||||
return sum((
|
||||
list(i.product.shopify_identifiers) for i in identifiers), [])
|
||||
|
||||
|
||||
class Product_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'product.product'
|
||||
|
||||
@property
|
||||
def shopify_uom_factor(self):
|
||||
factor = super().shopify_uom_factor
|
||||
if (self.sale_secondary_uom
|
||||
and self.shopify_uom.category
|
||||
== self.sale_secondary_uom.category):
|
||||
factor = self.sale_secondary_uom_normal_factor
|
||||
return factor
|
||||
|
||||
@property
|
||||
def shopify_uom_rate(self):
|
||||
rate = super().shopify_uom_rate
|
||||
if (self.sale_secondary_uom
|
||||
and self.shopify_uom.category
|
||||
== self.sale_secondary_uom.category):
|
||||
rate = self.sale_secondary_uom_normal_rate
|
||||
return rate
|
||||
|
||||
|
||||
class AttributeSet(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.attribute.set'
|
||||
|
||||
shopify_option1 = fields.Many2One(
|
||||
'product.attribute', "Option 1",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option2'),
|
||||
('id', '!=', Eval('shopify_option2')),
|
||||
()),
|
||||
If(Eval('shopify_option3'),
|
||||
('id', '!=', Eval('shopify_option3')),
|
||||
()),
|
||||
])
|
||||
shopify_option2 = fields.Many2One(
|
||||
'product.attribute', "Option 2",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option1'),
|
||||
('id', '!=', Eval('shopify_option1')),
|
||||
('id', '=', None)),
|
||||
If(Eval('shopify_option3'),
|
||||
('id', '!=', Eval('shopify_option3')),
|
||||
()),
|
||||
],
|
||||
states={
|
||||
'invisible': ~Eval('shopify_option1'),
|
||||
})
|
||||
shopify_option3 = fields.Many2One(
|
||||
'product.attribute', "Option 3",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option1'),
|
||||
('id', '!=', Eval('shopify_option1')),
|
||||
()),
|
||||
If(Eval('shopify_option2'),
|
||||
('id', '!=', Eval('shopify_option2')),
|
||||
('id', '=', None)),
|
||||
],
|
||||
states={
|
||||
'invisible': ~Eval('shopify_option2'),
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(
|
||||
['shopify_option1', 'shopify_option2', 'shopify_option3'])
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, sets):
|
||||
pool = Pool()
|
||||
Template = pool.get('product.template')
|
||||
templates = []
|
||||
for sub_sets in grouped_slice(sets):
|
||||
templates.extend(Template.search([
|
||||
('attribute_set', 'in', [s.id for s in sub_sets]),
|
||||
]))
|
||||
return Template.get_shopify_identifier_to_update(templates)
|
||||
|
||||
|
||||
class Attribute(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.attribute'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.add('selection')
|
||||
domain = [
|
||||
('type', '!=', 'shopify'),
|
||||
]
|
||||
if cls.web_shops.domain:
|
||||
cls.web_shops.domain = [cls.web_shops.domain, domain]
|
||||
else:
|
||||
cls.web_shops.domain = domain
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, attributes):
|
||||
pool = Pool()
|
||||
Set = pool.get('product.attribute.set')
|
||||
sets = Set.browse(sum((a.sets for a in attributes), ()))
|
||||
return Set.get_shopify_identifier_to_update(sets)
|
||||
|
||||
|
||||
class Image(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.image'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['template', 'product', 'attributes'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
images = super().create(vlist)
|
||||
cls.set_shopify_to_update(images)
|
||||
return images
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
actions = iter(args)
|
||||
to_delete = []
|
||||
for images, values in zip(actions, actions):
|
||||
if values.keys() & {'image', 'template', 'web_shop'}:
|
||||
for image in images:
|
||||
to_delete.extend(image.shopify_identifiers)
|
||||
super().write(*args)
|
||||
Identifier.delete(to_delete)
|
||||
|
||||
@classmethod
|
||||
def delete(cls, images):
|
||||
cls.set_shopify_to_update(images)
|
||||
super().delete(images)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, images):
|
||||
return (
|
||||
sum((list(i.template.shopify_identifiers) for i in images), [])
|
||||
+ sum(
|
||||
(list(p.shopify_identifiers)
|
||||
for i in images for p in i.template.products), []))
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
product_id = self.template.get_shopify_identifier(shop)
|
||||
product_image = None
|
||||
if shopify_id and product_id:
|
||||
try:
|
||||
product_image = shopify.Image.find(
|
||||
shopify_id, product_id=product_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if product_image is None:
|
||||
product_image = shopify.Image()
|
||||
product_image.attach_image(
|
||||
self.image, filename=slugify(self.shopify_name))
|
||||
product_image.product_id = self.template.get_shopify_identifier(shop)
|
||||
product_image.alt = self.shopify_name
|
||||
return product_image
|
||||
|
||||
@property
|
||||
def shopify_name(self):
|
||||
if self.product:
|
||||
return self.product.name
|
||||
else:
|
||||
return self.template.name
|
||||
|
||||
|
||||
class Image_Attribute(metaclass=PoolMeta):
|
||||
__name__ = 'product.image'
|
||||
|
||||
@property
|
||||
def shopify_name(self):
|
||||
name = super().shopify_filename
|
||||
if self.product:
|
||||
attributes_name = self.product.attributes_name
|
||||
else:
|
||||
attributes_name = self.attributes_name
|
||||
if attributes_name:
|
||||
name += ' ' + attributes_name
|
||||
return name
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="product_template_view_form">
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit" ref="product.template_view_form"/>
|
||||
<field name="name">product_template_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="product_attribute_set_view_form">
|
||||
<field name="model">product.attribute.set</field>
|
||||
<field name="inherit" ref="product_attribute.attribute_set_view_form"/>
|
||||
<field name="name">product_attribute_set_form</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -0,0 +1,63 @@
|
||||
# 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 base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import logging
|
||||
|
||||
try:
|
||||
from http import HTTPStatus
|
||||
except ImportError:
|
||||
from http import client as HTTPStatus
|
||||
|
||||
from werkzeug.exceptions import abort
|
||||
from werkzeug.wrappers import Response
|
||||
|
||||
from trytond.protocols.wrappers import with_pool, with_transaction
|
||||
from trytond.wsgi import app
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def verify_webhook(data, hmac_header, secret):
|
||||
digest = hmac.new(secret, data, hashlib.sha256).digest()
|
||||
computed_hmac = base64.b64encode(digest)
|
||||
return hmac.compare_digest(computed_hmac, hmac_header.encode('utf-8'))
|
||||
|
||||
|
||||
@app.route(
|
||||
'/<database_name>/web_shop_shopify/webhook/<shop>/order', methods={'POST'})
|
||||
@with_pool
|
||||
@with_transaction(context={'_skip_warnings': True})
|
||||
def order(request, pool, shop):
|
||||
Sale = pool.get('sale.sale')
|
||||
Shop = pool.get('web.shop')
|
||||
shop = Shop.get(shop)
|
||||
data = request.get_data()
|
||||
verified = verify_webhook(
|
||||
data, request.headers.get('X-Shopify-Hmac-SHA256'),
|
||||
shop.shopify_webhook_shared_secret.encode('utf-8'))
|
||||
if not verified:
|
||||
abort(HTTPStatus.UNAUTHORIZED)
|
||||
|
||||
topic = request.headers.get('X-Shopify-Topic')
|
||||
order = request.get_json()
|
||||
if topic == 'orders/create':
|
||||
if not Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '=', order['id']),
|
||||
], order=[], limit=1):
|
||||
Shop.__queue__.shopify_fetch_order([shop])
|
||||
elif topic in {'orders/updated', 'orders/payment'}:
|
||||
sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '=', order['id']),
|
||||
], order=[], limit=1)
|
||||
if not sales:
|
||||
Shop.__queue__.shopify_fetch_order([shop])
|
||||
else:
|
||||
sale, = sales
|
||||
Shop.__queue__.shopify_update_sale([sale], [order])
|
||||
else:
|
||||
logger.info("Unsupported topic '%s'", topic)
|
||||
return Response(status=HTTPStatus.NO_CONTENT)
|
||||
@@ -0,0 +1,448 @@
|
||||
# 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 zip_longest
|
||||
|
||||
import dateutil
|
||||
import shopify
|
||||
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import ModelView, Unique, fields
|
||||
from trytond.modules.currency.fields import Monetary
|
||||
from trytond.modules.product import round_price
|
||||
from trytond.modules.sale.exceptions import SaleConfirmError
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
from .common import IdentifierMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
|
||||
class Sale(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'sale.sale'
|
||||
|
||||
shopify_tax_adjustment = Monetary(
|
||||
"Shopify Tax Adjustment",
|
||||
currency='currency', digits='currency', readonly=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('web_shop_shopify_identifier_unique',
|
||||
Unique(t, t.web_shop, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_sale_web_shop_unique'),
|
||||
]
|
||||
|
||||
@fields.depends('shopify_tax_adjustment')
|
||||
def get_tax_amount(self):
|
||||
amount = super().get_tax_amount()
|
||||
if self.shopify_tax_adjustment:
|
||||
amount += self.shopify_tax_adjustment
|
||||
return amount
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, order, sale=None):
|
||||
pool = Pool()
|
||||
Party = pool.get('party.party')
|
||||
Address = pool.get('party.address')
|
||||
ContactMechanism = pool.get('party.contact_mechanism')
|
||||
Currency = pool.get('currency.currency')
|
||||
Line = pool.get('sale.line')
|
||||
|
||||
if hasattr(order, 'customer'):
|
||||
party = Party.get_from_shopify(shop, order.customer)
|
||||
party.save()
|
||||
party.set_shopify_identifier(shop, order.customer.id)
|
||||
else:
|
||||
party = Party()
|
||||
party.save()
|
||||
|
||||
if not sale:
|
||||
sale = shop.get_sale(party=party)
|
||||
sale.shopify_identifier = order.id
|
||||
assert sale.shopify_identifier == order.id
|
||||
if order.location_id:
|
||||
for shop_warehouse in shop.shopify_warehouses:
|
||||
if shop_warehouse.shopify_id == str(order.location_id):
|
||||
sale.warehouse = shop_warehouse.warehouse
|
||||
break
|
||||
if sale.currency.code != order.currency:
|
||||
sale.currency, = Currency.search([
|
||||
('code', '=', order.currency),
|
||||
], limit=1)
|
||||
|
||||
if hasattr(order, 'shipping_address'):
|
||||
sale.shipment_address = party.get_address_from_shopify(
|
||||
order.shipping_address)
|
||||
if hasattr(order, 'billing_address'):
|
||||
sale.invoice_address = party.get_address_from_shopify(
|
||||
order.billing_address)
|
||||
|
||||
if not party.addresses:
|
||||
address = Address(party=party)
|
||||
address.save()
|
||||
if not sale.shipment_address:
|
||||
sale.shipment_address = address
|
||||
if not sale.invoice_address:
|
||||
sale.invoice_address = address
|
||||
|
||||
sale.reference = order.name
|
||||
sale.comment = order.note
|
||||
sale.sale_date = dateutil.parser.isoparse(
|
||||
order.processed_at or order.created_at).date()
|
||||
|
||||
if order.phone:
|
||||
for contact_mechanism in party.contact_mechanisms:
|
||||
if (contact_mechanism.type in {'phone', 'mobile'}
|
||||
and contact_mechanism.value == order.phone):
|
||||
break
|
||||
else:
|
||||
contact_mechanism = ContactMechanism(
|
||||
party=party, type='phone', value=order.phone)
|
||||
sale.contact = contact_mechanism
|
||||
|
||||
refund_line_items = defaultdict(list)
|
||||
for refund in order.refunds:
|
||||
for refund_line_item in refund.refund_line_items:
|
||||
refund_line_items[refund_line_item.line_item_id].append(
|
||||
refund_line_item)
|
||||
|
||||
id2line = {
|
||||
l.shopify_identifier: l for l in getattr(sale, 'lines', [])
|
||||
if l.shopify_identifier}
|
||||
shipping_lines = [
|
||||
l for l in getattr(sale, 'lines', []) if not
|
||||
l.shopify_identifier]
|
||||
lines = []
|
||||
for line_item in order.line_items:
|
||||
line = id2line.pop(line_item.id, None)
|
||||
quantity = line_item.quantity
|
||||
for refund_line_item in refund_line_items[line_item.id]:
|
||||
if refund_line_item.restock_type == 'cancel':
|
||||
quantity -= refund_line_item.quantity
|
||||
lines.append(Line.get_from_shopify(
|
||||
sale, line_item, quantity, line=line))
|
||||
for shipping_line, line in zip_longest(
|
||||
order.shipping_lines, shipping_lines):
|
||||
if shipping_line:
|
||||
line = Line.get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
else:
|
||||
line.quantity = 0
|
||||
lines.append(line)
|
||||
for line in id2line.values():
|
||||
line.quantity = 0
|
||||
sale.lines = lines
|
||||
return sale
|
||||
|
||||
@property
|
||||
def invoice_grouping_method(self):
|
||||
method = super().invoice_grouping_method
|
||||
if self.web_shop and self.web_shop.type == 'shopify':
|
||||
# Can not group in order to spread tax adjustment
|
||||
method = None
|
||||
return method
|
||||
|
||||
def create_invoice(self):
|
||||
pool = Pool()
|
||||
Currency = pool.get('currency.currency')
|
||||
invoice = super().create_invoice()
|
||||
if invoice and self.shopify_tax_adjustment:
|
||||
invoice.save()
|
||||
invoice.update_taxes()
|
||||
adjustment = Currency.compute(
|
||||
self.currency, self.shopify_tax_adjustment, invoice.currency,
|
||||
round=False)
|
||||
untaxed_amount = Currency.compute(
|
||||
self.currency, self.untaxed_amount, invoice.currency,
|
||||
round=False)
|
||||
remaining = invoice.currency.round(
|
||||
adjustment * (invoice.untaxed_amount / untaxed_amount))
|
||||
taxes = invoice.taxes
|
||||
for tax in taxes:
|
||||
if tax.amount:
|
||||
if invoice.tax_amount:
|
||||
ratio = tax.amount / invoice.tax_amount
|
||||
else:
|
||||
ratio = 1 / len(invoice.taxes)
|
||||
value = invoice.currency.round(adjustment * ratio)
|
||||
tax.amount += value
|
||||
remaining -= value
|
||||
if remaining:
|
||||
for tax in taxes:
|
||||
if tax.amount:
|
||||
tax.amount += remaining
|
||||
break
|
||||
invoice.taxes = taxes
|
||||
invoice.save()
|
||||
invoice.update_taxes()
|
||||
return invoice
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def process(cls, sales):
|
||||
for sale in sales:
|
||||
for line in sale.lines:
|
||||
if not line.product and line.shopify_identifier:
|
||||
raise SaleConfirmError(
|
||||
gettext('web_shop_shopify'
|
||||
'.msg_sale_line_without_product',
|
||||
sale=sale.rec_name,
|
||||
line=line.rec_name))
|
||||
super().process(sales)
|
||||
for sale in sales:
|
||||
if not sale.web_shop or not sale.shopify_identifier:
|
||||
continue
|
||||
cls.__queue__._process_shopify(sale)
|
||||
|
||||
def _process_shopify(self):
|
||||
"""Sent updates to shopify
|
||||
|
||||
The transaction is committed if fulfillment is created.
|
||||
"""
|
||||
pool = Pool()
|
||||
Payment = pool.get('account.payment')
|
||||
with self.web_shop.shopify_session():
|
||||
for shipment in self.shipments:
|
||||
fulfillment = shipment.get_shopify(self)
|
||||
if fulfillment:
|
||||
if not fulfillment.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_fulfillment_fail',
|
||||
sale=self.rec_name,
|
||||
error="\n".join(
|
||||
fulfillment.errors.full_messages())))
|
||||
shipment.set_shopify_identifier(self, fulfillment.id)
|
||||
Transaction().commit()
|
||||
|
||||
# TODO: manage drop shipment
|
||||
|
||||
if self.shipment_state == 'sent':
|
||||
# TODO: manage shopping refund
|
||||
refund = self.get_shopify_refund(shipping={
|
||||
'full_refund': False,
|
||||
})
|
||||
if refund:
|
||||
if not refund.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_refund_fail',
|
||||
sale=self.rec_name,
|
||||
error="\n".join(
|
||||
refund.errors.full_messages())))
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
Payment.get_from_shopify(self, order)
|
||||
|
||||
if self.state == 'done':
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
order.close()
|
||||
|
||||
def get_shopify_refund(self, shipping):
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
fulfillable_quantities = {
|
||||
l.id: l.fulfillable_quantity for l in order.line_items}
|
||||
refund_line_items = list(
|
||||
self.get_shopify_refund_line_items(fulfillable_quantities))
|
||||
if not refund_line_items:
|
||||
return
|
||||
|
||||
refund = shopify.Refund.calculate(
|
||||
self.shopify_identifier, shipping={
|
||||
'full_refund': False,
|
||||
},
|
||||
refund_line_items=refund_line_items)
|
||||
refund.refund_line_items = refund_line_items
|
||||
for transaction in refund.transactions:
|
||||
transaction.kind = 'refund'
|
||||
return refund
|
||||
|
||||
def get_shopify_refund_line_items(self, fulfillable_quantities):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
|
||||
assert self.shipment_state == 'sent'
|
||||
location_id = None
|
||||
for shop_warehouse in self.web_shop.shopify_warehouses:
|
||||
if shop_warehouse.warehouse == self.warehouse:
|
||||
location_id = shop_warehouse.shopify_id
|
||||
for line in self.lines:
|
||||
if (line.type != 'line'
|
||||
or not line.shopify_identifier):
|
||||
continue
|
||||
fulfillable_quantity = fulfillable_quantities.get(
|
||||
line.shopify_identifier, 0)
|
||||
quantity = line.quantity
|
||||
for move in line.moves:
|
||||
if move.state == 'done':
|
||||
quantity -= Uom.compute_qty(
|
||||
move.uom, move.quantity, line.unit)
|
||||
quantity = min(fulfillable_quantity, quantity)
|
||||
if quantity > 0:
|
||||
yield {
|
||||
'line_item_id': line.shopify_identifier,
|
||||
'quantity': int(quantity),
|
||||
'restock_type': 'cancel',
|
||||
'location_id': location_id,
|
||||
}
|
||||
|
||||
|
||||
class Sale_ShipmentCost(metaclass=PoolMeta):
|
||||
__name__ = 'sale.sale'
|
||||
|
||||
def set_shipment_cost(self):
|
||||
if self.web_shop and self.web_shop.type == 'shopify':
|
||||
return []
|
||||
return super().set_shipment_cost()
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, order, sale=None):
|
||||
pool = Pool()
|
||||
Tax = pool.get('account.tax')
|
||||
|
||||
sale = super().get_from_shopify(shop, order, sale=sale)
|
||||
|
||||
sale.shipment_cost_method = 'order'
|
||||
if order.shipping_lines:
|
||||
available_carriers = sale.on_change_with_available_carriers()
|
||||
if available_carriers:
|
||||
sale.carrier = available_carriers[0]
|
||||
if sale.carrier:
|
||||
for line in sale.lines:
|
||||
if getattr(line, 'shipment_cost', None) is not None:
|
||||
unit_price = line.unit_price
|
||||
base_price = getattr(line, 'base_price', None)
|
||||
line.product = sale.carrier.carrier_product
|
||||
line.on_change_product()
|
||||
line.unit_price = round_price(Tax.reverse_compute(
|
||||
unit_price, line.taxes, sale.sale_date))
|
||||
if base_price is not None:
|
||||
line.base_price = round_price(Tax.reverse_compute(
|
||||
base_price, line.taxes, sale.sale_date))
|
||||
return sale
|
||||
|
||||
|
||||
class Line(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, line_item, quantity, line=None):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
Tax = pool.get('account.tax')
|
||||
|
||||
if not line:
|
||||
line = cls(type='line')
|
||||
line.sale = sale
|
||||
line.shopify_identifier = line_item.id
|
||||
assert line.shopify_identifier == line_item.id
|
||||
if hasattr(line_item, 'variant_id'):
|
||||
line.product = Product.search_shopify_identifier(
|
||||
sale.web_shop, line_item.variant_id)
|
||||
else:
|
||||
line.product = None
|
||||
if line.product:
|
||||
line._set_shopify_quantity(line.product, quantity)
|
||||
line.on_change_product()
|
||||
else:
|
||||
line.quantity = quantity
|
||||
line.description = line_item.title
|
||||
line.taxes = []
|
||||
total_discount = sum(
|
||||
Decimal(d.amount) for d in line_item.discount_allocations)
|
||||
unit_price = ((
|
||||
(Decimal(line_item.price) * line_item.quantity)
|
||||
- Decimal(total_discount))
|
||||
/ line_item.quantity)
|
||||
unit_price = round_price(Tax.reverse_compute(
|
||||
unit_price, line.taxes, sale.sale_date))
|
||||
if line.product:
|
||||
line._set_shopify_unit_price(line.product, unit_price)
|
||||
else:
|
||||
line.unit_price = unit_price
|
||||
return line
|
||||
|
||||
def _set_shopify_quantity(self, product, quantity):
|
||||
if product.shopify_uom.category == product.sale_uom.category:
|
||||
self.unit = self.product.shopify_uom
|
||||
self.quantity = quantity
|
||||
|
||||
def _set_shopify_unit_price(self, product, unit_price):
|
||||
if product.shopify_uom.category == product.sale_uom.category:
|
||||
self.unit_price = unit_price
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
if not line:
|
||||
line = cls(type='line')
|
||||
line.sale = sale
|
||||
line.quantity = 1
|
||||
line.unit_price = round_price(Decimal(shipping_line.discounted_price))
|
||||
line.description = shipping_line.title
|
||||
return line
|
||||
|
||||
def _get_invoice_line_quantity(self):
|
||||
quantity = super()._get_invoice_line_quantity()
|
||||
if self.sale.web_shop and self.sale.web_shop.type == 'shopify':
|
||||
if (self.sale.get_shipment_state() != 'sent'
|
||||
and any(l.product.type != 'service'
|
||||
for l in self.sale.lines if l.product)):
|
||||
quantity = 0
|
||||
return quantity
|
||||
|
||||
|
||||
class Line_Discount(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, line_item, quantity, line=None):
|
||||
pool = Pool()
|
||||
Tax = pool.get('account.tax')
|
||||
line = super().get_from_shopify(sale, line_item, quantity, line=line)
|
||||
line.base_price = round_price(Tax.reverse_compute(
|
||||
Decimal(line_item.price), line.taxes, sale.sale_date))
|
||||
return line
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
line = super().get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
line.base_price = Decimal(shipping_line.price)
|
||||
return line
|
||||
|
||||
|
||||
class Line_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
def _set_shopify_quantity(self, product, quantity):
|
||||
super()._set_shopify_quantity(product, quantity)
|
||||
if (product.sale_secondary_uom
|
||||
and product.shopify_uom.category
|
||||
== product.sale_secondary_uom.category):
|
||||
self.unit = product.sale_uom
|
||||
self.secondary_unit = product.shopify_uom
|
||||
self.on_change_product()
|
||||
self.secondary_quantity = quantity
|
||||
self.on_change_secondary_quantity()
|
||||
|
||||
def _set_shopify_unit_price(self, product, unit_price):
|
||||
super()._set_shopify_unit_price(product, unit_price)
|
||||
if (product.sale_secondary_uom
|
||||
and product.shopify_uom.category
|
||||
== product.sale_secondary_uom.category):
|
||||
self.secondary_unit_price = unit_price
|
||||
self.on_change_secondary_unit_price()
|
||||
|
||||
|
||||
class Line_ShipmentCost(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
line = super().get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
line.shipment_cost = Decimal(shipping_line.price)
|
||||
return line
|
||||
|
||||
# TODO: refund as return sale
|
||||
Executable
+165
@@ -0,0 +1,165 @@
|
||||
#!/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_web_shop_shopify'
|
||||
|
||||
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 = ['ShopifyAPI', 'pyactiveresource', 'python-sql', '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'),
|
||||
get_require_version('trytond_account_payment_clearing'),
|
||||
get_require_version('trytond_customs'),
|
||||
get_require_version('trytond_product_measurements'),
|
||||
get_require_version('trytond_product_image'),
|
||||
get_require_version('trytond_sale_discount'),
|
||||
get_require_version('trytond_sale_shipment_cost'),
|
||||
get_require_version('trytond_sale_secondary_unit'),
|
||||
]
|
||||
dependency_links = []
|
||||
if minor_version % 2:
|
||||
dependency_links.append(
|
||||
'https://trydevpi.tryton.org/?local_version='
|
||||
+ '.'.join(local_version)
|
||||
)
|
||||
|
||||
setup(name=name,
|
||||
version=version,
|
||||
description='Module to integrate Tryton with Shopify',
|
||||
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-web-shop-shopify'),
|
||||
"Forum": 'https://www.tryton.org/forum',
|
||||
"Source Code": 'https://hg.tryton.org/modules/web_shop_shopify',
|
||||
},
|
||||
keywords='web shopify ecommerce',
|
||||
package_dir={'trytond.modules.web_shop_shopify': '.'},
|
||||
packages=(
|
||||
['trytond.modules.web_shop_shopify']
|
||||
+ ['trytond.modules.web_shop_shopify.%s' % p
|
||||
for p in find_packages()]
|
||||
),
|
||||
package_data={
|
||||
'trytond.modules.web_shop_shopify': (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]
|
||||
web_shop_shopify = trytond.modules.web_shop_shopify
|
||||
""", # noqa: E501
|
||||
)
|
||||
@@ -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.
|
||||
import time
|
||||
|
||||
try:
|
||||
from http import HTTPStatus
|
||||
except ImportError:
|
||||
from http import client as HTTPStatus
|
||||
|
||||
from pyactiveresource.connection import ClientError
|
||||
from shopify import Limits
|
||||
from shopify.base import ShopifyConnection
|
||||
|
||||
|
||||
def patch():
|
||||
def _open(*args, **kwargs):
|
||||
while True:
|
||||
try:
|
||||
return func(*args, **kwargs)
|
||||
except ClientError as e:
|
||||
if e.response.code == HTTPStatus.TOO_MANY_REQUESTS:
|
||||
retry_after = float(
|
||||
e.response.headers.get('Retry-After', 2))
|
||||
time.sleep(retry_after)
|
||||
else:
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
if Limits.credit_maxed():
|
||||
time.sleep(0.5)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if ShopifyConnection._open == _open:
|
||||
return
|
||||
func = ShopifyConnection._open
|
||||
ShopifyConnection._open = _open
|
||||
@@ -0,0 +1,172 @@
|
||||
# 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
|
||||
|
||||
import shopify
|
||||
from shopify.resources.fulfillment import FulfillmentV2
|
||||
|
||||
from trytond.i18n import gettext, lazy_gettext
|
||||
from trytond.model import ModelSQL, ModelView, Unique, fields
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
from .common import IdentifierMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
|
||||
class ShipmentOut(metaclass=PoolMeta):
|
||||
__name__ = 'stock.shipment.out'
|
||||
|
||||
shopify_identifiers = fields.One2Many(
|
||||
'stock.shipment.shopify_identifier', 'shipment',
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifiers'))
|
||||
|
||||
def get_shopify(self, sale):
|
||||
if self.state != 'done':
|
||||
return
|
||||
shopify_id = self.get_shopify_identifier(sale)
|
||||
if shopify_id:
|
||||
# Fulfillment can not be modified
|
||||
return
|
||||
else:
|
||||
fulfillment = FulfillmentV2()
|
||||
for shop_warehouse in sale.web_shop.shopify_warehouses:
|
||||
if shop_warehouse.warehouse == self.warehouse:
|
||||
location_id = int(shop_warehouse.shopify_id)
|
||||
break
|
||||
else:
|
||||
location_id = None
|
||||
fulfillment_orders = shopify.FulfillmentOrders.find(
|
||||
order_id=sale.shopify_identifier)
|
||||
line_items = defaultdict(list)
|
||||
for move in self.outgoing_moves:
|
||||
if move.sale == sale:
|
||||
for order_id, line_item in move.get_shopify(
|
||||
fulfillment_orders, location_id):
|
||||
line_items[order_id].append(line_item)
|
||||
if not line_items:
|
||||
return
|
||||
fulfillment.line_items_by_fulfillment_order = [{
|
||||
'fulfillment_order_id': order_id,
|
||||
'fulfillment_order_line_items': line_items,
|
||||
}
|
||||
for order_id, line_items in line_items.items()]
|
||||
return fulfillment
|
||||
|
||||
def get_shopify_identifier(self, sale):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.sale == sale:
|
||||
return record.shopify_identifier
|
||||
|
||||
def set_shopify_identifier(self, sale, identifier=None):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('stock.shipment.shopify_identifier')
|
||||
for record in self.shopify_identifiers:
|
||||
if record.sale == sale:
|
||||
if not identifier:
|
||||
Identifier.delete([record])
|
||||
return
|
||||
else:
|
||||
if record.shopify_identifier != identifier:
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
if identifier:
|
||||
record = Identifier(shipment=self, sale=sale)
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, sale, identifier):
|
||||
records = cls.search([
|
||||
('shopify_identifiers', 'where', [
|
||||
('sale', '=', sale.id),
|
||||
('shopify_identifier', '=', identifier),
|
||||
]),
|
||||
])
|
||||
if records:
|
||||
record, = records
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifiers')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
|
||||
class ShipmentShopifyIdentifier(IdentifierMixin, ModelSQL, ModelView):
|
||||
"Shopify Shipment Identifier"
|
||||
__name__ = 'stock.shipment.shopify_identifier'
|
||||
|
||||
shipment = fields.Reference("Shipment", [
|
||||
('stock.shipment.out', "Customer Shipment"),
|
||||
], required=True)
|
||||
sale = fields.Many2One('sale.sale', "Sale", required=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.shopify_identifier_signed.states = {
|
||||
'required': True,
|
||||
}
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shipment_sale_unique',
|
||||
Unique(t, t.shipment, t.sale, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_shipment_sale_unique'),
|
||||
]
|
||||
|
||||
|
||||
class ShipmentOut_PackageShipping(metaclass=PoolMeta):
|
||||
__name__ = 'stock.shipment.out'
|
||||
|
||||
def get_shopify(self, sale):
|
||||
fulfillment = super().get_shopify(sale)
|
||||
if fulfillment and self.packages:
|
||||
tracking_info = []
|
||||
for package in self.packages:
|
||||
tracking_info.append({
|
||||
'number': package.shipping_reference,
|
||||
'url': package.shipping_tracking_url,
|
||||
})
|
||||
fulfillment.tracking_info = tracking_info
|
||||
return fulfillment
|
||||
|
||||
|
||||
class Move(metaclass=PoolMeta):
|
||||
__name__ = 'stock.move'
|
||||
|
||||
def get_shopify(self, fulfillment_orders, location_id):
|
||||
pool = Pool()
|
||||
SaleLine = pool.get('sale.line')
|
||||
Uom = pool.get('product.uom')
|
||||
if not isinstance(self.origin, SaleLine):
|
||||
return
|
||||
identifier = self.origin.shopify_identifier
|
||||
quantity = int(Uom.compute_qty(
|
||||
self.uom, self.quantity, self.origin.unit))
|
||||
for fulfillment_order in fulfillment_orders:
|
||||
if fulfillment_order.assigned_location_id != location_id:
|
||||
continue
|
||||
for line_item in fulfillment_order.line_items:
|
||||
if line_item.line_item_id == identifier:
|
||||
qty = min(quantity, line_item.fulfillable_quantity)
|
||||
qty = quantity
|
||||
yield fulfillment_order.id, {
|
||||
'id': line_item.id,
|
||||
'quantity': qty,
|
||||
}
|
||||
quantity -= qty
|
||||
if quantity <= 0:
|
||||
return
|
||||
else:
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_fulfillment_order_line_not_found',
|
||||
quantity=quantity,
|
||||
move=self.rec_name,
|
||||
))
|
||||
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="stock_shipment_shopify_identifier_view_form">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">stock_shipment_shopify_identifier_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="stock_shipment_shopify_identifier_view_list">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">stock_shipment_shopify_identifier_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_stock_shipment_shopify_identifier_form">
|
||||
<field name="name">Shipment Identifiers</field>
|
||||
<field name="res_model">stock.shipment.shopify_identifier</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_stock_shipment_shopify_identifier_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="stock_shipment_shopify_identifier_view_list"/>
|
||||
<field name="act_window" ref="act_stock_shipment_shopify_identifier_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_stock_shipment_shopify_identifier_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="stock_shipment_shopify_identifier_view_form"/>
|
||||
<field name="act_window" ref="act_stock_shipment_shopify_identifier_form"/>
|
||||
</record>
|
||||
<menuitem
|
||||
parent="menu_shop_shopify_identifier_form"
|
||||
action="act_stock_shipment_shopify_identifier_form"
|
||||
sequence="50"
|
||||
id="menu_stock_shipment_shopify_identifier_form"/>
|
||||
|
||||
<record model="ir.model.access" id="access_stock_shipment_shopify_identifier">
|
||||
<field name="model" search="[('model', '=', 'stock.shipment.shopify_identifier')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_stock_shipment_shopify_identifier_admin">
|
||||
<field name="model" search="[('model', '=', 'stock.shipment.shopify_identifier')]"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -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.
|
||||
@@ -0,0 +1,653 @@
|
||||
=========================
|
||||
Web Shop Shopify Scenario
|
||||
=========================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> import os
|
||||
>>> import random
|
||||
>>> import string
|
||||
>>> import time
|
||||
>>> import urllib.request
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> import shopify
|
||||
>>> from shopify.api_version import ApiVersion
|
||||
|
||||
>>> 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, create_tax)
|
||||
>>> from trytond.modules.account_invoice.tests.tools import (
|
||||
... set_fiscalyear_invoice_sequences)
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules([
|
||||
... 'web_shop_shopify',
|
||||
... 'account_payment_clearing',
|
||||
... 'customs',
|
||||
... 'product_measurements',
|
||||
... 'product_image',
|
||||
... 'sale_discount',
|
||||
... 'sale_shipment_cost',
|
||||
... ])
|
||||
|
||||
>>> Account = Model.get('account.account')
|
||||
>>> Carrier = Model.get('carrier')
|
||||
>>> CarrierSelection = Model.get('carrier.selection')
|
||||
>>> Category = Model.get('product.category')
|
||||
>>> Country = Model.get('country.country')
|
||||
>>> Cron = Model.get('ir.cron')
|
||||
>>> Inventory = Model.get('stock.inventory')
|
||||
>>> Journal = Model.get('account.journal')
|
||||
>>> Location = Model.get('stock.location')
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> PaymentJournal = Model.get('account.payment.journal')
|
||||
>>> Product = Model.get('product.product')
|
||||
>>> ProductAttribute = Model.get('product.attribute')
|
||||
>>> ProductAttributeSet = Model.get('product.attribute.set')
|
||||
>>> ProductInventoryItem = Model.get('product.shopify_inventory_item')
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
>>> Sale = Model.get('sale.sale')
|
||||
>>> ShopifyIdentifier = Model.get('web.shop.shopify_identifier')
|
||||
>>> Tariff = Model.get('customs.tariff.code')
|
||||
>>> Uom = Model.get('product.uom')
|
||||
>>> WebShop = Model.get('web.shop')
|
||||
|
||||
Set metafields to product::
|
||||
|
||||
>>> from trytond.modules.web_shop_shopify.product import Template
|
||||
>>> def get_shopify_metafields(self, shop):
|
||||
... return {
|
||||
... 'global.test': {
|
||||
... 'value': self.name,
|
||||
... },
|
||||
... }
|
||||
|
||||
>>> Template.get_shopify_metafields = get_shopify_metafields
|
||||
|
||||
>>> from trytond.modules.web_shop_shopify.web import Shop
|
||||
>>> def managed_metafields(self):
|
||||
... return {'global.test'}
|
||||
|
||||
>>> Shop.managed_metafields = managed_metafields
|
||||
|
||||
Create country::
|
||||
|
||||
>>> belgium = Country(name="Belgium", code='BE')
|
||||
>>> belgium.save()
|
||||
>>> china = Country(name="China", code='CN')
|
||||
>>> china.save()
|
||||
|
||||
Create company::
|
||||
|
||||
>>> _ = create_company()
|
||||
>>> company = get_company()
|
||||
|
||||
Create chart of accounts::
|
||||
|
||||
>>> _ = create_chart(company)
|
||||
>>> accounts = get_accounts(company)
|
||||
|
||||
Create tax::
|
||||
|
||||
>>> tax = create_tax(Decimal('.10'))
|
||||
|
||||
Create fiscal year::
|
||||
|
||||
>>> fiscalyear = set_fiscalyear_invoice_sequences(
|
||||
... create_fiscalyear(company))
|
||||
>>> fiscalyear.click('create_period')
|
||||
|
||||
Create payment journal::
|
||||
|
||||
>>> shopify_account = Account(parent=accounts['receivable'].parent)
|
||||
>>> shopify_account.name = "Shopify"
|
||||
>>> shopify_account.type = accounts['receivable'].type
|
||||
>>> shopify_account.reconcile = True
|
||||
>>> shopify_account.save()
|
||||
|
||||
>>> payment_journal = PaymentJournal()
|
||||
>>> payment_journal.name = "Shopify"
|
||||
>>> payment_journal.process_method = 'shopify'
|
||||
>>> payment_journal.clearing_journal, = Journal.find([('code', '=', 'REV')])
|
||||
>>> payment_journal.clearing_account = shopify_account
|
||||
>>> payment_journal.save()
|
||||
|
||||
Define a web shop::
|
||||
|
||||
>>> web_shop = WebShop(name="Web Shop")
|
||||
>>> web_shop.type = 'shopify'
|
||||
>>> web_shop.shopify_url = os.getenv('SHOPIFY_URL')
|
||||
>>> web_shop.shopify_password = os.getenv('SHOPIFY_PASSWORD')
|
||||
>>> web_shop.shopify_version = sorted(ApiVersion.versions, reverse=True)[1]
|
||||
>>> shop_warehouse = web_shop.shopify_warehouses.new()
|
||||
>>> shop_warehouse.warehouse, = Location.find([('type', '=', 'warehouse')])
|
||||
>>> shopify_payment_journal = web_shop.shopify_payment_journals.new()
|
||||
>>> shopify_payment_journal.journal = payment_journal
|
||||
>>> web_shop.save()
|
||||
|
||||
>>> shopify.ShopifyResource.activate_session(shopify.Session(
|
||||
... web_shop.shopify_url,
|
||||
... web_shop.shopify_version,
|
||||
... web_shop.shopify_password))
|
||||
|
||||
>>> location = shopify.Location.find_first()
|
||||
|
||||
>>> shop_warehouse, = web_shop.shopify_warehouses
|
||||
>>> shop_warehouse.shopify_id = str(location.id)
|
||||
>>> web_shop.save()
|
||||
|
||||
Create categories::
|
||||
|
||||
>>> category1 = Category(name="Category 1")
|
||||
>>> category1.save()
|
||||
>>> sub_category = Category(name="Sub Category", parent=category1)
|
||||
>>> sub_category.save()
|
||||
>>> category2 = Category(name="Category 2")
|
||||
>>> category2.save()
|
||||
|
||||
>>> account_category = Category(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_expense = accounts['expense']
|
||||
>>> account_category.account_revenue = accounts['revenue']
|
||||
>>> account_category.customer_taxes.append(tax)
|
||||
>>> account_category.save()
|
||||
|
||||
>>> account_category_shipping = Category(name="Account Category Shipping")
|
||||
>>> account_category_shipping.accounting = True
|
||||
>>> account_category_shipping.account_expense = accounts['expense']
|
||||
>>> account_category_shipping.account_revenue = accounts['revenue']
|
||||
>>> account_category_shipping.save()
|
||||
|
||||
Create attribute set::
|
||||
|
||||
>>> attribute_set = ProductAttributeSet(name="Attributes")
|
||||
>>> attribute = attribute_set.attributes.new()
|
||||
>>> attribute.name = 'color'
|
||||
>>> attribute.string = "Color"
|
||||
>>> attribute.type_ = 'selection'
|
||||
>>> attribute.selection = "blue:Blue\nred:Red"
|
||||
>>> attribute_set.save()
|
||||
>>> attribute = attribute_set.attributes.new()
|
||||
>>> attribute.name = 'check'
|
||||
>>> attribute.string = "Check"
|
||||
>>> attribute.type_ = 'boolean'
|
||||
>>> attribute_set.save()
|
||||
>>> attribute1, attribute2 = attribute_set.attributes
|
||||
>>> attribute_set.shopify_option1 = attribute1
|
||||
>>> attribute_set.shopify_option2 = attribute2
|
||||
>>> attribute_set.save()
|
||||
|
||||
Create tariff codes::
|
||||
|
||||
>>> tariff1 = Tariff(code='170390')
|
||||
>>> tariff1.save()
|
||||
>>> tariff2 = Tariff(code='17039099', country=belgium)
|
||||
>>> tariff2.save()
|
||||
|
||||
Create products::
|
||||
|
||||
>>> unit, = Uom.find([('name', '=', "Unit")])
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 1"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'goods'
|
||||
>>> template.salable = True
|
||||
>>> template.web_shop_description = "<p>Product description</p>"
|
||||
>>> template.list_price = round(Decimal('9.99') / (1 + tax.rate), 4)
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(sub_category.id))
|
||||
>>> template.country_of_origin = china
|
||||
>>> _ = template.tariff_codes.new(tariff_code=tariff1)
|
||||
>>> _ = template.tariff_codes.new(tariff_code=tariff2)
|
||||
>>> template.weight = 10
|
||||
>>> template.weight_uom, = Uom.find([('name', '=', "Carat")])
|
||||
>>> template.save()
|
||||
>>> product1, = template.products
|
||||
>>> product1.suffix_code = 'PROD1'
|
||||
>>> product1.save()
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 2"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'service'
|
||||
>>> template.salable = True
|
||||
>>> template.list_price = round(Decimal('20') / (1 + tax.rate), 4)
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(category2.id))
|
||||
>>> template.save()
|
||||
>>> product2, = template.products
|
||||
>>> product2.suffix_code = 'PROD2'
|
||||
>>> product2.save()
|
||||
|
||||
>>> variant = ProductTemplate()
|
||||
>>> variant.name = "Variant"
|
||||
>>> variant.code = "VAR"
|
||||
>>> variant.default_uom = unit
|
||||
>>> variant.type = 'goods'
|
||||
>>> variant.salable = True
|
||||
>>> variant.list_price = round(Decimal('50') / (1 + tax.rate), 4)
|
||||
>>> variant.attribute_set = attribute_set
|
||||
>>> variant.account_category = account_category
|
||||
>>> variant.categories.append(Category(category1.id))
|
||||
>>> variant.categories.append(Category(category2.id))
|
||||
>>> image = variant.images.new(web_shop=True)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant1, = variant.products
|
||||
>>> variant1.suffix_code = "1"
|
||||
>>> variant1.attributes = {
|
||||
... 'color': 'blue',
|
||||
... 'check': True,
|
||||
... }
|
||||
>>> variant2 = variant.products.new()
|
||||
>>> variant2.suffix_code = "2"
|
||||
>>> variant2.attributes = {
|
||||
... 'color': 'red',
|
||||
... 'check': False,
|
||||
... }
|
||||
>>> variant.save()
|
||||
>>> variant1, variant2 = variant.products
|
||||
|
||||
>>> image = variant1.images.new(web_shop=True, template=variant)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant1.save()
|
||||
|
||||
>>> image = variant2.images.new(web_shop=True, template=variant)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant2.save()
|
||||
|
||||
Create carrier::
|
||||
|
||||
>>> carrier_template = ProductTemplate()
|
||||
>>> carrier_template.name = 'Carrier Product'
|
||||
>>> carrier_template.default_uom = unit
|
||||
>>> carrier_template.type = 'service'
|
||||
>>> carrier_template.salable = True
|
||||
>>> carrier_template.list_price = Decimal('3')
|
||||
>>> carrier_template.account_category = account_category_shipping
|
||||
>>> carrier_template.save()
|
||||
>>> carrier_product, = carrier_template.products
|
||||
>>> carrier_product.cost_price = Decimal('2')
|
||||
>>> carrier_product.save()
|
||||
|
||||
>>> carrier = Carrier()
|
||||
>>> party = Party(name='Carrier')
|
||||
>>> party.save()
|
||||
>>> carrier.party = party
|
||||
>>> carrier.carrier_product = carrier_product
|
||||
>>> carrier.save()
|
||||
|
||||
Fill warehouse::
|
||||
|
||||
>>> inventory = Inventory()
|
||||
>>> inventory.location, = Location.find([('code', '=', 'STO')])
|
||||
>>> line = inventory.lines.new()
|
||||
>>> line.product = product1
|
||||
>>> line.quantity = 10
|
||||
>>> line = inventory.lines.new()
|
||||
>>> line.product = variant1
|
||||
>>> line.quantity = 5
|
||||
>>> inventory.click('confirm')
|
||||
>>> inventory.state
|
||||
'done'
|
||||
|
||||
Set categories, products and attributes to web shop::
|
||||
|
||||
>>> web_shop.categories.extend([
|
||||
... Category(category1.id),
|
||||
... Category(sub_category.id),
|
||||
... Category(category2.id)])
|
||||
>>> web_shop.products.extend([
|
||||
... Product(product1.id),
|
||||
... Product(product2.id),
|
||||
... Product(variant1.id),
|
||||
... Product(variant2.id)])
|
||||
>>> web_shop.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
>>> category1.reload()
|
||||
>>> len(category1.shopify_identifiers)
|
||||
1
|
||||
>>> category2.reload()
|
||||
>>> len(category2.shopify_identifiers)
|
||||
1
|
||||
|
||||
>>> product1.reload()
|
||||
>>> len(product1.shopify_identifiers)
|
||||
1
|
||||
>>> len(product1.template.shopify_identifiers)
|
||||
1
|
||||
>>> product2.reload()
|
||||
>>> len(product2.shopify_identifiers)
|
||||
1
|
||||
>>> len(product2.template.shopify_identifiers)
|
||||
1
|
||||
>>> variant1.reload()
|
||||
>>> len(variant1.shopify_identifiers)
|
||||
1
|
||||
>>> variant2.reload()
|
||||
>>> len(variant2.shopify_identifiers)
|
||||
1
|
||||
>>> variant.reload()
|
||||
>>> len(variant.shopify_identifiers)
|
||||
1
|
||||
>>> all(i.shopify_identifiers for i in variant.images)
|
||||
True
|
||||
|
||||
Run update inventory::
|
||||
|
||||
>>> cron_update_inventory, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_inventory'),
|
||||
... ])
|
||||
>>> cron_update_inventory.click('run_once')
|
||||
|
||||
Check inventory item::
|
||||
|
||||
>>> inventory_items = ProductInventoryItem.find([])
|
||||
>>> inventory_item_ids = [i.shopify_identifier
|
||||
... for inv in inventory_items for i in inv.shopify_identifiers]
|
||||
>>> inventory_levels = location.inventory_levels()
|
||||
>>> sorted(l.available for l in inventory_levels
|
||||
... if l.available and l.inventory_item_id in inventory_item_ids)
|
||||
[5, 10]
|
||||
|
||||
Remove a category, a product and an image::
|
||||
|
||||
>>> _ = web_shop.categories.pop(web_shop.categories.index(category2))
|
||||
>>> _ = web_shop.products.pop(web_shop.products.index(product2))
|
||||
>>> web_shop.save()
|
||||
>>> variant2.images.remove(variant2.images[0])
|
||||
>>> variant2.save()
|
||||
|
||||
Rename a category::
|
||||
|
||||
>>> sub_category.name = "Sub-category"
|
||||
>>> sub_category.save()
|
||||
>>> identifier, = sub_category.shopify_identifiers
|
||||
>>> bool(identifier.to_update)
|
||||
True
|
||||
|
||||
Update attribute::
|
||||
|
||||
>>> attribute, = [a for a in attribute_set.attributes if a.name == 'color']
|
||||
>>> attribute.selection += "\ngreen:Green"
|
||||
>>> attribute.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
>>> category1.reload()
|
||||
>>> len(category1.shopify_identifiers)
|
||||
1
|
||||
>>> category2.reload()
|
||||
>>> len(category2.shopify_identifiers)
|
||||
0
|
||||
|
||||
>>> sub_category.reload()
|
||||
>>> identifier, = sub_category.shopify_identifiers
|
||||
>>> bool(identifier.to_update)
|
||||
False
|
||||
|
||||
>>> product1.reload()
|
||||
>>> len(product1.shopify_identifiers)
|
||||
1
|
||||
>>> len(product1.template.shopify_identifiers)
|
||||
1
|
||||
>>> product2.reload()
|
||||
>>> len(product2.shopify_identifiers)
|
||||
0
|
||||
>>> len(product2.template.shopify_identifiers)
|
||||
0
|
||||
>>> variant1.reload()
|
||||
>>> len(variant1.shopify_identifiers)
|
||||
1
|
||||
>>> variant2.reload()
|
||||
>>> len(variant2.shopify_identifiers)
|
||||
1
|
||||
>>> variant.reload()
|
||||
>>> len(variant.shopify_identifiers)
|
||||
1
|
||||
>>> all(i.shopify_identifiers for i in variant1.images)
|
||||
True
|
||||
>>> any(i.shopify_identifiers for i in variant2.images)
|
||||
False
|
||||
|
||||
Create an order on Shopify::
|
||||
|
||||
>>> customer = shopify.Customer()
|
||||
>>> customer.last_name = "Customer"
|
||||
>>> customer.email = (
|
||||
... ''.join(random.choice(string.ascii_letters) for _ in range(10))
|
||||
... + '@example.com')
|
||||
>>> customer.addresses = [{
|
||||
... 'address1': "Street",
|
||||
... 'city': "City",
|
||||
... 'country': "Belgium",
|
||||
... }]
|
||||
>>> customer.save()
|
||||
True
|
||||
|
||||
>>> order = shopify.Order.create({
|
||||
... 'customer': customer.to_dict(),
|
||||
... 'shipping_address': customer.addresses[0].to_dict(),
|
||||
... 'billing_address': customer.addresses[0].to_dict(),
|
||||
... 'line_items': [{
|
||||
... 'variant_id': product1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 1,
|
||||
... }, {
|
||||
... 'variant_id': product1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 1,
|
||||
... }, {
|
||||
... 'variant_id': variant1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 5,
|
||||
... }],
|
||||
... 'financial_status': 'authorized',
|
||||
... 'transactions': [{
|
||||
... 'kind': 'authorization',
|
||||
... 'status': 'success',
|
||||
... 'amount': '258.98',
|
||||
... 'test': True,
|
||||
... }],
|
||||
... 'discount_codes': [{
|
||||
... 'code': 'CODE',
|
||||
... 'amount': '15',
|
||||
... 'type': 'fixed_amount',
|
||||
... }],
|
||||
... 'shipping_lines': [{
|
||||
... 'code': 'SHIP',
|
||||
... 'title': "Shipping",
|
||||
... 'price': '4.00',
|
||||
... }],
|
||||
... })
|
||||
>>> order.total_price
|
||||
'258.98'
|
||||
>>> order.financial_status
|
||||
'authorized'
|
||||
>>> order.fulfillment_status
|
||||
|
||||
Run fetch order::
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_fetch_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_fetch_order'),
|
||||
... ])
|
||||
... cron_fetch_order.click('run_once')
|
||||
|
||||
>>> sale, = Sale.find([])
|
||||
>>> sale.shopify_tax_adjustment
|
||||
Decimal('0.01')
|
||||
>>> len(sale.lines)
|
||||
4
|
||||
>>> sorted([l.unit_price for l in sale.lines])
|
||||
[Decimal('4.0000'), Decimal('8.5727'), Decimal('8.5727'), Decimal('42.9309')]
|
||||
>>> sale.total_amount
|
||||
Decimal('258.98')
|
||||
>>> len(sale.payments)
|
||||
1
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'processing'
|
||||
>>> payment.amount
|
||||
Decimal('258.98')
|
||||
>>> sale.carrier == carrier
|
||||
True
|
||||
>>> sale.state
|
||||
'quotation'
|
||||
|
||||
Capture partially::
|
||||
|
||||
>>> transaction = order.capture('100.00')
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_update_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_order'),
|
||||
... ])
|
||||
... cron_update_order.click('run_once')
|
||||
|
||||
>>> sale.reload()
|
||||
>>> len(sale.payments)
|
||||
1
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'processing'
|
||||
>>> payment.amount
|
||||
Decimal('100.00')
|
||||
>>> sale.state
|
||||
'quotation'
|
||||
|
||||
Capture remaining::
|
||||
|
||||
>>> transaction = order.capture('158.98')
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_update_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_order'),
|
||||
... ])
|
||||
... cron_update_order.click('run_once')
|
||||
|
||||
>>> sale.reload()
|
||||
>>> len(sale.payments)
|
||||
1
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'succeeded'
|
||||
>>> sale.state
|
||||
'processing'
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
Make a partial shipment::
|
||||
|
||||
>>> shipment, = sale.shipments
|
||||
>>> move, = [m for m in shipment.inventory_moves if m.product == variant1]
|
||||
>>> move.quantity = 3
|
||||
>>> shipment.click('pick')
|
||||
>>> shipment.click('pack')
|
||||
>>> shipment.click('done')
|
||||
>>> shipment.state
|
||||
'done'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'partial'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'paid'
|
||||
|
||||
Cancel remaining shipment::
|
||||
|
||||
>>> shipment, = [s for s in sale.shipments if s.state != 'done']
|
||||
>>> shipment.click('cancel')
|
||||
>>> shipment.state
|
||||
'cancelled'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> sale.shipment_state
|
||||
'exception'
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'partial'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'paid'
|
||||
|
||||
Ignore shipment exception::
|
||||
|
||||
>>> shipment_exception = Wizard('sale.handle.shipment.exception', [sale])
|
||||
>>> move = shipment_exception.form.recreate_moves.pop()
|
||||
>>> shipment_exception.execute('handle')
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'partial'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'partially_refunded'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> invoice, = sale.invoices
|
||||
>>> invoice.total_amount
|
||||
Decimal('164.53')
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'succeeded'
|
||||
|
||||
Correct taxes as partial invoice can get rounding gap::
|
||||
|
||||
>>> tax_line, = invoice.taxes
|
||||
>>> tax_line.amount += payment.amount - invoice.total_amount
|
||||
>>> invoice.save()
|
||||
>>> invoice.total_amount == payment.amount
|
||||
True
|
||||
|
||||
Post invoice::
|
||||
|
||||
>>> invoice.click('post')
|
||||
>>> invoice.state
|
||||
'paid'
|
||||
>>> sale.reload()
|
||||
>>> sale.state
|
||||
'done'
|
||||
>>> order.reload()
|
||||
>>> bool(order.closed_at)
|
||||
True
|
||||
|
||||
Clean up::
|
||||
|
||||
>>> order.destroy()
|
||||
>>> for product in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.template,%')]):
|
||||
... shopify.Product.find(product.shopify_identifier).destroy()
|
||||
>>> for category in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.category,%')]):
|
||||
... shopify.CustomCollection.find(category.shopify_identifier).destroy()
|
||||
>>> time.sleep(1)
|
||||
>>> customer.destroy()
|
||||
|
||||
>>> shopify.ShopifyResource.clear_session()
|
||||
@@ -0,0 +1,226 @@
|
||||
========================================
|
||||
Web Shop Shopify Secondary Unit Scenario
|
||||
========================================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> import os
|
||||
>>> import random
|
||||
>>> import string
|
||||
>>> import time
|
||||
>>> import urllib.request
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> import shopify
|
||||
>>> from shopify.api_version import ApiVersion
|
||||
|
||||
>>> 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([
|
||||
... 'web_shop_shopify',
|
||||
... 'sale_secondary_unit',
|
||||
... ])
|
||||
|
||||
>>> Account = Model.get('account.account')
|
||||
>>> Category = Model.get('product.category')
|
||||
>>> Cron = Model.get('ir.cron')
|
||||
>>> Location = Model.get('stock.location')
|
||||
>>> PaymentJournal = Model.get('account.payment.journal')
|
||||
>>> Product = Model.get('product.product')
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
>>> Sale = Model.get('sale.sale')
|
||||
>>> ShopifyIdentifier = Model.get('web.shop.shopify_identifier')
|
||||
>>> Uom = Model.get('product.uom')
|
||||
>>> WebShop = Model.get('web.shop')
|
||||
|
||||
Create company::
|
||||
|
||||
>>> _ = create_company()
|
||||
>>> company = get_company()
|
||||
|
||||
Create chart of accounts::
|
||||
|
||||
>>> _ = create_chart(company)
|
||||
>>> accounts = get_accounts(company)
|
||||
|
||||
Create fiscal year::
|
||||
|
||||
>>> fiscalyear = set_fiscalyear_invoice_sequences(
|
||||
... create_fiscalyear(company))
|
||||
>>> fiscalyear.click('create_period')
|
||||
|
||||
Create payment journal::
|
||||
|
||||
>>> shopify_account = Account(parent=accounts['receivable'].parent)
|
||||
>>> shopify_account.name = "Shopify"
|
||||
>>> shopify_account.type = accounts['receivable'].type
|
||||
>>> shopify_account.reconcile = True
|
||||
>>> shopify_account.save()
|
||||
|
||||
>>> payment_journal = PaymentJournal()
|
||||
>>> payment_journal.name = "Shopify"
|
||||
>>> payment_journal.process_method = 'shopify'
|
||||
>>> payment_journal.save()
|
||||
|
||||
Define a web shop::
|
||||
|
||||
>>> web_shop = WebShop(name="Web Shop")
|
||||
>>> web_shop.type = 'shopify'
|
||||
>>> web_shop.shopify_url = os.getenv('SHOPIFY_URL')
|
||||
>>> web_shop.shopify_password = os.getenv('SHOPIFY_PASSWORD')
|
||||
>>> web_shop.shopify_version = sorted(ApiVersion.versions, reverse=True)[1]
|
||||
>>> shop_warehouse = web_shop.shopify_warehouses.new()
|
||||
>>> shop_warehouse.warehouse, = Location.find([('type', '=', 'warehouse')])
|
||||
>>> shopify_payment_journal = web_shop.shopify_payment_journals.new()
|
||||
>>> shopify_payment_journal.journal = payment_journal
|
||||
>>> web_shop.save()
|
||||
|
||||
>>> shopify.ShopifyResource.activate_session(shopify.Session(
|
||||
... web_shop.shopify_url,
|
||||
... web_shop.shopify_version,
|
||||
... web_shop.shopify_password))
|
||||
|
||||
>>> location = shopify.Location.find_first()
|
||||
|
||||
>>> shop_warehouse, = web_shop.shopify_warehouses
|
||||
>>> shop_warehouse.shopify_id = str(location.id)
|
||||
>>> web_shop.save()
|
||||
|
||||
Create categories::
|
||||
|
||||
>>> category = Category(name="Category")
|
||||
>>> category.save()
|
||||
|
||||
>>> account_category = Category(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, = Uom.find([('name', '=', "Unit")])
|
||||
>>> unit.digits = 2
|
||||
>>> unit.rounding = 0.01
|
||||
>>> unit.save()
|
||||
>>> cm, = Uom.find([('name', '=', "Centimeter")])
|
||||
>>> cm, = cm.duplicate(default={'digits': 0, 'rounding': 1})
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 1"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'goods'
|
||||
>>> template.salable = True
|
||||
>>> template.sale_secondary_uom = cm
|
||||
>>> template.sale_secondary_uom_factor = 25
|
||||
>>> template.list_price = Decimal('100.0000')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(category.id))
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
>>> product.suffix_code = 'PROD'
|
||||
>>> product.save()
|
||||
|
||||
Set categories, products and attributes to web shop::
|
||||
|
||||
>>> web_shop.categories.append(Category(category.id))
|
||||
>>> web_shop.products.append(Product(product.id))
|
||||
>>> web_shop.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
Create an order on Shopify::
|
||||
|
||||
>>> customer = shopify.Customer()
|
||||
>>> customer.last_name = "Customer"
|
||||
>>> customer.email = (
|
||||
... ''.join(random.choice(string.ascii_letters) for _ in range(10))
|
||||
... + '@example.com')
|
||||
>>> customer.addresses = [{
|
||||
... 'address1': "Street",
|
||||
... 'city': "City",
|
||||
... }]
|
||||
>>> customer.save()
|
||||
True
|
||||
|
||||
>>> order = shopify.Order.create({
|
||||
... 'customer': customer.to_dict(),
|
||||
... 'shipping_address': customer.addresses[0].to_dict(),
|
||||
... 'billing_address': customer.addresses[0].to_dict(),
|
||||
... 'line_items': [{
|
||||
... 'variant_id': product.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 50,
|
||||
... }],
|
||||
... 'financial_status': 'authorized',
|
||||
... 'transactions': [{
|
||||
... 'kind': 'authorization',
|
||||
... 'status': 'success',
|
||||
... 'amount': '202.00',
|
||||
... 'test': True,
|
||||
... }],
|
||||
... 'shipping_lines': [{
|
||||
... 'code': 'SHIP',
|
||||
... 'title': "Shipping",
|
||||
... 'price': '2.00',
|
||||
... }],
|
||||
... })
|
||||
>>> order.total_price
|
||||
'202.00'
|
||||
>>> order.financial_status
|
||||
'authorized'
|
||||
|
||||
Run fetch order::
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_fetch_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_fetch_order'),
|
||||
... ])
|
||||
... cron_fetch_order.click('run_once')
|
||||
|
||||
>>> sale, = Sale.find([])
|
||||
>>> len(sale.lines)
|
||||
2
|
||||
>>> sale.total_amount
|
||||
Decimal('202.00')
|
||||
>>> line, = [l for l in sale.lines if l.product]
|
||||
>>> line.quantity
|
||||
2.0
|
||||
>>> line.unit == unit
|
||||
True
|
||||
>>> line.unit_price
|
||||
Decimal('100.0000')
|
||||
>>> line.secondary_quantity
|
||||
50.0
|
||||
>>> line.secondary_unit == cm
|
||||
True
|
||||
>>> line.secondary_unit_price
|
||||
Decimal('4.0000')
|
||||
|
||||
Clean up::
|
||||
|
||||
>>> order.destroy()
|
||||
>>> for product in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.template,%')]):
|
||||
... shopify.Product.find(product.shopify_identifier).destroy()
|
||||
>>> for category in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.category,%')]):
|
||||
... shopify.CustomCollection.find(category.shopify_identifier).destroy()
|
||||
>>> time.sleep(2)
|
||||
>>> customer.destroy()
|
||||
|
||||
>>> shopify.ShopifyResource.clear_session()
|
||||
@@ -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 WebShopShopifyTestCase(ModuleTestCase):
|
||||
'Test Web Shop Shopify module'
|
||||
module = 'web_shop_shopify'
|
||||
|
||||
|
||||
del ModuleTestCase
|
||||
@@ -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('SHOPIFY_PASSWORD') and os.getenv('SHOPIFY_URL'):
|
||||
def load_tests(*args, **kwargs):
|
||||
return load_doc_tests(__name__, __file__, *args, **kwargs)
|
||||
@@ -0,0 +1,17 @@
|
||||
[tox]
|
||||
envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
|
||||
|
||||
[testenv]
|
||||
extras = test
|
||||
commands =
|
||||
coverage run --include=./**/web_shop_shopify/* -m unittest discover -s tests
|
||||
coverage report --include=./**/web_shop_shopify/* --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}
|
||||
@@ -0,0 +1,30 @@
|
||||
[tryton]
|
||||
version=6.7.0
|
||||
depends:
|
||||
account_payment
|
||||
currency
|
||||
ir
|
||||
party
|
||||
product
|
||||
product_attribute
|
||||
sale
|
||||
sale_amendment
|
||||
sale_payment
|
||||
stock
|
||||
web_shop
|
||||
extras_depend:
|
||||
customs
|
||||
product_image
|
||||
product_image_attribute
|
||||
product_measurements
|
||||
sale_discount
|
||||
sale_invoice_grouping
|
||||
sale_secondary_unit
|
||||
sale_shipment_cost
|
||||
stock_package_shipping
|
||||
xml:
|
||||
ir.xml
|
||||
product.xml
|
||||
web.xml
|
||||
stock.xml
|
||||
message.xml
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//field[@name='attributes']" position="after">
|
||||
<group id="shopify_options" string="Shopify Options" colspan="4" col="-1">
|
||||
<field name="shopify_option1"/>
|
||||
<field name="shopify_option2"/>
|
||||
<field name="shopify_option3"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//page[@id='customers']" position="inside">
|
||||
<label name="shopify_uom"/>
|
||||
<field name="shopify_uom"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//page[@name='warehouses']" position="after">
|
||||
<page name="shopify_warehouses">
|
||||
<field name="shopify_warehouses" colspan="4" view_ids="web_shop_shopify.shop_stock_location_view_list,web_shop_shopify.shop_stock_location_view_form"/>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//page[@id='products']" position="after">
|
||||
<page string="Shopify" id="shopify" col="6">
|
||||
<label name="shopify_url"/>
|
||||
<field name="shopify_url"/>
|
||||
<label name="shopify_password"/>
|
||||
<field name="shopify_password" widget="password"/>
|
||||
<label name="shopify_version"/>
|
||||
<field name="shopify_version"/>
|
||||
|
||||
<label name="shopify_webhook_shared_secret"/>
|
||||
<field name="shopify_webhook_shared_secret"/>
|
||||
<label name="shopify_webhook_endpoint_order"/>
|
||||
<field name="shopify_webhook_endpoint_order"/>
|
||||
|
||||
<field name="shopify_payment_journals" colspan="6"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="web_shop"/>
|
||||
<field name="web_shop" colspan="3"/>
|
||||
|
||||
<label name="record"/>
|
||||
<field name="record"/>
|
||||
<label name="shopify_identifier"/>
|
||||
<field name="shopify_identifier" width="20"/>
|
||||
|
||||
<label name="to_update"/>
|
||||
<field name="to_update"/>
|
||||
</form>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="web_shop" expand="1"/>
|
||||
<field name="record" expand="1"/>
|
||||
<field name="shopify_identifier" expand="2"/>
|
||||
<field name="to_update"/>
|
||||
<button name="set_to_update" tree_invisible="1"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shop"/>
|
||||
<field name="shop" colspan="3"/>
|
||||
|
||||
<label name="journal"/>
|
||||
<field name="journal"/>
|
||||
<label name="sequence"/>
|
||||
<field name="sequence"/>
|
||||
|
||||
<label name="gateway"/>
|
||||
<field name="gateway"/>
|
||||
</form>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree sequence="sequence">
|
||||
<field name="shop" expand="1"/>
|
||||
<field name="gateway"/>
|
||||
<field name="journal" expand="2"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shop"/>
|
||||
<field name="shop" colspan="3"/>
|
||||
|
||||
<label name="warehouse"/>
|
||||
<field name="warehouse"/>
|
||||
<label name="shopify_id"/>
|
||||
<field name="shopify_id"/>
|
||||
|
||||
<label name="shopify_stock_skip_warehouse"/>
|
||||
<field name="shopify_stock_skip_warehouse"/>
|
||||
</form>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="shop" expand="1"/>
|
||||
<field name="warehouse" expand="1"/>
|
||||
<field name="shopify_id"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shipment"/>
|
||||
<field name="shipment" colspan="3"/>
|
||||
|
||||
<label name="sale"/>
|
||||
<field name="sale"/>
|
||||
<label name="shopify_identifier"/>
|
||||
<field name="shopify_identifier" width="20"/>
|
||||
</form>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="shipment" expand="1"/>
|
||||
<field name="sale" expand="1"/>
|
||||
<field name="shopify_identifier" expand="2"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,717 @@
|
||||
# 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
|
||||
import urllib.parse
|
||||
from decimal import Decimal
|
||||
|
||||
import pyactiveresource
|
||||
import shopify
|
||||
from shopify.api_version import ApiVersion
|
||||
|
||||
from trytond.cache import Cache
|
||||
from trytond.config import config
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import (
|
||||
MatchMixin, ModelSQL, ModelView, Unique, fields, sequence_ordered)
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
from trytond.tools import grouped_slice
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.url import http_host
|
||||
|
||||
from .common import IdentifierMixin, IdentifiersMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
EDIT_ORDER_DELAY = dt.timedelta(days=60 + 1)
|
||||
|
||||
|
||||
class Shop(metaclass=PoolMeta):
|
||||
__name__ = 'web.shop'
|
||||
|
||||
_states = {
|
||||
'required': Eval('type') == 'shopify',
|
||||
'invisible': Eval('type') != 'shopify',
|
||||
}
|
||||
|
||||
shopify_url = fields.Char("Shop URL", states=_states)
|
||||
shopify_version = fields.Selection(
|
||||
'get_shopify_versions', "Version", states=_states)
|
||||
shopify_password = fields.Char("Access Token", states=_states, strip=False)
|
||||
shopify_webhook_shared_secret = fields.Char(
|
||||
"Webhook Shared Secret", strip=False,
|
||||
states={
|
||||
'invisible': _states['invisible'],
|
||||
})
|
||||
shopify_webhook_endpoint_order = fields.Function(
|
||||
fields.Char(
|
||||
"Webhook Order Endpoint",
|
||||
help="The URL to be called by Shopify for Order events."),
|
||||
'on_change_with_shopify_webhook_endpoint_order')
|
||||
shopify_warehouses = fields.One2Many(
|
||||
'web.shop-stock.location', 'shop', "Warehouses", states=_states)
|
||||
shopify_payment_journals = fields.One2Many(
|
||||
'web.shop.shopify_payment_journal', 'shop', "Payment Journals",
|
||||
states=_states)
|
||||
|
||||
del _states
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.type.selection.append(('shopify', "Shopify"))
|
||||
invisible = Eval('type') == 'shopify'
|
||||
for field in [cls.attributes, cls.attributes_removed, cls.warehouses]:
|
||||
if field.states.get('invisible'):
|
||||
field.states['invisible'] |= invisible
|
||||
else:
|
||||
field.states['invisible'] = invisible
|
||||
|
||||
@classmethod
|
||||
def get_shopify_versions(cls):
|
||||
return [(None, "")] + sorted(
|
||||
((v, v) for v in ApiVersion.versions), reverse=True)
|
||||
|
||||
@fields.depends('name')
|
||||
def on_change_with_shopify_webhook_endpoint_order(self, name=None):
|
||||
if not self.name:
|
||||
return
|
||||
url_part = {
|
||||
'database_name': Transaction().database.name,
|
||||
'shop': self.name,
|
||||
}
|
||||
return http_host() + (
|
||||
urllib.parse.quote(
|
||||
'/%(database_name)s/web_shop_shopify/webhook/%(shop)s/order' %
|
||||
url_part))
|
||||
|
||||
@classmethod
|
||||
def view_attributes(cls):
|
||||
return super().view_attributes() + [
|
||||
('//page[@id="shopify"]', 'states', {
|
||||
'invisible': Eval('type') != 'shopify',
|
||||
}),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def validate_fields(cls, shops, field_names):
|
||||
super().validate_fields(shops, field_names)
|
||||
if field_names & {'type', 'products'}:
|
||||
for shop in shops:
|
||||
if shop.type == 'shopify':
|
||||
for product in shop.products:
|
||||
shop._shopify_check_product(product)
|
||||
|
||||
def _shopify_check_product(self, product):
|
||||
if not product.template.shopify_uom:
|
||||
shopify_uom = product.template.get_shopify_uom()
|
||||
if shopify_uom.digits:
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.'
|
||||
'msg_product_shopify_uom_digits',
|
||||
product=product.rec_name))
|
||||
|
||||
@property
|
||||
def to_sync(self):
|
||||
result = super().to_sync
|
||||
if self.type == 'shopify':
|
||||
result = True
|
||||
return result
|
||||
|
||||
def get_sale(self, party=None):
|
||||
sale = super().get_sale(party=party)
|
||||
if self.type == 'shopify':
|
||||
sale.invoice_method = 'shipment'
|
||||
return sale
|
||||
|
||||
def shopify_session(self):
|
||||
return shopify.Session.temp(
|
||||
self.shopify_url, self.shopify_version, self.shopify_password)
|
||||
|
||||
def get_payment_journal(self, currency_code, pattern):
|
||||
for payment_journal in self.shopify_payment_journals:
|
||||
if (payment_journal.journal.currency.code == currency_code
|
||||
and payment_journal.match(pattern)):
|
||||
return payment_journal.journal
|
||||
|
||||
def managed_metafields(self):
|
||||
return set()
|
||||
|
||||
def __sync_metafields(self, resource, metafields):
|
||||
metafields = metafields.copy()
|
||||
managed_metafields = self.managed_metafields()
|
||||
assert metafields.keys() <= managed_metafields
|
||||
for metafield in resource.metafields():
|
||||
key = '.'.join([metafield.namespace, metafield.key])
|
||||
value = metafield.to_dict()
|
||||
if key not in metafields:
|
||||
if key in managed_metafields:
|
||||
metafield.destroy()
|
||||
elif metafields[key] != value:
|
||||
for k, v in metafields.pop(key).items():
|
||||
setattr(metafield, k, v)
|
||||
metafield.save()
|
||||
for key, value in metafields.items():
|
||||
namespace, key = key.split('.', 1)
|
||||
value['namespace'] = namespace
|
||||
value['key'] = key
|
||||
resource.add_metafield(shopify.Metafield(value))
|
||||
|
||||
@classmethod
|
||||
def shopify_update_product(cls, shops=None):
|
||||
"""Update Shopify Products
|
||||
|
||||
The transaction is committed after the creation of each new resource.
|
||||
"""
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
transaction = Transaction()
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
for shop in shops:
|
||||
with shop.shopify_session():
|
||||
shopify_shop = shopify.Shop.current()
|
||||
shop_language = (
|
||||
shop.language.code if shop.language
|
||||
else transaction.language)
|
||||
categories = shop.get_categories()
|
||||
products, prices, taxes = shop.get_products()
|
||||
if shopify_shop.currency.lower() != shop.currency.code.lower():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_shop_currency_different',
|
||||
shop=shop.rec_name,
|
||||
shop_currency=shop.currency.code,
|
||||
shopify_currency=shopify_shop.currency))
|
||||
if (shopify_shop.primary_locale.lower()
|
||||
!= shop_language.lower()):
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_shop_locale_different',
|
||||
shop=shop.rec_name,
|
||||
shop_language=shop_language,
|
||||
shopify_primary_locale=shopify_shop.primary_locale
|
||||
))
|
||||
|
||||
for category in categories:
|
||||
shop.__shopify_update_category(category)
|
||||
|
||||
categories = set(categories)
|
||||
inventory_items = InventoryItem.browse(products)
|
||||
for product, inventory_item in zip(products, inventory_items):
|
||||
price = prices[product.id]
|
||||
tax = taxes[product.id]
|
||||
|
||||
template = product.template
|
||||
if not template.shopify_uom:
|
||||
shop._shopify_check_product(product)
|
||||
template.shopify_uom = template.get_shopify_uom()
|
||||
template.save()
|
||||
|
||||
shop.__shopify_update_template(
|
||||
shopify_shop, categories, template,
|
||||
product, price, tax)
|
||||
shop.__shopify_update_product(
|
||||
shopify_shop, product, price, tax)
|
||||
shop.__shopify_update_inventory_item(inventory_item)
|
||||
|
||||
for category in shop.categories_removed:
|
||||
shop.__shopify_remove_category(category)
|
||||
shop.categories_removed = []
|
||||
|
||||
products = set(products)
|
||||
for product in shop.products_removed:
|
||||
template = product.template
|
||||
if set(template.products).isdisjoint(products):
|
||||
shop.__shopify_remove_template(template)
|
||||
else:
|
||||
shop.__shopify_remove_product(product)
|
||||
shop.products_removed = []
|
||||
cls.save(shops)
|
||||
|
||||
def __shopify_update_category(self, category):
|
||||
if not category.is_shopify_to_update(self):
|
||||
return
|
||||
custom_collection = category.get_shopify(self)
|
||||
if not custom_collection.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_custom_collection_fail',
|
||||
category=category.rec_name,
|
||||
error="\n".join(
|
||||
custom_collection.errors.full_messages())))
|
||||
identifier = category.set_shopify_identifier(
|
||||
self, custom_collection.id)
|
||||
if identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(
|
||||
custom_collection, category.get_shopify_metafields(self))
|
||||
|
||||
def __shopify_remove_category(self, category):
|
||||
shopify_id = category.get_shopify_identifier(self)
|
||||
if shopify_id:
|
||||
if shopify.CustomCollection.exists(shopify_id):
|
||||
shopify.CustomCollection.find(shopify_id).destroy()
|
||||
category.set_shopify_identifier(self)
|
||||
|
||||
def __shopify_update_template(
|
||||
self, shopify_shop, categories, template, product, price, tax):
|
||||
if not template.is_shopify_to_update(self):
|
||||
return
|
||||
shopify_product = template.get_shopify(self)
|
||||
new = shopify_product.is_new()
|
||||
if new:
|
||||
shopify_product.variants = [
|
||||
product.get_shopify(
|
||||
self, price, tax,
|
||||
shop_taxes_included=shopify_shop.taxes_included,
|
||||
shop_weight_unit=shopify_shop.weight_unit)]
|
||||
else:
|
||||
# Set fake value for missing new options
|
||||
for j, variant in enumerate(shopify_product.variants):
|
||||
for i, _ in range(len(shopify_product.options), 1):
|
||||
name = 'option%i' % i
|
||||
if not getattr(variant, name, None):
|
||||
setattr(variant, name, '_option%i-%i' % (i, j))
|
||||
if not shopify_product.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_product_fail',
|
||||
template=template.rec_name,
|
||||
error="\n".join(shopify_product.errors.full_messages())))
|
||||
identifier = template.set_shopify_identifier(
|
||||
self, shopify_product.id)
|
||||
if identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
if new:
|
||||
variant, = shopify_product.variants
|
||||
product.set_shopify_identifier(self, variant.id)
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(
|
||||
shopify_product, template.get_shopify_metafields(self))
|
||||
|
||||
collection_ids = {
|
||||
c.id for c in shopify_product.collections()}
|
||||
for category in template.categories_all:
|
||||
while category:
|
||||
if category in categories:
|
||||
custom_collection = (
|
||||
shopify.CustomCollection.find(
|
||||
category.get_shopify_identifier(
|
||||
self)))
|
||||
if custom_collection.id in collection_ids:
|
||||
collection_ids.remove(
|
||||
custom_collection.id)
|
||||
else:
|
||||
shopify_product.add_to_collection(
|
||||
custom_collection)
|
||||
category = category.parent
|
||||
for collection_id in collection_ids:
|
||||
collection = shopify.CustomCollection.find(
|
||||
collection_id)
|
||||
shopify_product.remove_from_collection(collection)
|
||||
|
||||
self.__shopify_update_images(template, shopify_product)
|
||||
|
||||
def __shopify_remove_template(self, template):
|
||||
shopify_id = template.get_shopify_identifier(self)
|
||||
if not shopify_id:
|
||||
return
|
||||
if shopify.Product.exists(shopify_id):
|
||||
shopify.Product.find(shopify_id).destroy()
|
||||
template.set_shopify_identifier(self)
|
||||
for product in template.products:
|
||||
product.set_shopify_identifier(self)
|
||||
if hasattr(template, 'images'):
|
||||
for image in template.images:
|
||||
image.set_shopify_identifier(self)
|
||||
|
||||
def __shopify_update_images(self, template, shopify_product):
|
||||
if not hasattr(template, 'images'):
|
||||
return
|
||||
transaction = Transaction()
|
||||
image_ids = set()
|
||||
for i, image in enumerate(filter(
|
||||
lambda i: i.web_shop,
|
||||
template.images_used), 1):
|
||||
product_image = image.get_shopify(self)
|
||||
new_image = not product_image.id
|
||||
product_image.position = i
|
||||
if not product_image.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify'
|
||||
'.msg_product_image_fail',
|
||||
image=image.rec_name,
|
||||
template=template.rec_name,
|
||||
error="\n".join(
|
||||
product_image.errors
|
||||
.full_messages())))
|
||||
image_ids.add(product_image.id)
|
||||
if new_image:
|
||||
image.set_shopify_identifier(
|
||||
self, product_image.id)
|
||||
transaction.commit()
|
||||
|
||||
for image in shopify_product.images:
|
||||
if image.id not in image_ids:
|
||||
image.destroy()
|
||||
|
||||
def __shopify_update_product(self, shopify_shop, product, price, tax):
|
||||
update_extra = {'price': str(price), 'tax': str(tax)}
|
||||
if not product.is_shopify_to_update(self, **update_extra):
|
||||
return
|
||||
variant = product.get_shopify(
|
||||
self, price, tax,
|
||||
shop_taxes_included=shopify_shop.taxes_included,
|
||||
shop_weight_unit=shopify_shop.weight_unit)
|
||||
if not variant.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_variant_fail',
|
||||
product=product.rec_name,
|
||||
error="\n".join(variant.errors.full_messages())
|
||||
))
|
||||
identifier = product.set_shopify_identifier(self, variant.id)
|
||||
if identifier.to_update or identifier.to_update_extra != update_extra:
|
||||
identifier.to_update = False
|
||||
identifier.to_update_extra = update_extra
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(variant, product.get_shopify_metafields(self))
|
||||
|
||||
def __shopify_update_inventory_item(self, inventory_item):
|
||||
if not inventory_item.is_shopify_to_update(self):
|
||||
return
|
||||
shopify_inventory_item = inventory_item.get_shopify(self)
|
||||
if shopify_inventory_item:
|
||||
if not shopify_inventory_item.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_inventory_item_fail',
|
||||
product=inventory_item.product.rec_name,
|
||||
error="\n".join(
|
||||
inventory_item.errors.full_messages())))
|
||||
identifier = inventory_item.set_shopify_identifier(
|
||||
self, shopify_inventory_item.id if
|
||||
shopify_inventory_item.tracked else None)
|
||||
if identifier and identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
def __shopify_remove_product(self, product):
|
||||
shopify_id = product.get_shopify_identifier(self)
|
||||
if shopify_id:
|
||||
if shopify.Variant.exists(shopify_id):
|
||||
shopify.Variant.find(shopify_id).destroy()
|
||||
product.set_shopify_identifier(self)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_inventory(cls, shops=None):
|
||||
"""Update Shopify Inventory"""
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
for shop in shops:
|
||||
for shop_warehouse in shop.shopify_warehouses:
|
||||
location_id = shop_warehouse.shopify_id
|
||||
if not location_id:
|
||||
continue
|
||||
location_id = int(location_id)
|
||||
with Transaction().set_context(
|
||||
shop.get_context(),
|
||||
**shop_warehouse.get_shopify_inventory_context()):
|
||||
products = Product.browse([
|
||||
p for p in shop.products if p.shopify_uom])
|
||||
with shop.shopify_session():
|
||||
shop.__shopify_update_inventory(products, location_id)
|
||||
|
||||
def __shopify_update_inventory(self, products, location_id):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
inventory_items = InventoryItem.browse(products)
|
||||
product2quantity = {p.id: int(p.shopify_quantity) for p in products}
|
||||
shopify2product = {
|
||||
i.get_shopify_identifier(self): i.id for i in inventory_items}
|
||||
shopify2product.pop(None, None)
|
||||
product2shopify = {v: k for k, v in shopify2product.items()}
|
||||
|
||||
location = shopify.Location.find(location_id)
|
||||
for i, inventory_level in enumerate(
|
||||
location.inventory_levels(limit=250, no_iter_next=False)):
|
||||
inventory_item_id = inventory_level.inventory_item_id
|
||||
product_id = shopify2product.get(inventory_item_id)
|
||||
if product_id is None:
|
||||
continue
|
||||
quantity = product2quantity.pop(product_id)
|
||||
if inventory_level.available != quantity:
|
||||
try:
|
||||
shopify.InventoryLevel.set(
|
||||
location_id, inventory_item_id, quantity)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
|
||||
for product_id, quantity in product2quantity.items():
|
||||
inventory_item_id = product2shopify.get(product_id)
|
||||
if inventory_item_id is None:
|
||||
continue
|
||||
try:
|
||||
shopify.InventoryLevel.set(
|
||||
location_id, inventory_item_id, quantity)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def shopify_fetch_order(cls, shops=None):
|
||||
"""Fetch new Shopify Order"""
|
||||
pool = Pool()
|
||||
Sale = pool.get('sale.sale')
|
||||
Payment = pool.get('account.payment')
|
||||
context = Transaction().context
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
cls.lock(shops)
|
||||
for shop in shops:
|
||||
last_sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
], order=[('shopify_identifier_signed', 'DESC')], limit=1)
|
||||
if last_sales:
|
||||
last_sale, = last_sales
|
||||
last_order_id = last_sale.shopify_identifier
|
||||
else:
|
||||
last_order_id = ''
|
||||
with shop.shopify_session():
|
||||
if 'shopify_orders' in context:
|
||||
orders = shopify.Order.find(
|
||||
ids=context['shopify_orders'],
|
||||
limit=250, no_iter_next=False)
|
||||
else:
|
||||
orders = shopify.Order.find(
|
||||
status='open', since_id=last_order_id,
|
||||
limit=250, no_iter_next=False)
|
||||
sales = []
|
||||
for i, order in enumerate(orders):
|
||||
sales.append(Sale.get_from_shopify(shop, order))
|
||||
Sale.save(sales)
|
||||
for sale, order in zip(sales, orders):
|
||||
sale.shopify_tax_adjustment = (
|
||||
Decimal(order.total_price) - sale.total_amount)
|
||||
Sale.save(sales)
|
||||
Sale.quote(sales)
|
||||
for sale, order in zip(sales, orders):
|
||||
Payment.get_from_shopify(sale, order)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_order(cls, shops=None):
|
||||
"""Update existing sale from Shopify"""
|
||||
pool = Pool()
|
||||
Sale = pool.get('sale.sale')
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
cls.lock(shops)
|
||||
now = dt.datetime.now()
|
||||
for shop in shops:
|
||||
sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '!=', None),
|
||||
['OR',
|
||||
('state', 'in',
|
||||
['quotation', 'confirmed', 'processing']),
|
||||
('create_date', '>=', now - EDIT_ORDER_DELAY),
|
||||
],
|
||||
])
|
||||
for sub_sales in grouped_slice(sales, count=250):
|
||||
cls._shopify_update_order(shop, list(sub_sales))
|
||||
|
||||
@classmethod
|
||||
def _shopify_update_order(cls, shop, sales):
|
||||
assert shop.type == 'shopify'
|
||||
assert all(s.web_shop == shop for s in sales)
|
||||
with shop.shopify_session():
|
||||
orders = shopify.Order.find(
|
||||
ids=','.join(str(s.shopify_identifier) for s in sales),
|
||||
status='any')
|
||||
id2order = {o.id: o for o in orders}
|
||||
|
||||
to_update = []
|
||||
orders = []
|
||||
for sale in sales:
|
||||
try:
|
||||
order = id2order[sale.shopify_identifier]
|
||||
except KeyError:
|
||||
continue
|
||||
to_update.append(sale)
|
||||
orders.append(order)
|
||||
cls.shopify_update_sale(to_update, orders)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_sale(cls, sales, orders):
|
||||
"""Update sales based on Shopify orders"""
|
||||
pool = Pool()
|
||||
Amendment = pool.get('sale.amendment')
|
||||
Payment = pool.get('account.payment')
|
||||
Sale = pool.get('sale.sale')
|
||||
assert len(sales) == len(orders)
|
||||
to_update = {}
|
||||
for sale, order in zip(sales, orders):
|
||||
assert sale.shopify_identifier == order.id
|
||||
shop = sale.web_shop
|
||||
with shop.shopify_session():
|
||||
sale = Sale.get_from_shopify(shop, order, sale=sale)
|
||||
if sale._changed_values:
|
||||
sale.untaxed_amount_cache = None
|
||||
sale.tax_amount_cache = None
|
||||
sale.total_amount_cache = None
|
||||
to_update[sale] = order
|
||||
Payment.get_from_shopify(sale, order)
|
||||
Sale.save(to_update.keys())
|
||||
for sale, order in to_update.items():
|
||||
sale.shopify_tax_adjustment = (
|
||||
Decimal(order.current_total_price) - sale.total_amount)
|
||||
Sale.store_cache(to_update.keys())
|
||||
Amendment._clear_sale(to_update.keys())
|
||||
Sale.__queue__.process(to_update.keys())
|
||||
|
||||
|
||||
class ShopShopifyIdentifier(IdentifierMixin, ModelSQL, ModelView):
|
||||
"Shopify Identifier"
|
||||
__name__ = 'web.shop.shopify_identifier'
|
||||
|
||||
record = fields.Reference("Record", 'get_records', required=True)
|
||||
web_shop = fields.Many2One(
|
||||
'web.shop', "Web Shop", required=True, ondelete='CASCADE')
|
||||
to_update = fields.Boolean("To Update")
|
||||
to_update_extra = fields.Dict(None, "To Update Extra")
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.shopify_identifier_signed.states = {
|
||||
'required': True,
|
||||
}
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('record_web_shop_unique',
|
||||
Unique(t, t.record, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_record_web_shop_unique'),
|
||||
]
|
||||
cls._buttons.update({
|
||||
'set_to_update': {},
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def get_records(cls):
|
||||
pool = Pool()
|
||||
Model = pool.get('ir.model')
|
||||
get_name = Model.get_name
|
||||
models = (klass.__name__ for _, klass in pool.iterobject()
|
||||
if issubclass(klass, IdentifiersMixin))
|
||||
return [(m, get_name(m)) for m in models]
|
||||
|
||||
@classmethod
|
||||
def set_to_update(cls, identifiers):
|
||||
cls.write(identifiers, {'to_update': True})
|
||||
|
||||
|
||||
class Shop_Warehouse(ModelView, metaclass=PoolMeta):
|
||||
__name__ = 'web.shop-stock.location'
|
||||
|
||||
shopify_stock_skip_warehouse = fields.Boolean(
|
||||
"Only storage zone",
|
||||
help="Check to use only the quantity of the storage zone.")
|
||||
shopify_id = fields.Selection(
|
||||
'get_shopify_locations', "Shopify ID")
|
||||
_shopify_locations_cache = Cache(
|
||||
__name__ + '.get_shopify_locations',
|
||||
duration=config.getint(
|
||||
'web_shop_shopify', 'locations_cache', default=15 * 60),
|
||||
context=False)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.__access__.add('shop')
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shopify_id_unique',
|
||||
Unique(t, t.shopify_id),
|
||||
'web_shop_shopify.msg_location_id_unique'),
|
||||
]
|
||||
|
||||
@fields.depends(
|
||||
'shop', '_parent_shop.shopify_url', '_parent_shop.shopify_version',
|
||||
'_parent_shop.shopify_password')
|
||||
def get_shopify_locations(self):
|
||||
locations = [(None, "")]
|
||||
if self.shop:
|
||||
locations_cache = self._shopify_locations_cache.get(self.shop.id)
|
||||
if locations_cache is not None:
|
||||
return locations_cache
|
||||
try:
|
||||
with self.shop.shopify_session():
|
||||
locations += [
|
||||
(str(l.id), l.name)
|
||||
for l in shopify.Location.find(no_iter_next=False)]
|
||||
self._shopify_locations_cache.set(self.shop.id, locations)
|
||||
except (AttributeError,
|
||||
shopify.VersionNotFoundError,
|
||||
pyactiveresource.connection.Error):
|
||||
pass
|
||||
return locations
|
||||
|
||||
def get_shopify_inventory_context(self):
|
||||
return {
|
||||
'locations': [self.warehouse.id],
|
||||
'stock_skip_warehouse': self.shopify_stock_skip_warehouse,
|
||||
'with_childs': True,
|
||||
}
|
||||
|
||||
|
||||
class Shop_Attribute(metaclass=PoolMeta):
|
||||
__name__ = 'web.shop-product.attribute'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
domain = [
|
||||
('type', '!=', 'shopify'),
|
||||
]
|
||||
if cls.shop.domain:
|
||||
cls.shop.domain = [cls.shop.domain, domain]
|
||||
else:
|
||||
cls.shop.domain = domain
|
||||
|
||||
|
||||
class ShopShopifyPaymentJournal(
|
||||
sequence_ordered(), MatchMixin, ModelSQL, ModelView):
|
||||
"Shopify Payment Journal"
|
||||
__name__ = 'web.shop.shopify_payment_journal'
|
||||
|
||||
shop = fields.Many2One(
|
||||
'web.shop', "Shop", required=True, ondelete='CASCADE',
|
||||
domain=[
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
gateway = fields.Char(
|
||||
"Gateway",
|
||||
help="The payment gateway name for which the journal must be used.")
|
||||
journal = fields.Many2One(
|
||||
'account.payment.journal', "Journal", required=True,
|
||||
domain=[
|
||||
('process_method', '=', 'shopify'),
|
||||
])
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.__access__.add('shop')
|
||||
|
||||
# TODO: add wizard to export translations
|
||||
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="shop_view_form">
|
||||
<field name="model">web.shop</field>
|
||||
<field name="inherit" ref="web_shop.shop_view_form"/>
|
||||
<field name="name">shop_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_stock_location_view_form">
|
||||
<field name="model">web.shop-stock.location</field>
|
||||
<field name="type">form</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="name">shop_stock_location_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_stock_location_view_list">
|
||||
<field name="model">web.shop-stock.location</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="name">shop_stock_location_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_identifier_view_form">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">shop_shopify_identifier_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_identifier_view_list">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">shop_shopify_identifier_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_shop_shopify_identifier_form">
|
||||
<field name="name">Shopify Identifiers</field>
|
||||
<field name="res_model">web.shop.shopify_identifier</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_shop_shopify_identifier_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="shop_shopify_identifier_view_list"/>
|
||||
<field name="act_window" ref="act_shop_shopify_identifier_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_shop_shopify_identifier_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="shop_shopify_identifier_view_form"/>
|
||||
<field name="act_window" ref="act_shop_shopify_identifier_form"/>
|
||||
</record>
|
||||
<menuitem
|
||||
parent="ir.menu_models"
|
||||
action="act_shop_shopify_identifier_form"
|
||||
sequence="50"
|
||||
id="menu_shop_shopify_identifier_form"/>
|
||||
|
||||
<record model="ir.model.access" id="access_shop_shopify_identifier">
|
||||
<field name="model" search="[('model', '=', 'web.shop.shopify_identifier')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_shop_shopify_identifier_admin">
|
||||
<field name="model" search="[('model', '=', 'web.shop.shopify_identifier')]"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.button" id="shop_shopify_identifier_set_to_update_button">
|
||||
<field name="name">set_to_update</field>
|
||||
<field name="string">Set to Update</field>
|
||||
<field name="model" search="[('model', '=', 'web.shop.shopify_identifier')]"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_payment_journal_view_form">
|
||||
<field name="model">web.shop.shopify_payment_journal</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">shop_shopify_payment_journal_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_payment_journal_view_list">
|
||||
<field name="model">web.shop.shopify_payment_journal</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">shop_shopify_payment_journal_list</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
[flake8]
|
||||
ignore=E123,E124,E126,E128,E741,W503
|
||||
@@ -0,0 +1,3 @@
|
||||
[settings]
|
||||
multi_line_output=4
|
||||
known_first_party=trytond
|
||||
@@ -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)
|
||||
* Use product image module
|
||||
|
||||
Version 6.0.0 - 2021-05-03
|
||||
* Bug fixes (see mercurial logs for details)
|
||||
|
||||
Version 5.8.0 - 2020-11-02
|
||||
* Initial release
|
||||
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
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
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
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
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,6 @@
|
||||
include CHANGELOG
|
||||
include COPYRIGHT
|
||||
include LICENSE
|
||||
include README.rst
|
||||
include icons/LICENSE
|
||||
graft doc
|
||||
@@ -0,0 +1 @@
|
||||
doc/index.rst
|
||||
@@ -0,0 +1,46 @@
|
||||
# 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 routes
|
||||
|
||||
__all__ = ['register', 'routes']
|
||||
|
||||
from . import carrier, ir, party, product, sale, web
|
||||
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
web.Shop,
|
||||
web.ShopVSFIdentifier,
|
||||
web.User,
|
||||
ir.Cron,
|
||||
party.Address,
|
||||
party.Identifier,
|
||||
product.Product,
|
||||
product.Template,
|
||||
product.Category,
|
||||
sale.Sale,
|
||||
sale.Line,
|
||||
module='web_shop_vue_storefront', type_='model')
|
||||
Pool.register(
|
||||
product.ProductAttribute,
|
||||
product.TemplateAttribute,
|
||||
product.Attribute,
|
||||
sale.LineAttribute,
|
||||
module='web_shop_vue_storefront', type_='model',
|
||||
depends=['product_attribute'])
|
||||
Pool.register(
|
||||
web.ShopCoupon,
|
||||
module='web_shop_vue_storefront', type_='model',
|
||||
depends=['sale_promotion_coupon'])
|
||||
Pool.register(
|
||||
carrier.Carrier,
|
||||
module='web_shop_vue_storefront', type_='model',
|
||||
depends=['carrier'])
|
||||
Pool.register(
|
||||
web.ShopShipmentCost,
|
||||
sale.SaleShipmentCost,
|
||||
module='web_shop_vue_storefront', type_='model',
|
||||
depends=['sale_shipment_cost'])
|
||||
@@ -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 PoolMeta
|
||||
|
||||
|
||||
class Carrier(metaclass=PoolMeta):
|
||||
__name__ = 'carrier'
|
||||
|
||||
@property
|
||||
def vsf_carrier_title(self):
|
||||
return self.party.name
|
||||
|
||||
@property
|
||||
def vsf_method_title(self):
|
||||
return self.carrier_product.name
|
||||
|
||||
def get_vsf(self):
|
||||
return {
|
||||
'carrier_code': str(self.id),
|
||||
'method_code': str(self.id),
|
||||
'carrier_title': self.vsf_carrier_title,
|
||||
'method_title': self.vsf_method_title,
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
Web Vue Storefront Module
|
||||
#########################
|
||||
|
||||
The web_shop_vue_storefront module provides the back-end to integrate with `Vue
|
||||
Storefront`_ 1.x.
|
||||
|
||||
.. _`Vue Storefront`: https://www.vuestorefront.io/
|
||||
|
||||
|
||||
Vue StoreFront Configuration
|
||||
----------------------------
|
||||
|
||||
The endpoint must be updated to use the Tryton URL. You must just replace
|
||||
`/api` by
|
||||
`http(s)://<hostname>:<port>/<database name>/web_shop_vue_storefront/<shop name>`.
|
||||
|
||||
The configuration `autoRefreshTokens` must be set to `false`.
|
||||
@@ -0,0 +1,16 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from werkzeug import exceptions
|
||||
|
||||
|
||||
class LoginException(exceptions.Unauthorized):
|
||||
pass
|
||||
|
||||
|
||||
class NotFound(exceptions.NotFound):
|
||||
pass
|
||||
|
||||
|
||||
class BadRequest(exceptions.BadRequest):
|
||||
pass
|
||||
@@ -0,0 +1,14 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.pool import PoolMeta
|
||||
|
||||
|
||||
class Cron(metaclass=PoolMeta):
|
||||
__name__ = 'ir.cron'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.method.selection.extend([
|
||||
('web.shop|vsf_update', "Update Vue Storefront"),
|
||||
])
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,81 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr "Telèfon"
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr "Index Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr "URL Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registre"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr "Gran total"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr "El indentificador Vue Storefront ha de ser únic per a cada registre."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr "El númbero \"%(code)s\" no és un identificador fiscal vàlid."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
"No us heu identificat correctament o el vostre compte s'ha suspes "
|
||||
"temporalment."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr "Enviament"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr "Subtotal"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr "Impost"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr "El codi de país \"%(code)s\" és desconegut."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr "Identificador Vue Storefront"
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr "Identificador tenda web Vue Storefront"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr "Actualitza Vue Storefront"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,82 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr "Telefon"
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr "Elasticsearch Index"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr "Elasticsearch URL"
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Datensatz"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr "Gesamtbetrag"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
"Der Vue Storefront Identifikator muss für jeden Datensatz eindeutig sein."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr "Die Nummer \"%(code)s\" ist kein gültiger Steueridentifikator."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
"Sie haben sich nicht korrekt angemeldet oder Ihr Konto ist vorübergehend "
|
||||
"deaktiviert."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr "Versand"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr "Zwischensumme"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr "Steuer"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr "Der Ländercode \"%(code)s\" ist unbekannt."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr "Vue Storefront Identifikator"
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr "Webshop Vue Storefront Identifikator"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr "Vue Storefront aktualisieren"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
@@ -0,0 +1,81 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr "Teléfono"
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr "Índice Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr "URL Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registro"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr "Gran Total"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr "El identificador Vue Storefront debe ser único por cada registro."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr "El número \"%(code)s\" no es un identificador fiscal válido."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
"No te has identificado correctamente o tu cuenta ha sido temporalmente "
|
||||
"suspendida."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr "Envío"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr "Subtotal"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr "Impuesto"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr "El código de país \"%(code)s\" es desconocido."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr "Identificador Vue Storefront"
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr "Identificador de la tienda Vue Storefront"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr "Actualizar Vue Storefront"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,82 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr "Téléphone"
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "UGS"
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "UGS"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr "Index Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr "URL d'Elasticsearch"
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Enregistrement"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr "Somme finale"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
"L'identifiant Vue Storefront doit être unique pour chaque enregistrement."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr "Le numéro « %(code)s » n'est pas un identifiant fiscal valide."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
"Vous ne vous êtes pas connecté correctement ou votre compte est "
|
||||
"temporairement désactivé."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr "Livraison"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr "Sous-total"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr "Taxe"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr "Le code pays « %(code)s » n'est pas connu."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr "Identifiant Vue Storefront"
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr "Identifiant de la boutique Web Vue Storefront"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr "Mettre à jour Vue Storefront"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr "Vue Storefront"
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,79 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:party.address,vsf_telephone:"
|
||||
msgid "Telephone"
|
||||
msgstr "Telepon"
|
||||
|
||||
msgctxt "field:product.product,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,vsf_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_index:"
|
||||
msgid "Elasticsearch Index"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,vsf_elasticsearch_url:"
|
||||
msgid "Elasticsearch URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.vsf_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_grand_total"
|
||||
msgid "Grand Total"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_unique"
|
||||
msgid "The Vue Storefront identifier must be unique for each record."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_invalid_tax_identifier"
|
||||
msgid "The number \"%(code)s\" is not a valid tax identifier."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_login_wrong"
|
||||
msgid "You did not sign in correctly or your account is temporarily disabled."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shipping"
|
||||
msgid "Shipping"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_subtotal"
|
||||
msgid "Subtotal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_tax"
|
||||
msgid "Tax"
|
||||
msgstr "Pajak"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_unknown_country_code"
|
||||
msgid "The country code \"%(code)s\" is not known."
|
||||
msgstr "Kode negara \"%(code)s\" tidak diketahui."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_vsf_identifier"
|
||||
msgid "Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.vsf_identifier,name:"
|
||||
msgid "Web Shop Vue Storefront Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Vue Storefront"
|
||||
msgstr ""
|
||||
Loaded 100 of 1253 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user