Initial import from Docker volume

This commit is contained in:
root
2025-12-26 13:11:43 +00:00
commit 4998dc066a
13336 changed files with 1767801 additions and 0 deletions

View File

@@ -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')

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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"))

View File

@@ -0,0 +1,164 @@
# 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.Integer(
lazy_gettext('web_shop_shopify.msg_shopify_identifier'))
shopify_identifier_signed._sql_type = 'BIGINT'
shopify_identifier = fields.Function(fields.Integer(
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):
if value is not None:
value = int(value) - (1 << 63)
cls.write(records, {
'shopify_identifier_signed': value,
})
@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)

View File

@@ -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

18
modules/web_shop_shopify/ir.py Executable file
View File

@@ -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"),
])

30
modules/web_shop_shopify/ir.xml Executable file
View File

@@ -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>

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,334 @@
#
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 botiga"
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 "Botiga 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 "Botiga"
msgctxt "help:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "La unitat de mesura del producte a Shopify."
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "La unitat de mesura del producte a Shopify."
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 sha dutilitzar 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 dun identificador de Shopify per botiga 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 "Lalbarà no pot tenir més dun 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 unit of "
"measure without digits."
msgstr ""
"Per actualitzar el producte \"%(product)s\" a Shopify, heu d'utilitzar una "
"unitat de mesura 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 botiga \"%(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 dinventari 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"

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,341 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "Die Maßeinheit des Artikels bei Shopify."
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "Die Maßeinheit des Artikels bei Shopify."
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 unit of "
"measure 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"

View File

@@ -0,0 +1,334 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "La unidad de medida del producto en Shopify."
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "La unidad de medida del producto en Shopify."
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 unit of "
"measure without digits."
msgstr ""
"Para actualizar el producto \"%(product)s\" en Shopify, debe usar una unidad"
" de medida 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"

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,341 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "L'unité de mesure du produit sur Shopify."
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "L'unité de mesure du produit sur Shopify."
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 unit of "
"measure without digits."
msgstr ""
"Pour mettre à jour le produit « %(product)s » sur Shopify, vous devez "
"utiliser une unité de mesure 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"

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -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 "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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "De maateenheid van het product in Shopify."
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr "De maateenheid van het product in Shopify."
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)s\" 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 unit of "
"measure without digits."
msgstr ""
"Om product \"%(product)s\" op Shopify bij te werken, moet er een maateenheid"
" gebruikt worden zonder decimalen."
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"

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -0,0 +1,304 @@
#
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:product.product,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
msgstr ""
msgctxt "help:product.template,shopify_uom:"
msgid "The Unit of Measure of the product on Shopify."
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 unit of "
"measure 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 ""

View File

@@ -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 unit of measure 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>

113
modules/web_shop_shopify/party.py Executable file
View File

@@ -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'),
]

View File

@@ -0,0 +1,623 @@
# 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'},
help="The Unit of Measure of the product on Shopify.")
@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_name
if self.product:
attributes_name = self.product.attributes_name
else:
attributes_name = self.attributes_name
if attributes_name:
name += ' ' + attributes_name
return name

View File

@@ -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>

View File

@@ -0,0 +1,56 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import base64
import hashlib
import hmac
import logging
from trytond.protocols.wrappers import (
HTTPStatus, Response, abort, 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)

446
modules/web_shop_shopify/sale.py Executable file
View File

@@ -0,0 +1,446 @@
# 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 getattr(order, 'customer', None):
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 getattr(order, 'shipping_address', None):
sale.shipment_address = party.get_address_from_shopify(
order.shipping_address)
if getattr(order, 'billing_address', None):
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()
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()
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.unit, 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 getattr(line_item, 'variant_id', None):
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

View File

@@ -0,0 +1,34 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import time
from pyactiveresource.connection import ClientError
from shopify import Limits
from shopify.base import ShopifyConnection
from trytond.protocols.wrappers import HTTPStatus
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

172
modules/web_shop_shopify/stock.py Executable file
View File

@@ -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.unit, 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,
))

View File

@@ -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">stock.shipment.shopify_identifier</field>
<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">stock.shipment.shopify_identifier</field>
<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>

View File

@@ -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.

View File

@@ -0,0 +1,635 @@
=========================
Web Shop Shopify Scenario
=========================
Imports::
>>> 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
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, create_tax, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.modules.web_shop_shopify.product import Template
>>> from trytond.modules.web_shop_shopify.web import Shop
>>> from trytond.tests.tools import activate_modules, assertEqual
>>> FETCH_SLEEP, MAX_SLEEP = 1, 10
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::
>>> def get_shopify_metafields(self, shop):
... return {
... 'global.test': {
... 'value': self.name,
... },
... }
>>> Template.get_shopify_metafields = get_shopify_metafields
>>> 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]
>>> for _ in range(MAX_SLEEP):
... inventory_levels = location.inventory_levels()
... if inventory_levels and len(inventory_levels) == 2:
... break
... time.sleep(FETCH_SLEEP)
>>> 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')
>>> assertEqual(sale.carrier, carrier)
>>> sale.state
'quotation'
Capture full amount::
>>> transaction = order.capture('258.98')
>>> test_transaction_id = transaction.parent_id
>>> 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('do')
>>> 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 = sale.click('handle_shipment_exception')
>>> move = shipment_exception.form.recreate_moves.pop()
>>> shipment_exception.execute('handle')
>>> order.reload()
>>> order.fulfillment_status
'fulfilled'
>>> len(order.fulfillments)
1
>>> order.financial_status
'partially_refunded'
>>> sale.reload()
>>> invoice, = sale.invoices
>>> invoice.total_amount
Decimal('164.52')
>>> 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()
>>> assertEqual(invoice.total_amount, payment.amount)
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(FETCH_SLEEP)
>>> customer.destroy()
>>> shopify.ShopifyResource.clear_session()

View File

@@ -0,0 +1,227 @@
========================================
Web Shop Shopify Secondary Unit Scenario
========================================
Imports::
>>> import os
>>> import random
>>> import string
>>> import time
>>> from decimal import Decimal
>>> import shopify
>>> from shopify.api_version import ApiVersion
>>> from proteus import Model
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.tests.tools import activate_modules, assertEqual
>>> FETCH_SLEEP, MAX_SLEEP = 1, 10
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'),
... ])
... for _ in range(MAX_SLEEP):
... cron_fetch_order.click('run_once')
... if Sale.find([]):
... break
... time.sleep(FETCH_SLEEP)
>>> 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
>>> assertEqual(line.unit, unit)
>>> line.unit_price
Decimal('100.0000')
>>> line.secondary_quantity
50.0
>>> assertEqual(line.secondary_unit, cm)
>>> 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()

View File

@@ -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

View File

@@ -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)

View File

@@ -0,0 +1,30 @@
[tryton]
version=7.2.2
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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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" widget="selection"/>
<label name="sequence"/>
<field name="sequence"/>
<label name="gateway"/>
<field name="gateway"/>
</form>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

717
modules/web_shop_shopify/web.py Executable file
View File

@@ -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 getattr(template, 'images', None):
for image in template.images:
image.set_shopify_identifier(self)
def __shopify_update_images(self, template, shopify_product):
if not getattr(template, 'images', None):
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

View File

@@ -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">web.shop.shopify_identifier</field>
<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">web.shop.shopify_identifier</field>
<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="model">web.shop.shopify_identifier</field>
<field name="name">set_to_update</field>
<field name="string">Set to Update</field>
</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>