first commit

This commit is contained in:
root
2026-03-14 09:42:12 +00:00
commit 0adbd20c2c
10991 changed files with 1646955 additions and 0 deletions

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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,61 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, Workflow
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
@ModelView.button
@Workflow.transition('posted')
def post(cls, invoices):
pool = Pool()
Move = pool.get('stock.move')
transaction = Transaction()
context = transaction.context
super().post(invoices)
moves = sum(
(l.stock_component_moves for i in invoices for l in i.lines), [])
if moves:
with transaction.set_context(
queue_batch=context.get('queue_batch', True)):
Move.__queue__.update_unit_price(moves)
class InvoiceLine(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
@property
def stock_component_moves(self):
return []
class InvoiceLineSale(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
@property
def stock_component_moves(self):
pool = Pool()
SaleLine = pool.get('sale.line')
moves = super().stock_component_moves
if isinstance(self.origin, SaleLine):
for component in self.origin.components:
moves.extend(component.moves)
return moves
class InvoiceLinePurchase(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
@property
def stock_component_moves(self):
pool = Pool()
PurchaseLine = pool.get('purchase.line')
moves = super().stock_component_moves
if isinstance(self.origin, PurchaseLine):
for component in self.origin.components:
moves.extend(component.moves)
return moves

View File

@@ -0,0 +1,478 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from collections import defaultdict
from decimal import Decimal
from functools import wraps
from trytond.model import ModelStorage, ModelView, Workflow, fields
from trytond.pool import Pool
from trytond.pyson import Eval
def get_shipments_returns(model_name):
def _get_shipments_returns(func):
@wraps(func)
def wrapper(self, name):
pool = Pool()
Model = pool.get(model_name)
shipments = set(func(self, name))
for line in self.lines:
for component in line.components:
for move in component.moves:
if isinstance(move.shipment, Model):
shipments.add(move.shipment.id)
return list(shipments)
return wrapper
return _get_shipments_returns
def search_shipments_returns(model_name):
def _search_shipments_returns(func):
@wraps(func)
def wrapper(cls, name, clause):
domain = func(cls, name, clause)
_, operator, operand, *extra = clause
nested = clause[0][len(name):]
if not nested:
if isinstance(operand, str):
nested = '.rec_name'
else:
nested = '.id'
return ['OR',
domain,
('lines.components.moves.shipment' + nested,
operator, operand, model_name, *extra),
]
return wrapper
return _search_shipments_returns
def get_moves(func):
@wraps(func)
def wrapper(self, name):
return func(self, name) + [
m.id for l in self.lines for c in l.components for m in c.moves]
return wrapper
def search_moves(func):
@wraps(func)
def wrapper(cls, name, clause):
return ['OR',
func(cls, name, clause),
('lines.components.' + clause[0], *clause[1:]),
]
return wrapper
def order_mixin(prefix):
class OrderMixin(ModelStorage):
@classmethod
def copy(cls, records, default=None):
pool = Pool()
Line = pool.get(prefix + '.line')
if default is None:
default = {}
else:
default = default.copy()
default.setdefault(
'lines.component_parent',
lambda data: data['component_parent'])
records = super().copy(records, default=default)
lines = []
for record in records:
for line in record.lines:
if line.component_parent:
lines.append(line)
Line.delete(lines)
return records
@classmethod
@ModelView.button
@Workflow.transition('draft')
def draft(cls, records):
pool = Pool()
Line = pool.get(prefix + '.line')
to_delete = []
to_save = []
for record in records:
for line in record.lines:
if line.component_parent:
to_delete.append(line)
elif line.components:
line.components = None
to_save.append(line)
Line.save(to_save)
super().draft(records)
Line.delete(to_delete)
@classmethod
@ModelView.button
@Workflow.transition('quotation')
def quote(cls, records):
pool = Pool()
Line = pool.get(prefix + '.line')
removed = []
for record in records:
removed.extend(record.set_components())
Line.delete(removed)
cls.save(records)
super().quote(records)
def set_components(self):
pool = Pool()
Component = pool.get(prefix + '.line.component')
removed = []
lines = []
sequence = 0
for line in self.lines:
if line.component_parent:
removed.append(line)
continue
sequence += 1
line.sequence = sequence
lines.append(line)
if line.product and line.product.components_used:
if line.product.type == 'kit':
components = []
for component in line.product.components_used:
components.append(line.get_component(component))
Component.set_price_ratio(components, line.quantity)
line.components = components
else:
for component in line.product.components_used:
order_line = line.get_component_order_line(
component)
sequence += 1
order_line.sequence = sequence
order_line.component_parent = line
lines.append(order_line)
self.lines = lines
return removed
return OrderMixin
def order_line_mixin(prefix):
class OrderLineMixin(ModelStorage, ModelView):
component_parent = fields.Many2One(
prefix + '.line', "Component Parent",
readonly=True,
states={
'invisible': ~Eval('component_parent'),
})
component_children = fields.One2Many(
prefix + '.line', 'component_parent', "Component Children",
readonly=True,
states={
'invisible': ~Eval('component_children'),
})
components = fields.One2Many(
prefix + '.line.component', 'line', "Components", readonly=True,
states={
'invisible': ~Eval('components', []),
})
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//page[@id="components"]', 'states', {
'invisible': (
~Eval('components', [])
& ~Eval('component_children', [])),
}),
]
@classmethod
def copy(cls, lines, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('component_parent')
default.setdefault('component_children')
default.setdefault('components')
return super().copy(lines, default=default)
def get_component(self, component, **kwargs):
pool = Pool()
Component = pool.get(prefix + '.line.component')
line = component.get_line(
Component, self.quantity, self.unit, **kwargs)
line.fixed = component.fixed
if not line.fixed:
line.quantity_ratio = component.quantity
return line
def get_component_order_line(self, component, **values):
Line = self.__class__
line = component.get_line(
Line, self.quantity, self.unit, **values)
line.type = 'line'
line.on_change_product()
return line
def get_move(self, type_):
move = super().get_move(type_)
if self.components:
move = None
return move
def get_moves_exception(self, name):
exception = super().get_moves_exception(name)
if self.components:
exception = any(c.moves_exception for c in self.components)
return exception
def get_moves_progress(self, name):
progress = super().get_moves_progress(name)
if self.components:
if any(c.moves_progress is not None for c in self.components):
progress = 0.
n = 0
for component in self.components:
if component.moves_progress is not None:
progress += component.moves_progress
n += 1
progress = round(progress / n, 4)
else:
progress = None
return progress
def _get_invoice_line_quantity(self):
quantity = super()._get_invoice_line_quantity()
if (getattr(self, prefix).invoice_method == 'shipment'
and self.components):
ratio = min(c.get_moved_ratio() for c in self.components)
quantity = self.unit.round(self.quantity * ratio)
return quantity
return OrderLineMixin
def order_line_component_mixin(prefix):
class OrderLineComponentMixin(ModelStorage):
line = fields.Many2One(
prefix + '.line', "Line", required=True, ondelete='CASCADE',
domain=[
('product.type', '=', 'kit'),
])
line_state = fields.Function(
fields.Selection('get_line_states', "Line State"),
'on_change_with_line_state', searcher='search_line_state')
moves = fields.One2Many('stock.move', 'origin', 'Moves', readonly=True)
moves_ignored = fields.Many2Many(
prefix + '.line.component-ignored-stock.move',
'component', 'move', "Ignored Moves", readonly=True)
moves_recreated = fields.Many2Many(
prefix + '.line.component-recreated-stock.move',
'component', 'move', "Recreated Moves", readonly=True)
moves_exception = fields.Function(
fields.Boolean('Moves Exception'), 'get_moves_exception')
moves_progress = fields.Function(
fields.Float("Moves Progress", digits=(1, 4)),
'get_moves_progress')
quantity_ratio = fields.Float(
"Quantity Ratio", readonly=True,
states={
'required': ~Eval('fixed', False),
})
price_ratio = fields.Numeric(
"Price Ratio", readonly=True, required=True)
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.add('line')
@classmethod
def get_line_states(cls):
pool = Pool()
Line = pool.get(f'{prefix}.line')
return getattr(Line, f'get_{prefix}_states')()
@fields.depends('line', f'_parent_line.{prefix}_state')
def on_change_with_line_state(self, name=None):
if self.line:
return getattr(self.line, f'{prefix}_state')
@classmethod
def search_line_state(cls, name, clause):
return [(f'line.{prefix}_state', *clause[1:])]
@fields.depends('line', '_parent_line.product')
def on_change_with_parent_type(self, name=None):
if self.line and self.line.product:
return self.line.product.type
@classmethod
def set_price_ratio(cls, components, quantity):
"Set price ratio between components"
pool = Pool()
Uom = pool.get('product.uom')
list_prices = defaultdict(Decimal)
sum_ = 0
for component in components:
product = component.product
list_price = Uom.compute_price(
product.default_uom, product.list_price_used or 0,
component.unit)
if component.fixed:
list_price *= Decimal(str(component.quantity / quantity))
else:
list_price *= Decimal(str(component.quantity_ratio))
list_prices[component] = list_price
sum_ += list_price
for component in components:
if sum_:
ratio = list_prices[component] / sum_
else:
ratio = Decimal(1) / len(components)
if component.fixed:
ratio /= Decimal(str(component.quantity / quantity))
else:
ratio /= Decimal(str(component.quantity_ratio))
component.price_ratio = ratio
def get_move(self, type_):
raise NotImplementedError
def _get_shipped_quantity(self, shipment_type):
'Return the quantity already shipped'
pool = Pool()
Uom = pool.get('product.uom')
quantity = 0
skips = set(self.moves_recreated)
for move in self.moves:
if move not in skips:
quantity += Uom.compute_qty(
move.unit, move.quantity, self.unit)
return quantity
@property
def _move_remaining_quantity(self):
"Compute the remaining quantity to ship"
pool = Pool()
Uom = pool.get('product.uom')
ignored = set(self.moves_ignored)
quantity = abs(self.quantity)
for move in self.moves:
if move.state == 'done' or move in ignored:
quantity -= Uom.compute_qty(
move.unit, move.quantity, self.unit)
return quantity
def get_moves_exception(self, name):
skips = set(self.moves_ignored)
skips.update(self.moves_recreated)
return any(
m.state == 'cancelled' for m in self.moves if m not in skips)
def get_moves_progress(self, name):
progress = None
quantity = self._move_remaining_quantity
if quantity is not None and self.quantity:
progress = round(
(abs(self.quantity) - quantity) / abs(self.quantity), 4)
progress = max(0., min(1., progress))
return progress
def get_moved_ratio(self):
pool = Pool()
Uom = pool.get('product.uom')
quantity = 0
for move in self.moves:
if move.state != 'done':
continue
qty = Uom.compute_qty(move.unit, move.quantity, self.unit)
dest_type = self.line.to_location.type
if (move.to_location.type == dest_type
and move.from_location.type != dest_type):
quantity += qty
elif (move.from_location.type == dest_type
and move.to_location.type != dest_type):
quantity -= qty
if self.quantity < 0:
quantity *= -1
return quantity / self.quantity
def get_rec_name(self, name):
return super().get_rec_name(name) + (
' @ %s' % self.line.rec_name)
@classmethod
def search_rec_name(cls, name, clause):
return super().search_rec_name(name, clause) + [
('line.rec_name',) + tuple(clause[1:]),
]
return OrderLineComponentMixin
def handle_shipment_exception_mixin(prefix):
class HandleShipmentExceptionMixin:
def default_ask(self, fields):
values = super().default_ask(fields)
moves = values['domain_moves']
for line in self.record.lines:
for component in line.components:
skips = set(component.moves_ignored)
skips.update(component.moves_recreated)
for move in component.moves:
if move.state == 'cancelled' and move not in skips:
moves.append(move.id)
return values
def transition_handle(self):
pool = Pool()
Component = pool.get(prefix + '.line.component')
result = super().transition_handle()
to_write = []
for line in self.record.lines:
for component in line.components:
moves_ignored = []
moves_recreated = []
skips = set(component.moves_ignored)
skips.update(component.moves_recreated)
for move in component.moves:
if move not in self.ask.domain_moves or move in skips:
continue
if move in self.ask.recreate_moves:
moves_recreated.append(move.id)
else:
moves_ignored.append(move.id)
if moves_ignored or moves_recreated:
to_write.append([component])
to_write.append({
'moves_ignored': [('add', moves_ignored)],
'moves_recreated': [('add', moves_recreated)],
})
if to_write:
Component.write(*to_write)
return result
return HandleShipmentExceptionMixin
class AmendmentLineMixin:
__slots__ = ()
def _apply_line(self, record, line):
pool = Pool()
Uom = pool.get('product.uom')
super()._apply_line(record, line)
if line.components:
quantity = Uom.compute_qty(
line.unit, line.quantity,
line.product.default_uom, round=False)
for component in line.components:
if not component.fixed:
component.quantity = component.unit.round(
quantity * component.quantity_ratio)
line.components = line.components

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,284 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr "Fix"
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr "Variant pare"
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr "Producte pare"
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr "Tipus de pare"
msgctxt "field:product.component,product:"
msgid "Product"
msgstr "Producte"
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoria de les unitats del producte"
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr "Quantitat"
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr "Unitat"
msgctxt "field:product.product,components:"
msgid "Components"
msgstr "Components"
msgctxt "field:product.template,components:"
msgid "Components"
msgstr "Components"
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr "Components fills"
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr "Component pare"
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr "Components"
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr "Fix"
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr "Línia"
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr "Estat línia"
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr "Moviments"
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Moviments en excepció"
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Moviments ignorats"
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progres dels moviments"
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Moviments recreats"
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr "Tipus pare"
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Rati del preu"
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr "Producte"
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoria de les unitats del producte"
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Quantitat"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Rati de la quantitat"
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr "Unitat"
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Moviment"
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Moviment"
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr "Component fill"
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr "Component pare"
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr "Components"
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr "Fix"
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr "Línia"
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr "Estat línia"
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Moviments"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Moviments en excepció"
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Moviments ignorats"
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progres dels moviments"
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Moviments recreats"
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr "Tipus pare"
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Rati de preu"
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Producte"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoria de les unitats del producte"
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Quantitat"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Rati de la quantitat"
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr "Unitat"
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Moviment"
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr "Component de la línia de venda"
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Moviment"
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marca perque la quantitat del component sigui independent de la quantitat "
"del kit."
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marca perque la quantitat del component sigui independent de la quantitat "
"del kit."
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marca perque la quantitat del component sigui independent de la quantitat "
"del kit."
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr "Component del producte"
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr "Component de línia de compra"
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr "Component de línia de compra - Moviment ignorat"
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr "Component de línia de compra - Moviment recreat"
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr "Component de la línia de venda"
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr "Component de línia de venda - Moviment ignorat"
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr "Component de la línia de venda - Moviment recreat"
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "view:purchase.line:"
msgid "Components"
msgstr "Components"
msgctxt "view:sale.line:"
msgid "Components"
msgstr "Components"

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,284 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr "Feste Menge"
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr "Übergeordnete Variante"
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr "Übergeordneter Artikel"
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr "Übergeordneter Typ"
msgctxt "field:product.component,product:"
msgid "Product"
msgstr "Artikel"
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Artikel Maßeinheitenkategorie"
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr "Menge"
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr "Einheit"
msgctxt "field:product.product,components:"
msgid "Components"
msgstr "Komponenten"
msgctxt "field:product.template,components:"
msgid "Components"
msgstr "Komponenten"
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr "Untergeordnete Komponenten"
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr "Übergeordnete Komponente"
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr "Komponenten"
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr "Fix"
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr "Position"
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr "Positionsstatus"
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr "Warenbewegungen"
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Warenbewegungen mit Vorbehalt"
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Ignorierte Warenbewegungen"
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Lieferfortschritt"
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Neu erstellte Warenbewegungen"
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr "Übergeordneter Typ"
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Preisverhältnis"
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr "Artikel"
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Artikel Maßeinheitenkategorie"
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Menge"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Mengenverhältnis"
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr "Einheit"
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Komponente"
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Warenbewegung"
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr "Komponente"
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Warenbewegung"
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr "Untergeordnete Komponenten"
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr "Übergeordnete Komponente"
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr "Komponenten"
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr "Fix"
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr "Position"
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr "Positionsstatus"
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Warenbewegungen"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Warenbewegungen mit Vorbehalt"
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Ignorierte Warenbewegungen"
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Lieferfortschritt"
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Neu erstellte Warenbewegungen"
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr "Übergeordneter Typ"
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Preisverhältnis"
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Artikel"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Artikel Maßeinheitenkategorie"
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Menge"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Mengenverhältnis"
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr "Einheit"
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Komponente"
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Warenbewegung"
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr "Verkaufsposition Komponente"
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Warenbewegung"
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
"machen."
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
"machen."
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
"machen."
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr "Artikel Komponente"
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr "Einkaufsposition Komponente"
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr "Einkaufsposition Komponente - Ignoriert - Warenbewegung"
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr "Einkaufsposition Komponente - Wiederhergestellt - Warenbewegung"
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr "Verkaufsposition Komponente"
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr "Verkaufsposition Komponente - Ignoriert - Warenbewegung"
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr "Verkaufsposition Komponente - Wiederhergestellt - Warenbewegung"
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "view:purchase.line:"
msgid "Components"
msgstr "Komponenten"
msgctxt "view:sale.line:"
msgid "Components"
msgstr "Komponenten"

View File

@@ -0,0 +1,284 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr "Fijo"
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr "Variante padre"
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr "Producto padre"
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr "Tipo de padre"
msgctxt "field:product.component,product:"
msgid "Product"
msgstr "Producto"
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoría de unidades del producto"
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr "Cantidad"
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr "Unidad"
msgctxt "field:product.product,components:"
msgid "Components"
msgstr "Componentes"
msgctxt "field:product.template,components:"
msgid "Components"
msgstr "Componentes"
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr "Componentes hijos"
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr "Componente padre"
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr "Componentes"
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr "Fijo"
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr "Línea"
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr "Estado Linea"
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr "Movimientos"
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Movimientos en excepción"
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Movimientos ignorados"
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progreso de los movimientos"
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Movimientos recreados"
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr "Tipo padre"
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Ratio de precio"
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr "Producto"
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoría de la unidad del producto"
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Cantidad"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Ratio de la cantidad"
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr "Unidad"
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Componente"
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr "Componente"
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr "Componentes hijos"
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr "Componente padre"
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr "Componentes"
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr "Fijo"
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr "Línea"
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr "Estado Linea"
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Movimientos"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Movimientos en excepción"
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Movimientos ignorados"
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progreso de los movimientos"
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Movimientos recreados"
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr "Tipo padre"
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Ratio de precio"
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Producto"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categoría de la unidad del producto"
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Cantidad"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Ratio de la cantidad"
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr "Unidad"
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Componente"
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr "Componente de línea de venta"
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marcar para hacer la cantidad del componente independiente de la cantidad "
"del kit."
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marcar para hacer la cantidad del componente independiente de la cantidad "
"del kit."
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Marcar para hacer la cantidad del componente independiente de la cantidad "
"del kit."
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr "Componente del producto"
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr "Componente de línea de compra"
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr "Componente de línea de compra - Movimiento ignorado"
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr "Componente de línea de compra - Movimiento recreado"
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr "Componente de línea de venta"
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr "Componente de línea de venta - Movimiento ignorado"
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr "Componente de línea de venta - Movimiento recreado"
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "view:purchase.line:"
msgid "Components"
msgstr "Componentes"
msgctxt "view:sale.line:"
msgid "Components"
msgstr "Componentes"

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,284 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr "Fixe"
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr "Variante parent"
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr "Produit parent"
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr "Type de parent"
msgctxt "field:product.component,product:"
msgid "Product"
msgstr "Produit"
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Catégorie d'unité du produit"
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr "Quantité"
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr "Unité"
msgctxt "field:product.product,components:"
msgid "Components"
msgstr "Composants"
msgctxt "field:product.template,components:"
msgid "Components"
msgstr "Composants"
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr "Composants enfants"
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr "Composant parent"
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr "Composants"
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr "Fixe"
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr "Ligne"
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr "État de la ligne"
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr "Mouvements"
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Mouvements en exception"
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Mouvements ignorés"
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progression des mouvements"
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Mouvements recréés"
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr "Type de parent"
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Rapport de prix"
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr "Produit"
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Catégorie d'unité du produit"
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Quantité"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Rapport de quantité"
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr "Unité"
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Composant"
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Mouvement"
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr "Composant"
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Mouvement"
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr "Composants enfants"
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr "Composant parent"
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr "Composants"
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr "Fixe"
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr "Ligne"
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr "État de la ligne"
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Mouvements"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Mouvements en exception"
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Mouvements ignorés"
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Progression des mouvements"
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Mouvements recréés"
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr "Type de parent"
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Rapport de prix"
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Produit"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Catégorie d'unité du produit"
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Quantité"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Rapport de quantité"
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr "Unité"
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Composant"
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Mouvement"
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr "Composant de ligne de vente"
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Mouvement"
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Cochez pour que la quantité du composant soit indépendante de la quantité du"
" kit."
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Cochez pour que la quantité du composant soit indépendante de la quantité du"
" kit."
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Cochez pour que la quantité du composant soit indépendante de la quantité du"
" kit."
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr "Composant de produit"
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr "Composant de ligne d'achat"
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr "Composant de ligne d'achat - Ignoré - Mouvement de stock"
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr "Composant de ligne d'achat - Recréé - Mouvement de stock"
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr "Composant de ligne de vente"
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr "Composant de ligne de vente - Ignoré - Mouvement de stock"
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr "Composant de ligne de vente - Recréé - Mouvement de stock"
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "view:purchase.line:"
msgid "Components"
msgstr "Composants"
msgctxt "view:sale.line:"
msgid "Components"
msgstr "Composants"

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Produk"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Quantità"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Movimenti"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Quantità"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,284 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr "Vast"
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr "Bovenliggende variant"
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr "Bovenliggend product"
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr "Oudertype"
msgctxt "field:product.component,product:"
msgid "Product"
msgstr "Product"
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categorie producteenheid"
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr "Hoeveelheid"
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr "Eenheid"
msgctxt "field:product.product,components:"
msgid "Components"
msgstr "Componenten"
msgctxt "field:product.template,components:"
msgid "Components"
msgstr "Componenten"
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr "Onderliggende componenten"
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr "bovenliggende componenten"
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr "Componenten"
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr "Vast"
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr "Regel"
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr "Regel status"
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr "Mutaties"
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Mutaties Uitzondering"
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Genegeerde Mutaties"
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Mutaties Voortgang"
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Opnieuw aangemaakte mutaties"
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr "Oudertype"
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Prijsverhouding"
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr "Product"
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categorie producteenheid"
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr "Hoeveelheid"
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Hoeveelheidsverhouding"
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr "Eenheid"
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Mutatie"
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Mutatie"
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr "Onderliggende componenten"
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr "bovenliggende componenten"
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr "Componenten"
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr "Vast"
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr "Regel"
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr "Regel status"
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr "Mutaties"
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr "Mutaties Uitzondering"
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr "Genegeerde mutaties"
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr "Mutaties Voortgang"
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr "Opnieuw aangemaakte mutaties"
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr "Oudertype"
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr "Prijsverhouding"
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr "Product"
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr "Categorie producteenheid"
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr "Hoeveelheid"
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr "Hoeveelheidsverhouding"
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr "Eenheid"
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr "Component"
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr "Mutatie"
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr "Verkooplijncomponent"
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr "Mutatie"
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Vink aan om de hoeveelheid van het onderdeel onafhankelijk te maken van de "
"hoeveelheid in de kit."
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Vink aan om de hoeveelheid van het onderdeel onafhankelijk te maken van de "
"hoeveelheid in de kit."
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
"Vink aan om de hoeveelheid van het onderdeel onafhankelijk te maken van de "
"hoeveelheid in de kit."
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr "Product onderdeel"
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr "Inkoopregel onderdeel"
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr "Inkoopregel onderdeel - Genegeerd - Voorraad boeking"
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr "Inkoopregel onderdeel - Opnieuw aangemaakt - Voorraad boeking"
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr "Verkoopregel onderdeel"
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr "Verkoopregel onderdeel - Genegeerd - Voorraad boeking"
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr "Verkoopregel onderdeel - Opnieuw aangemaakt - Voorraad boeking"
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr "Kit"
msgctxt "view:purchase.line:"
msgid "Components"
msgstr "Componenten"
msgctxt "view:sale.line:"
msgid "Components"
msgstr "Componenten"

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,278 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:product.component,parent_product:"
msgid "Parent Variant"
msgstr ""
msgctxt "field:product.component,parent_template:"
msgid "Parent Product"
msgstr ""
msgctxt "field:product.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:product.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:product.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:product.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:product.product,components:"
msgid "Components"
msgstr ""
msgctxt "field:product.template,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:purchase.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:purchase.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:purchase.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:purchase.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:purchase.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:purchase.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:purchase.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:purchase.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:purchase.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:purchase.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:purchase.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:purchase.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:purchase.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:purchase.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:purchase.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:purchase.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:purchase.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line,component_children:"
msgid "Component Children"
msgstr ""
msgctxt "field:sale.line,component_parent:"
msgid "Component Parent"
msgstr ""
msgctxt "field:sale.line,components:"
msgid "Components"
msgstr ""
msgctxt "field:sale.line.component,fixed:"
msgid "Fixed"
msgstr ""
msgctxt "field:sale.line.component,line:"
msgid "Line"
msgstr ""
msgctxt "field:sale.line.component,line_state:"
msgid "Line State"
msgstr ""
msgctxt "field:sale.line.component,moves:"
msgid "Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_exception:"
msgid "Moves Exception"
msgstr ""
msgctxt "field:sale.line.component,moves_ignored:"
msgid "Ignored Moves"
msgstr ""
msgctxt "field:sale.line.component,moves_progress:"
msgid "Moves Progress"
msgstr ""
msgctxt "field:sale.line.component,moves_recreated:"
msgid "Recreated Moves"
msgstr ""
msgctxt "field:sale.line.component,parent_type:"
msgid "Parent Type"
msgstr ""
msgctxt "field:sale.line.component,price_ratio:"
msgid "Price Ratio"
msgstr ""
msgctxt "field:sale.line.component,product:"
msgid "Product"
msgstr ""
msgctxt "field:sale.line.component,product_unit_category:"
msgid "Product Unit Category"
msgstr ""
msgctxt "field:sale.line.component,quantity:"
msgid "Quantity"
msgstr ""
msgctxt "field:sale.line.component,quantity_ratio:"
msgid "Quantity Ratio"
msgstr ""
msgctxt "field:sale.line.component,unit:"
msgid "Unit"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,component:"
msgid "Component"
msgstr ""
msgctxt "field:sale.line.component-ignored-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,component:"
msgid "Sale Line Component"
msgstr ""
msgctxt "field:sale.line.component-recreated-stock.move,move:"
msgid "Move"
msgstr ""
msgctxt "help:product.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:purchase.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "help:sale.line.component,fixed:"
msgid ""
"Check to make the quantity of the component independent of the kit quantity."
msgstr ""
msgctxt "model:product.component,string:"
msgid "Product Component"
msgstr ""
msgctxt "model:purchase.line.component,string:"
msgid "Purchase Line Component"
msgstr ""
msgctxt "model:purchase.line.component-ignored-stock.move,string:"
msgid "Purchase Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:purchase.line.component-recreated-stock.move,string:"
msgid "Purchase Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "model:sale.line.component,string:"
msgid "Sale Line Component"
msgstr ""
msgctxt "model:sale.line.component-ignored-stock.move,string:"
msgid "Sale Line Component - Ignored - Stock Move"
msgstr ""
msgctxt "model:sale.line.component-recreated-stock.move,string:"
msgid "Sale Line Component - Recreated - Stock Move"
msgstr ""
msgctxt "selection:product.product,type:"
msgid "Kit"
msgstr ""
msgctxt "selection:product.template,type:"
msgid "Kit"
msgstr ""
msgctxt "view:purchase.line:"
msgid "Components"
msgstr ""
msgctxt "view:sale.line:"
msgid "Components"
msgstr ""

View File

@@ -0,0 +1,283 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from trytond.model import (
ModelSQL, ModelStorage, ModelView, fields, sequence_ordered)
from trytond.modules.product import round_price
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Bool, Eval, If
class Template(metaclass=PoolMeta):
__name__ = "product.template"
components = fields.One2Many(
'product.component', 'parent_template', "Components")
@classmethod
def __setup__(cls):
super().__setup__()
cls.type.selection.append(('kit', "Kit"))
@classmethod
def _cost_price_method_domain_per_type(cls):
types_cost_method = super()._cost_price_method_domain_per_type()
types_cost_method['kit'] = [('cost_price_method', '=', 'fixed')]
return types_cost_method
@fields.depends('type', 'cost_price_method')
def on_change_type(self):
super().on_change_type()
if self.type == 'kit':
self.cost_price_method = 'fixed'
@classmethod
def copy(cls, templates, default=None):
pool = Pool()
Component = pool.get('product.component')
if default is None:
default = {}
else:
default = default.copy()
copy_components = 'components' not in default
default.setdefault('components', None)
new_templates = super().copy(templates, default)
if copy_components:
old2new = {}
to_copy = []
for template, new_template in zip(templates, new_templates):
to_copy.extend(
c for c in template.components if not c.parent_product)
old2new[template.id] = new_template.id
if to_copy:
Component.copy(to_copy, {
'parent_template': (lambda d:
old2new[d['parent_template']]),
})
return new_templates
class Product(metaclass=PoolMeta):
__name__ = "product.product"
components = fields.One2Many(
'product.component', 'parent_product', "Components")
def get_multivalue(self, name, **pattern):
pool = Pool()
Uom = pool.get('product.uom')
value = super().get_multivalue(name, **pattern)
if name == 'cost_price' and self.type == 'kit':
value = Decimal(0)
for component in self.components_used:
cost_price = component.product.get_multivalue(
'cost_price', **pattern)
cost_price = Uom.compute_price(
component.product.default_uom, cost_price, component.unit)
value += cost_price * Decimal(str(component.quantity))
value = round_price(value)
return value
@property
def components_used(self):
if self.components:
yield from self.components
else:
for component in self.template.components:
if not component.parent_product:
yield component
@classmethod
def get_quantity(cls, products, name):
pool = Pool()
Uom = pool.get('product.uom')
kits = [p for p in products if p.type == 'kit']
quantities = super().get_quantity(products, name)
for kit in kits:
qties = []
for component in kit.components_used:
component_qty = Uom.compute_qty(
component.product.default_uom,
getattr(component.product, name),
component.unit, round=False)
if not component.fixed:
component_qty /= component.quantity
qties.append(component_qty)
quantities[kit.id] = kit.default_uom.floor(min(qties, default=0))
return quantities
@classmethod
def copy(cls, products, default=None):
pool = Pool()
Component = pool.get('product.component')
if default is None:
default = {}
else:
default = default.copy()
copy_components = 'components' not in default
if 'template' in default:
default.setdefault('components', None)
new_products = super().copy(products, default)
if 'template' in default and copy_components:
template2new = {}
product2new = {}
to_copy = []
for product, new_product in zip(products, new_products):
if product.components:
to_copy.extend(product.components)
template2new[product.template.id] = new_product.template.id
product2new[product.id] = new_product.id
if to_copy:
Component.copy(to_copy, {
'parent_product': (lambda d:
product2new[d['parent_product']]),
'parent_template': (lambda d:
template2new[d['parent_template']]),
})
return new_products
class ComponentMixin(sequence_ordered(), ModelStorage):
parent_type = fields.Function(fields.Selection(
'get_product_types', "Parent Type"), 'on_change_with_parent_type')
product = fields.Many2One(
'product.product', "Product", required=True,
domain=[
('components', '=', None),
('template.components', '=', None),
If(Eval('parent_type') == 'kit',
('type', '=', 'goods'),
()),
])
product_unit_category = fields.Function(
fields.Many2One('product.uom.category', "Product Unit Category"),
'on_change_with_product_unit_category')
quantity = fields.Float("Quantity", digits='unit', required=True)
unit = fields.Many2One('product.uom', "Unit", required=True,
domain=[
If(Bool(Eval('product_unit_category')),
('category', '=', Eval('product_unit_category')),
('category', '!=', -1)),
],
depends={'product'})
fixed = fields.Boolean("Fixed",
help="Check to make the quantity of the component independent "
"of the kit quantity.")
@classmethod
def get_product_types(cls):
pool = Pool()
Product = pool.get('product.product')
return Product.fields_get(['type'])['type']['selection']
def on_change_with_parent_type(self, name):
raise NotImplementedError
@property
def parent_uom(self):
raise NotImplementedError
@fields.depends('product', 'unit', 'quantity',
methods=['on_change_with_product_unit_category'])
def on_change_product(self):
if self.product:
self.product_unit_category = (
self.on_change_with_product_unit_category())
if (not self.unit
or self.unit.category != self.product_unit_category):
self.unit = self.product.default_uom
@fields.depends('product')
def on_change_with_product_unit_category(self, name=None):
return self.product.default_uom.category if self.product else None
def get_line(self, Line, quantity, unit, **values):
pool = Pool()
Uom = pool.get('product.uom')
line = Line(product=self.product, **values)
line.unit = self.unit
if self.fixed:
line.quantity = self.quantity
else:
quantity = Uom.compute_qty(
unit, quantity, self.parent_uom, round=False)
line.quantity = self.unit.round(quantity * self.quantity)
return line
def get_rec_name(self, name):
pool = Pool()
Lang = pool.get('ir.lang')
lang = Lang.get()
return (lang.format_number_symbol(
self.quantity, self.unit, digits=self.unit.digits)
+ ' %s' % self.product.rec_name)
@classmethod
def search_rec_name(cls, name, clause):
return [
('product.rec_name', *clause[1:]),
]
class Component(ComponentMixin, ModelSQL, ModelView):
__name__ = "product.component"
parent_template = fields.Many2One(
'product.template', "Parent Product",
required=True, ondelete='CASCADE',
domain=[
If(Bool(Eval('parent_product')),
('products', '=', Eval('parent_product')),
()),
])
parent_product = fields.Many2One(
'product.product', "Parent Variant", ondelete='CASCADE',
domain=[
If(Bool(Eval('parent_template')),
('template', '=', Eval('parent_template')),
()),
])
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.add('parent_template')
@fields.depends(
'parent_product', '_parent_parent_product.template')
def on_change_parent_product(self):
if self.parent_product:
self.parent_template = self.parent_product.template
@fields.depends(
'parent_template', '_parent_parent_template.type',
'parent_product', '_parent_parent_product.type')
def on_change_with_parent_type(self, name=None):
if self.parent_product:
return self.parent_product.type
elif self.parent_template:
return self.parent_template.type
@property
def parent_uom(self):
if self.parent_product:
return self.parent_product.default_uom
elif self.parent_template:
return self.parent_template.default_uom
def get_rec_name(self, name):
return super().get_rec_name(name) + (
' @ %s' % (
self.parent_product.rec_name if self.parent_product
else self.parent_template.rec_name))
@classmethod
def search_rec_name(cls, name, clause):
return super().search_rec_name(name, clause) + [
('parent_product.rec_name',) + tuple(clause[1:]),
('parent_template.rec_name',) + tuple(clause[1:]),
]

View File

@@ -0,0 +1,26 @@
<?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_component_view_list">
<field name="model">product.component</field>
<field name="type">tree</field>
<field name="name">product_component_list</field>
</record>
<record model="ir.ui.view" id="product_component_view_form">
<field name="model">product.component</field>
<field name="type">form</field>
<field name="name">product_component_form</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,205 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from trytond.i18n import gettext
from trytond.model import ModelSQL, ModelView, fields
from trytond.modules.product import round_price
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
from .common import (
AmendmentLineMixin, get_moves, get_shipments_returns,
handle_shipment_exception_mixin, order_line_component_mixin,
order_line_mixin, order_mixin, search_moves, search_shipments_returns)
from .product import ComponentMixin
class Purchase(order_mixin('purchase'), metaclass=PoolMeta):
__name__ = 'purchase.purchase'
def create_move(self, move_type):
moves = super().create_move(move_type)
for line in self.lines:
if line.components:
for component in line.components:
move = component.get_move(move_type)
if move:
moves.append(move)
return moves
@get_shipments_returns('stock.shipment.in')
def get_shipments(self, name):
return super().get_shipments(name)
@get_shipments_returns('stock.shipment.in.return')
def get_shipment_returns(self, name):
return super().get_shipment_returns(name)
@classmethod
@search_shipments_returns('stock.shipment.in')
def search_shipments(cls, name, clause):
return super().search_shipments(name, clause)
@classmethod
@search_shipments_returns('stock.shipment.in.return')
def search_shipment_returns(cls, name, clause):
return super().search_shipment_returns(name, clause)
@get_moves
def get_moves(self, name):
return super().get_moves(name)
@classmethod
@search_moves
def search_moves(cls, name, clause):
return super().search_moves(name, clause)
class Line(order_line_mixin('purchase'), metaclass=PoolMeta):
__name__ = 'purchase.line'
def get_component_order_line(self, component, **values):
values = values.copy()
values['purchase'] = self.purchase
line = super().get_component_order_line(component, **values)
if line.unit_price is None:
line.unit_price = round_price(Decimal(0))
return line
@classmethod
def movable_types(cls):
return super().movable_types() + ['kit']
class LineComponent(
order_line_component_mixin('purchase'), ComponentMixin,
ModelSQL, ModelView):
__name__ = 'purchase.line.component'
@classmethod
def __setup__(cls):
super().__setup__()
states = {
'readonly': Eval('line_state') != 'draft',
}
cls.product.states = states
cls.quantity.states = states
cls.unit.states = states
cls.fixed.states = states
def get_move(self, move_type):
from trytond.modules.purchase.exceptions import PartyLocationError
pool = Pool()
Move = pool.get('stock.move')
Date = pool.get('ir.date')
if (self.quantity >= 0) != (move_type == 'in'):
return
quantity = (
self._get_move_quantity(move_type)
- self._get_shipped_quantity(move_type))
quantity = self.unit.round(quantity)
if quantity <= 0:
return
if not self.line.purchase.party.supplier_location:
raise PartyLocationError(
gettext('purchase.msg_purchase_supplier_location_required',
purchase=self.purchase.rec_name,
party=self.purchase.party.rec_name))
with Transaction().set_context(company=self.line.purchase.company.id):
today = Date.today()
move = Move()
move.quantity = quantity
move.unit = self.unit
move.product = self.product
move.from_location = self.line.from_location
move.to_location = self.line.to_location
move.state = 'draft'
move.company = self.line.purchase.company
if move.on_change_with_unit_price_required():
move.unit_price = round_price(
self.line.unit_price * self.price_ratio)
move.currency = self.line.purchase.currency
else:
move.unit_price = None
move.currency = None
move.planned_date = self.line.planned_delivery_date
if move.planned_date and move.planned_date < today:
move.planned_date = None
move.origin = self
move.origin_planned_date = move.planned_date
return move
def _get_move_quantity(self, shipment_type):
'Return the quantity that should be shipped'
return abs(self.quantity)
def check_move_quantity(self):
from trytond.modules.purchase.exceptions import PurchaseMoveQuantity
pool = Pool()
Lang = pool.get('ir.lang')
Warning = pool.get('res.user.warning')
lang = Lang.get()
move_type = 'in' if self.quantity >= 0 else 'return'
quantity = (
self._get_move_quantity(move_type)
- self._get_shipped_quantity(move_type))
if quantity < 0:
warning_name = Warning.format(
'check_move_quantity', [self])
if Warning.check(warning_name):
raise PurchaseMoveQuantity(warning_name, gettext(
'purchase.msg_purchase_line_move_quantity',
line=self.rec_name,
extra=lang.format_number_symbol(
-quantity, self.unit),
quantity=lang.format_number_symbol(
self.quantity, self.unit)))
class LineComponentIgnoredMove(ModelSQL):
__name__ = 'purchase.line.component-ignored-stock.move'
component = fields.Many2One(
'purchase.line.component', "Component",
ondelete='CASCADE', required=True)
move = fields.Many2One(
'stock.move', "Move", ondelete='RESTRICT', required=True)
class LineComponentRecreatedMove(ModelSQL):
__name__ = 'purchase.line.component-recreated-stock.move'
component = fields.Many2One(
'purchase.line.component', "Component",
ondelete='CASCADE', required=True)
move = fields.Many2One(
'stock.move', "Move", ondelete='RESTRICT', required=True)
class HandleShipmentException(
handle_shipment_exception_mixin('purchase'),
metaclass=PoolMeta):
__name__ = 'purchase.handle.shipment.exception'
class Amendment(metaclass=PoolMeta):
__name__ = 'purchase.amendment'
@classmethod
def _stock_moves(cls, line):
yield from super()._stock_moves(line)
for component in line.components:
for move in component.moves:
if move.state == 'draft':
yield move
class AmendmentLine(AmendmentLineMixin, metaclass=PoolMeta):
__name__ = 'purchase.amendment.line'

View File

@@ -0,0 +1,26 @@
<?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 depends="purchase">
<record model="ir.ui.view" id="purchase_line_view_form">
<field name="model">purchase.line</field>
<field name="inherit" ref="purchase.purchase_line_view_form"/>
<field name="name">purchase_line_form</field>
</record>
<record model="ir.ui.view" id="purchase_line_component_view_list">
<field name="model">purchase.line.component</field>
<field name="type">tree</field>
<field name="name">purchase_line_component_list</field>
</record>
<record model="ir.ui.view" id="purchase_line_component_view_form">
<field name="model">purchase.line.component</field>
<field name="type">form</field>
<field name="name">purchase_line_component_form</field>
</record>
</data>
</tryton>

239
modules/product_kit/sale.py Normal file
View File

@@ -0,0 +1,239 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.i18n import gettext
from trytond.model import ModelSQL, ModelView, fields
from trytond.modules.product import round_price
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
from .common import (
AmendmentLineMixin, get_moves, get_shipments_returns,
handle_shipment_exception_mixin, order_line_component_mixin,
order_line_mixin, order_mixin, search_moves, search_shipments_returns)
from .product import ComponentMixin
class Sale(order_mixin('sale'), metaclass=PoolMeta):
__name__ = 'sale.sale'
def _get_shipment_moves(self, shipment_type):
moves = super()._get_shipment_moves(shipment_type)
for line in self.lines:
if line.components:
for component in line.components:
move = component.get_move(shipment_type)
if move:
moves[component] = move
return moves
@get_shipments_returns('stock.shipment.out')
def get_shipments(self, name):
return super().get_shipments(name)
@get_shipments_returns('stock.shipment.out.return')
def get_shipment_returns(self, name):
return super().get_shipment_returns(name)
@classmethod
@search_shipments_returns('stock.shipment.out')
def search_shipments(cls, name, clause):
return super().search_shipments(name, clause)
@classmethod
@search_shipments_returns('stock.shipment.out.return')
def search_shipment_returns(cls, name, clause):
return super().search_shipment_returns(name, clause)
@get_moves
def get_moves(self, name):
return super().get_moves(name)
@classmethod
@search_moves
def search_moves(cls, name, clause):
return super().search_moves(name, clause)
@property
def _invoice_grouping_origins(self):
return super()._shipment_grouping_origins + ['sale.line.component']
@property
def _shipment_grouping_origins(self):
return super()._shipment_grouping_origins + ['sale.line.component']
class Line(order_line_mixin('sale'), metaclass=PoolMeta):
__name__ = 'sale.line'
def get_component_order_line(self, component, **values):
values = values.copy()
values['sale'] = self.sale
return super().get_component_order_line(component, **values)
@classmethod
def movable_types(cls):
return super().movable_types() + ['kit']
class LineComponent(
order_line_component_mixin('sale'), ComponentMixin,
ModelSQL, ModelView):
__name__ = 'sale.line.component'
@classmethod
def __setup__(cls):
super().__setup__()
states = {
'readonly': Eval('line_state') != 'draft',
}
cls.product.states = states
cls.quantity.states = states
cls.unit.states = states
cls.fixed.states = states
@property
def warehouse(self):
return self.line.warehouse
def get_move(self, shipment_type):
from trytond.modules.sale.exceptions import PartyLocationError
pool = Pool()
Move = pool.get('stock.move')
Date = pool.get('ir.date')
if (shipment_type == 'out') != (self.quantity >= 0):
return
quantity = (
self._get_move_quantity(shipment_type)
- self._get_shipped_quantity(shipment_type))
quantity = self.unit.round(quantity)
if quantity <= 0:
return
if not self.line.sale.party.customer_location:
raise PartyLocationError(
gettext('sale.msg_sale_customer_location_required',
sale=self.sale.rec_name,
party=self.sale.party.rec_name))
with Transaction().set_context(company=self.line.sale.company.id):
today = Date.today()
move = Move()
move.quantity = quantity
move.unit = self.unit
move.product = self.product
move.from_location = self.line.from_location
move.to_location = self.line.to_location
move.state = 'draft'
move.company = self.line.sale.company
if move.on_change_with_unit_price_required():
move.unit_price = round_price(
self.line.unit_price * self.price_ratio)
move.currency = self.line.sale.currency
else:
move.unit_price = None
move.currency = None
move.planned_date = max(
self.line.planned_shipping_date or today, today)
move.origin = self
move.origin_planned_date = move.planned_date
return move
def _get_move_quantity(self, shipment_type):
'Return the quantity that should be shipped'
pool = Pool()
Uom = pool.get('product.uom')
if self.line.sale.shipment_method == 'order':
return abs(self.quantity)
elif self.line.sale.shipment_method == 'invoice':
quantity = 0.0
for invoice_line in self.line.invoice_lines:
if (invoice_line.invoice
and invoice_line.invoice.state == 'paid'):
quantity += Uom.compute_qty(invoice_line.unit,
invoice_line.quantity, self.line.unit)
return self.quantity * quantity / self.line.quantity
@property
def _move_remaining_quantity(self):
pool = Pool()
UoM = pool.get('product.uom')
quantity = super()._move_remaining_quantity
if self.line.sale.shipment_method == 'invoice':
invoices_ignored = set(self.line.sale.invoices_ignored)
ratio = self.get_moved_ratio()
if ratio:
for invoice_line in self.line.invoice_lines:
if invoice_line.invoice in invoices_ignored:
quantity -= UoM.compute_qty(
invoice_line.unit * self.line.unit,
invoice_line.quantity / ratio,
self.line.unit)
return quantity
def check_move_quantity(self):
from trytond.modules.sale.exceptions import SaleMoveQuantity
pool = Pool()
Lang = pool.get('ir.lang')
Warning = pool.get('res.user.warning')
lang = Lang.get()
move_type = 'in' if self.quantity >= 0 else 'return'
quantity = (
self._get_move_quantity(move_type)
- self._get_shipped_quantity(move_type))
if quantity < 0:
warning_name = Warning.format(
'check_move_quantity', [self])
if Warning.check(warning_name):
raise SaleMoveQuantity(warning_name, gettext(
'sale.msg_sale_line_move_quantity',
line=self.rec_name,
extra=lang.format_number_symbol(
-quantity, self.unit),
quantity=lang.format_number_symbol(
self.quantity, self.unit)))
class LineComponentIgnoredMove(ModelSQL):
__name__ = 'sale.line.component-ignored-stock.move'
component = fields.Many2One(
'sale.line.component', "Component",
ondelete='CASCADE', required=True)
move = fields.Many2One(
'stock.move', "Move", ondelete='RESTRICT', required=True)
class LineComponentRecreatedMove(ModelSQL):
__name__ = 'sale.line.component-recreated-stock.move'
component = fields.Many2One(
'sale.line.component', "Sale Line Component",
ondelete='CASCADE', required=True)
move = fields.Many2One(
'stock.move', "Move", ondelete='RESTRICT', required=True)
class HandleShipmentException(
handle_shipment_exception_mixin('sale'),
metaclass=PoolMeta):
__name__ = 'sale.handle.shipment.exception'
class Amendment(metaclass=PoolMeta):
__name__ = 'sale.amendment'
@classmethod
def _stock_moves(cls, line):
yield from super()._stock_moves(line)
for component in line.components:
for move in component.moves:
if move.state == 'draft':
yield move
class AmendmentLine(AmendmentLineMixin, metaclass=PoolMeta):
__name__ = 'sale.amendment.line'

View File

@@ -0,0 +1,26 @@
<?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 depends="sale">
<record model="ir.ui.view" id="sale_line_view_form">
<field name="model">sale.line</field>
<field name="inherit" ref="sale.sale_line_view_form"/>
<field name="name">sale_line_form</field>
</record>
<record model="ir.ui.view" id="sale_line_component_view_list">
<field name="model">sale.line.component</field>
<field name="type">tree</field>
<field name="name">sale_line_component_list</field>
</record>
<record model="ir.ui.view" id="sale_line_component_view_form">
<field name="model">sale.line.component</field>
<field name="type">form</field>
<field name="name">sale_line_component_form</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,241 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from trytond.model import ModelView, Workflow, fields
from trytond.modules.product import round_price
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
class ShipmentIn(metaclass=PoolMeta):
__name__ = 'stock.shipment.in'
@classmethod
@ModelView.button
@Workflow.transition('received')
def receive(cls, shipments):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
for shipment in shipments:
for move in shipment.incoming_moves:
if isinstance(move.origin, PurchaseLineComponent):
move.origin.check_move_quantity()
super().receive(shipments)
class ShipmentOutReturn(metaclass=PoolMeta):
__name__ = 'stock.shipment.out.return'
@classmethod
@ModelView.button
@Workflow.transition('received')
def receive(cls, shipments):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
for shipment in shipments:
for move in shipment.incoming_moves:
if isinstance(move.origin, SaleLineComponent):
move.origin.check_move_quantity()
super().receive(shipments)
class Move(metaclass=PoolMeta):
__name__ = 'stock.move'
def _compute_component_unit_price(self, unit_price):
pool = Pool()
Currency = pool.get('currency.currency')
UoM = pool.get('product.uom')
amount, quantity = 0, 0
for line in self.origin.line.invoice_lines:
if line.invoice and line.invoice.state in {'posted', 'paid'}:
with Transaction().set_context(date=self.effective_date):
amount += Currency.compute(
line.invoice.currency, line.amount, self.currency)
quantity += UoM.compute_qty(
line.unit, line.quantity, self.origin.line.unit)
amount *= self.origin.price_ratio
if quantity:
unit_price = amount / Decimal(str(quantity))
if unit_price is not None:
unit_price = UoM.compute_price(
self.origin.unit, unit_price, self.unit)
unit_price = round_price(unit_price)
return unit_price
class MoveSale(metaclass=PoolMeta):
__name__ = 'stock.move'
@classmethod
def _get_origin(cls):
return super()._get_origin() + ['sale.line.component']
def get_sale(self, name):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
sale = super().get_sale(name)
if isinstance(self.origin, SaleLineComponent):
sale = self.origin.line.sale.id
return sale
@classmethod
def search_sale(cls, name, clause):
domain = super().search_sale(name, clause)
return ['OR',
domain,
('origin.line.' + clause[0],
*clause[1:3], 'sale.line.component', *clause[3:]),
]
def get_sale_exception_state(self, name):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
state = super().get_sale_exception_state(name)
if isinstance(self.origin, SaleLineComponent):
if self in self.origin.moves_recreated:
state = 'recreated'
elif self in self.origin.moves_ignored:
state = 'ignored'
return state
@fields.depends('origin')
def on_change_with_product_uom_category(self, name=None):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
category = super().on_change_with_product_uom_category(name=name)
# Enforce the same unit category as they are used to compute the
# remaining quantity to ship and the quantity to invoice.
# Use getattr as reference field can have negative id
if (isinstance(self.origin, SaleLineComponent)
and getattr(self.origin, 'unit', None)):
category = self.origin.unit.category
return category
def get_cost_price(self, product_cost_price=None):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
Sale = pool.get('sale.sale')
# For return sale's move use the cost price of the original sale
if (isinstance(self.origin, SaleLineComponent)
and self.origin.quantity < 0
and self.from_location.type != 'storage'
and self.to_location.type == 'storage'
and isinstance(self.origin.line.origin, Sale)):
sale = self.origin.line.origin
cost = Decimal(0)
qty = Decimal(0)
for move in sale.moves:
if (move.state == 'done'
and move.from_location.type == 'storage'
and move.to_location.type == 'customer'
and move.product == self.product):
move_quantity = Decimal(str(move.internal_quantity))
cost_price = move.get_cost_price(
product_cost_price=move.cost_price)
qty += move_quantity
cost += cost_price * move_quantity
if qty:
product_cost_price = round_price(cost / qty)
return super().get_cost_price(product_cost_price=product_cost_price)
@property
def origin_name(self):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
name = super().origin_name
if isinstance(self.origin, SaleLineComponent) and self.origin.id >= 0:
name = self.origin.line.sale.rec_name
return name
def _compute_unit_price(self, unit_price):
pool = Pool()
SaleLineComponent = pool.get('sale.line.component')
unit_price = super()._compute_unit_price(unit_price)
if isinstance(self.origin, SaleLineComponent):
unit_price = self._compute_component_unit_price(unit_price)
return unit_price
class MovePurchase(metaclass=PoolMeta):
__name__ = 'stock.move'
@classmethod
def _get_origin(cls):
return super()._get_origin() + ['purchase.line.component']
def get_purchase(self, name):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
purchase = super().get_purchase(name)
if isinstance(self.origin, PurchaseLineComponent):
purchase = self.origin.line.purchase.id
return purchase
@classmethod
def search_purchase(cls, name, clause):
domain = super().search_purchase(name, clause)
return ['OR',
domain,
('origin.line.' + clause[0],
*clause[1:3], 'purchase.line.component', *clause[3:]),
]
def get_supplier(self, name):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
supplier = super().get_supplier(name)
if isinstance(self.origin, PurchaseLineComponent):
supplier = self.origin.line.purchase.party.id
return supplier
@classmethod
def search_supplier(cls, name, clause):
domain = super().search_supplier(name, clause)
return ['OR',
domain,
('origin.line.purchase.party' + clause[0][len(name):],
*clause[1:3], 'purchase.line.component', *clause[3:])]
def get_purchase_exception_state(self, name):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
state = super().get_purchase_exception_state(name)
if isinstance(self.origin, PurchaseLineComponent):
if self in self.origin.moves_recreated:
state = 'recreated'
elif self in self.origin.moves_ignored:
state = 'ignored'
return state
@fields.depends('origin')
def on_change_with_product_uom_category(self, name=None):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
category = super().on_change_with_product_uom_category(name=name)
# Enforce the same unit category as they are used to compute the
# remaining quantity to ship and the quantity to invoice.
# Use getattr as reference field can have negative id
if (isinstance(self.origin, PurchaseLineComponent)
and getattr(self.origin, 'unit', None)):
category = self.origin.unit.category
return category
@property
def origin_name(self):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
name = super().origin_name
if (isinstance(self.origin, PurchaseLineComponent)
and self.origin.id >= 0):
name = self.origin.line.purchase.rec_name
return name
def _compute_unit_price(self, unit_price):
pool = Pool()
PurchaseLineComponent = pool.get('purchase.line.component')
unit_price = super()._compute_unit_price(unit_price)
if isinstance(self.origin, PurchaseLineComponent):
unit_price = self._compute_component_unit_price(unit_price)
return unit_price

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,155 @@
====================
Product Kit Scenario
====================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.tests.tools import activate_modules
Activate product_kit and stock::
>>> config = activate_modules(['product_kit', 'stock'], create_company)
Get company::
>>> company = get_company()
Create products::
>>> Uom = Model.get('product.uom')
>>> unit, = Uom.find([('name', '=', 'Unit')])
>>> meter, = Uom.find([('name', '=', "Meter")])
>>> ProductTemplate = Model.get('product.template')
>>> Product = Model.get('product.product')
>>> template = ProductTemplate()
>>> template.name = "Product 1"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> product1, = template.products
>>> product1.cost_price = Decimal('10.0000')
>>> product1.save()
>>> template = ProductTemplate()
>>> template.name = "Product 2"
>>> template.default_uom = meter
>>> template.type = 'goods'
>>> template.save()
>>> product2, = template.products
>>> product2.cost_price = Decimal('20.0000')
>>> product2.save()
>>> template = ProductTemplate()
>>> template.name = "Product 3"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> product3, = template.products
>>> product3.cost_price = Decimal('1.0000')
>>> product3.save()
>>> template = ProductTemplate()
>>> template.name = "Service"
>>> template.default_uom = unit
>>> template.type = 'service'
>>> template.save()
>>> service, = template.products
>>> service.cost_price = Decimal('5.0000')
>>> service.save()
Create composed product::
>>> template = ProductTemplate()
>>> template.name = "Composed Product"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> composed_product, = template.products
>>> composed_product.cost_price = Decimal('10.0000')
>>> component = composed_product.components.new()
>>> component.product = product1
>>> component.quantity = 2
>>> component = composed_product.components.new()
>>> component.product = service
>>> component.quantity = 1
>>> composed_product.save()
>>> composed_product.cost_price
Decimal('10.0000')
Create a kit::
>>> template = ProductTemplate()
>>> template.name = "Kit"
>>> template.default_uom = unit
>>> template.type = 'kit'
>>> template.save()
>>> kit, = template.products
>>> component = template.components.new()
>>> component.product = product1
>>> component.quantity = 1
>>> component = template.components.new()
>>> component.product = product2
>>> component.quantity = 2
>>> component = template.components.new()
>>> component.product = product3
>>> component.quantity = 1
>>> component.fixed = True
>>> template.save()
>>> kit.cost_price
Decimal('51.0000')
Get stock locations::
>>> Location = Model.get('stock.location')
>>> supplier_loc, = Location.find([('code', '=', 'SUP')])
>>> storage_loc, = Location.find([('code', '=', 'STO')])
Fill stock with some components::
>>> StockMove = Model.get('stock.move')
>>> moves = []
>>> move = StockMove()
>>> move.product = product1
>>> move.quantity = 10
>>> move.from_location = supplier_loc
>>> move.to_location = storage_loc
>>> move.unit_price = Decimal('10')
>>> move.currency = company.currency
>>> moves.append(move)
>>> move = StockMove()
>>> move.product = product2
>>> move.quantity = 15
>>> move.from_location = supplier_loc
>>> move.to_location = storage_loc
>>> move.unit_price = Decimal('20')
>>> move.currency = company.currency
>>> moves.append(move)
>>> move = StockMove()
>>> move.product = product3
>>> move.quantity = 20
>>> move.from_location = supplier_loc
>>> move.to_location = storage_loc
>>> move.unit_price = Decimal('1')
>>> move.currency = company.currency
>>> moves.append(move)
>>> StockMove.click(moves, 'do')
Check kit quantity::
>>> with config.set_context(locations=[storage_loc.id]):
... kit = Product(kit.id)
>>> kit.quantity
7.0

View File

@@ -0,0 +1,82 @@
==============================
Product Kit Duplicate Scenario
==============================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate product_kit::
>>> config = activate_modules('product_kit', create_company)
>>> Uom = Model.get('product.uom')
>>> ProductTemplate = Model.get('product.template')
>>> Product = Model.get('product.product')
Create products::
>>> unit, = Uom.find([('name', '=', 'Unit')])
>>> template = ProductTemplate()
>>> template.name = "Product 1"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> product1, = template.products
>>> product1.cost_price = Decimal('10.0000')
>>> product1.save()
>>> template = ProductTemplate()
>>> template.name = "Product 2"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> product2, = template.products
>>> product2.cost_price = Decimal('20.0000')
>>> product2.save()
Create composed product::
>>> template = ProductTemplate()
>>> template.name = "Composed Product"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.save()
>>> composed_product, = template.products
>>> composed_product.cost_price = Decimal('10.0000')
>>> component = composed_product.components.new()
>>> component.product = product1
>>> component.quantity = 2
>>> composed_product.save()
Create a kit::
>>> template = ProductTemplate()
>>> template.name = "Kit"
>>> template.default_uom = unit
>>> template.type = 'kit'
>>> template.save()
>>> kit, = template.products
>>> component = template.components.new()
>>> component.product = product1
>>> component.quantity = 1
>>> component = template.components.new()
>>> component.product = product2
>>> component.parent_product = kit
>>> component.quantity = 2
>>> template.save()
Test duplicate copies components::
>>> duplicated, = template.duplicate()
>>> len(duplicated.components)
2
>>> duplicated_product, = composed_product.duplicate()
>>> len(duplicated_product.components)
1

View File

@@ -0,0 +1,287 @@
=============================
Purchase Product Kit Scenario
=============================
Imports::
>>> import datetime as dt
>>> from decimal import Decimal
>>> 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
>>> from trytond.tests.tools import activate_modules, assertEqual
>>> today = dt.date.today()
Activate product_kit, purchase and account_invoice::
>>> config = activate_modules(
... ['product_kit', 'purchase', 'account_invoice',
... 'account_invoice_stock'],
... create_company, create_chart)
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(
... create_fiscalyear(today=today))
>>> fiscalyear.click('create_period')
Get accounts::
>>> accounts = get_accounts()
Create party::
>>> Party = Model.get('party.party')
>>> supplier = Party(name="Supplier")
>>> supplier.save()
Create account categories::
>>> ProductCategory = Model.get('product.category')
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create products::
>>> ProductUom = Model.get('product.uom')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> meter, = ProductUom.find([('name', '=', "Meter")])
>>> ProductTemplate = Model.get('product.template')
>>> template = ProductTemplate()
>>> template.name = "Product 1"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.purchasable = True
>>> template.list_price = Decimal('10')
>>> template.account_category = account_category
>>> template.save()
>>> product1, = template.products
>>> product1.cost_price = Decimal('5')
>>> product1.save()
>>> template = ProductTemplate()
>>> template.name = "Product 2"
>>> template.default_uom = meter
>>> template.type = 'goods'
>>> template.list_price = Decimal('20')
>>> template.account_category = account_category
>>> template.save()
>>> product2, = template.products
>>> product2.cost_price = Decimal('8')
>>> product2.save()
>>> template = ProductTemplate()
>>> template.name = "Product 3"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.list_price = Decimal('30')
>>> template.account_category = account_category
>>> template.save()
>>> product3, = template.products
>>> product3.cost_price = Decimal('10')
>>> product3.save()
>>> template = ProductTemplate()
>>> template.name = "Service"
>>> template.default_uom = unit
>>> template.type = 'service'
>>> template.purchasable = True
>>> template.list_price = Decimal('30')
>>> template.account_category = account_category
>>> template.save()
>>> service, = template.products
>>> service.cost_price = Decimal('20')
>>> service.save()
Create composed product::
>>> template = ProductTemplate()
>>> template.name = "Composed Product"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.purchasable = True
>>> template.list_price = Decimal('10')
>>> template.account_category = account_category
>>> template.save()
>>> composed_product, = template.products
>>> composed_product.cost_price = Decimal('5')
>>> component = composed_product.components.new()
>>> component.product = product1
>>> component.quantity = 1
>>> component = composed_product.components.new()
>>> component.product = service
>>> component.quantity = 2
>>> component.fixed = True
>>> composed_product.save()
Create kit product::
>>> template = ProductTemplate()
>>> template.name = "Kit"
>>> template.default_uom = unit
>>> template.type = 'kit'
>>> template.purchasable = True
>>> template.list_price = Decimal('40')
>>> template.account_category = account_category
>>> template.save()
>>> kit, = template.products
>>> component = kit.components.new()
>>> component.product = product2
>>> component.quantity = 2
>>> component = kit.components.new()
>>> component.product = product3
>>> component.quantity = 1
>>> component.fixed = True
>>> kit.save()
Purchase composed and kit products::
>>> Purchase = Model.get('purchase.purchase')
>>> purchase = Purchase()
>>> purchase.party = supplier
>>> purchase.invoice_method = 'shipment'
>>> line = purchase.lines.new()
>>> line.product = composed_product
>>> line.quantity = 1
>>> line.unit_price = Decimal('5.0000')
>>> line = purchase.lines.new()
>>> line.product = kit
>>> line.quantity = 2
>>> line.unit_price = Decimal('26.0000')
>>> purchase.click('quote')
>>> len(purchase.lines)
4
>>> [l.quantity for l in purchase.lines]
[1.0, 1.0, 2.0, 2.0]
>>> line_kit, = [l for l in purchase.lines if l.product == kit]
>>> [c.quantity for c in line_kit.components]
[4.0, 1.0]
Reset to draft remove components::
>>> purchase.click('draft')
>>> line_kit, = [l for l in purchase.lines if l.product == kit]
>>> bool(line_kit.components)
False
>>> purchase.click('quote')
Process purchase::
>>> purchase.click('confirm')
>>> purchase.state
'processing'
>>> len(purchase.shipments), len(purchase.invoices)
(0, 1)
Check invoice::
>>> invoice, = purchase.invoices
>>> line, = invoice.lines
>>> assertEqual(line.product, service)
Check stock moves::
>>> Move = Model.get('stock.move')
>>> len(purchase.moves)
4
>>> len(Move.find([('purchase', '!=', None)]))
4
>>> len(Move.find([('purchase', '!=', purchase.id)]))
0
>>> len(Move.find([('purchase', '=', purchase.id)]))
4
>>> product2quantity = {
... m.product: m.quantity for m in purchase.moves}
>>> product2quantity[composed_product]
1.0
>>> product2quantity[product1]
1.0
>>> product2quantity[product2]
4.0
>>> product2quantity[product3]
1.0
Receive partial shipment::
>>> ShipmentIn = Model.get('stock.shipment.in')
>>> shipment = ShipmentIn()
>>> shipment.supplier = supplier
>>> for move in purchase.moves:
... incoming_move = Move(move.id)
... shipment.incoming_moves.append(incoming_move)
>>> shipment.save()
>>> product2move = {
... m.product: m for m in shipment.incoming_moves}
>>> product2move[product2].quantity = 2.0
>>> shipment.click('receive')
>>> shipment.click('do')
>>> shipment.state
'done'
Check new invoice::
>>> purchase.reload()
>>> _, invoice = purchase.invoices
>>> len(invoice.lines)
3
>>> product2quantity = {l.product: l.quantity for l in invoice.lines}
>>> product2quantity[composed_product]
1.0
>>> product2quantity[product1]
1.0
>>> product2quantity[kit]
1.0
Post invoice::
>>> invoice.invoice_date = today
>>> invoice.click('post')
>>> invoice.state
'posted'
Check unit price of moves::
>>> shipment.reload()
>>> invoice.reload()
>>> sorted([m.unit_price for m in shipment.incoming_moves])
[Decimal('0.0000'), Decimal('5.0000'), Decimal('9.4545'), Decimal('14.1818')]
Check backorder moves::
>>> len(purchase.moves)
5
>>> backorder, = [m for m in purchase.moves if m.state == 'draft']
Cancel backorder::
>>> backorder.click('cancel')
>>> backorder.state
'cancelled'
>>> purchase.reload()
>>> purchase.shipment_state
'exception'
Handle shipment exception::
>>> shipment_exception = purchase.click('handle_shipment_exception')
>>> shipment_exception.form.recreate_moves.extend(
... shipment_exception.form.recreate_moves.find())
>>> shipment_exception.execute('handle')
>>> len(purchase.moves)
6
>>> backorder.reload()
>>> backorder.purchase_exception_state
'recreated'

View File

@@ -0,0 +1,280 @@
=========================
Sale Product Kit Scenario
=========================
Imports::
>>> from decimal import Decimal
>>> 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
>>> from trytond.tests.tools import activate_modules, assertEqual
Activate product_kit, sale and account_invoice::
>>> config = activate_modules(
... ['product_kit', 'sale', 'account_invoice',
... 'account_invoice_stock'],
... create_company, create_chart)
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear())
>>> fiscalyear.click('create_period')
Get accounts::
>>> accounts = get_accounts()
Create party::
>>> Party = Model.get('party.party')
>>> customer = Party(name='Customer')
>>> customer.save()
Create account categories::
>>> ProductCategory = Model.get('product.category')
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create products::
>>> ProductUom = Model.get('product.uom')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> meter, = ProductUom.find([('name', '=', "Meter")])
>>> ProductTemplate = Model.get('product.template')
>>> template = ProductTemplate()
>>> template.name = "Product 1"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.salable = True
>>> template.list_price = Decimal('10')
>>> template.account_category = account_category
>>> template.save()
>>> product1, = template.products
>>> template = ProductTemplate()
>>> template.name = "Product 2"
>>> template.default_uom = meter
>>> template.type = 'goods'
>>> template.list_price = Decimal('20')
>>> template.account_category = account_category
>>> template.save()
>>> product2, = template.products
>>> template = ProductTemplate()
>>> template.name = "Product 3"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.list_price = Decimal('30')
>>> template.account_category = account_category
>>> template.save()
>>> product3, = template.products
>>> template = ProductTemplate()
>>> template.name = "Service"
>>> template.default_uom = unit
>>> template.type = 'service'
>>> template.salable = True
>>> template.list_price = Decimal('30')
>>> template.account_category = account_category
>>> template.save()
>>> service, = template.products
Create composed product::
>>> template = ProductTemplate()
>>> template.name = "Composed Product"
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.salable = True
>>> template.list_price = Decimal('10')
>>> template.account_category = account_category
>>> template.save()
>>> composed_product, = template.products
>>> component = composed_product.components.new()
>>> component.product = product1
>>> component.quantity = 2
>>> component = composed_product.components.new()
>>> component.product = service
>>> component.quantity = 1
>>> component.fixed = True
>>> composed_product.save()
Create kit product::
>>> template = ProductTemplate()
>>> template.name = "Kit"
>>> template.default_uom = unit
>>> template.type = 'kit'
>>> template.salable = True
>>> template.list_price = Decimal('40')
>>> template.account_category = account_category
>>> template.save()
>>> kit, = template.products
>>> component = kit.components.new()
>>> component.product = product2
>>> component.quantity = 1
>>> component = kit.components.new()
>>> component.product = product3
>>> component.quantity = 2
>>> component.fixed = True
>>> kit.save()
Sale composed and kit products::
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> sale.invoice_method = 'shipment'
>>> line = sale.lines.new()
>>> line.product = composed_product
>>> line.quantity = 2
>>> line = sale.lines.new()
>>> line.product = kit
>>> line.quantity = 5
>>> sale.click('quote')
>>> len(sale.lines)
4
>>> [l.quantity for l in sale.lines]
[2.0, 4.0, 1.0, 5.0]
>>> line_kit, = [l for l in sale.lines if l.product == kit]
>>> [c.quantity for c in line_kit.components]
[5.0, 2.0]
Reset to draft remove components::
>>> sale.click('draft')
>>> line_kit, = [l for l in sale.lines if l.product == kit]
>>> bool(line_kit.components)
False
>>> sale.click('quote')
Process sale::
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> len(sale.shipments), len(sale.invoices)
(1, 1)
Check invoice::
>>> invoice, = sale.invoices
>>> line, = invoice.lines
>>> assertEqual(line.product, service)
Check shipment::
>>> Move = Model.get('stock.move')
>>> shipment, = sale.shipments
>>> len(shipment.outgoing_moves)
4
>>> len(sale.moves)
4
>>> len(Move.find([('sale', '!=', None)]))
4
>>> len(Move.find([('sale', '!=', sale.id)]))
0
>>> len(Move.find([('sale', '=', sale.id)]))
4
>>> product2quantity = {
... m.product: m.quantity for m in shipment.outgoing_moves}
>>> product2quantity[composed_product]
2.0
>>> product2quantity[product1]
4.0
>>> product2quantity[product2]
5.0
>>> product2quantity[product3]
2.0
Ship partially::
>>> product2move = {
... m.product: m for m in shipment.inventory_moves}
>>> product2move[product1].quantity = 2.0
>>> product2move[product2].quantity = 3.0
>>> shipment.click('assign_force')
>>> shipment.click('pick')
>>> shipment.click('pack')
>>> shipment.click('do')
>>> shipment.state
'done'
Check new invoice::
>>> sale.reload()
>>> _, invoice = sale.invoices
>>> len(invoice.lines)
3
>>> product2quantity = {l.product: l.quantity for l in invoice.lines}
>>> product2quantity[composed_product]
2.0
>>> product2quantity[product1]
2.0
>>> product2quantity[kit]
3.0
Post invoice::
>>> invoice.click('post')
>>> invoice.state
'posted'
Check unit price of moves::
>>> shipment.reload()
>>> invoice.reload()
>>> sorted([m.unit_price for m in shipment.outgoing_moves])
[Decimal('10.0000'), Decimal('10.0000'), Decimal('25.0000'), Decimal('37.5000')]
Check backorder::
>>> _, backorder = sale.shipments
>>> len(backorder.outgoing_moves)
2
>>> product2quantity = {
... m.product: m.quantity for m in backorder.outgoing_moves}
>>> product2quantity[product1]
2.0
>>> product2quantity[product2]
2.0
Cancel backorder::
>>> backorder.click('cancel')
>>> backorder.state
'cancelled'
>>> sale.reload()
>>> sale.shipment_state
'exception'
Handle shipment exception::
>>> shipment_exception = sale.click('handle_shipment_exception')
>>> shipment_exception.form.recreate_moves.extend(
... shipment_exception.form.recreate_moves.find(
... [('product', '!=', product1.id)]))
>>> shipment_exception.form.ignore_moves.extend(
... shipment_exception.form.ignore_moves.find(
... [('product', '=', product1.id)]))
>>> shipment_exception.execute('handle')
>>> _, _, shipment = sale.shipments
>>> len(shipment.outgoing_moves)
1
>>> backorder.reload()
>>> list(sorted(m.sale_exception_state for m in backorder.outgoing_moves))
['ignored', 'recreated']

View File

@@ -0,0 +1,14 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.modules.company.tests import CompanyTestMixin
from trytond.tests.test_tryton import ModuleTestCase
class ProductKitTestCase(CompanyTestMixin, ModuleTestCase):
'Test Product Kit module'
module = 'product_kit'
extras = ['sale', 'purchase', 'sale_amendment', 'purchase_amendment']
del ModuleTestCase

View File

@@ -0,0 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import load_doc_tests
def load_tests(*args, **kwargs):
return load_doc_tests(__name__, __file__, *args, **kwargs)

View File

@@ -0,0 +1,71 @@
[tryton]
version=7.8.0
depends:
ir
product
extras_depend:
account_invoice
account_invoice_stock
company
purchase
purchase_amendment
sale
sale_amendment
sale_invoice_grouping
sale_shipment_grouping
stock
xml:
product.xml
sale.xml
purchase.xml
[register]
model:
product.Template
product.Product
product.Component
[register account_invoice_stock]
model:
account.Invoice
account.InvoiceLine
[register purchase]
model:
purchase.Purchase
purchase.Line
purchase.LineComponent
purchase.LineComponentIgnoredMove
purchase.LineComponentRecreatedMove
stock.ShipmentIn
stock.MovePurchase
account.InvoiceLinePurchase
wizard:
purchase.HandleShipmentException
[register purchase_amendment]
model:
purchase.Amendment
purchase.AmendmentLine
[register sale]
model:
sale.Sale
sale.Line
sale.LineComponent
sale.LineComponentIgnoredMove
sale.LineComponentRecreatedMove
stock.ShipmentOutReturn
stock.MoveSale
account.InvoiceLineSale
wizard:
sale.HandleShipmentException
[register sale_amendment]
model:
sale.Amendment
sale.AmendmentLine
[register stock]
model:
stock.Move

View File

@@ -0,0 +1,23 @@
<?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>
<group col="-1" colspan="2" id="parents">
<label name="parent_template"/>
<field name="parent_template"/>
<label name="parent_product"/>
<field name="parent_product"/>
</group>
<label name="sequence"/>
<field name="sequence"/>
<label name="product"/>
<field name="product"/>
<label name="fixed"/>
<field name="fixed"/>
<label name="quantity"/>
<field name="quantity"/>
<label name="unit"/>
<field name="unit"/>
</form>

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. -->
<tree sequence="sequence">
<field name="parent_template" expand="1"/>
<field name="parent_product" expand="1"/>
<field name="product" expand="2"/>
<field name="quantity" symbol="unit"/>
</tree>

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. -->
<data>
<xpath expr="//page[@id='general']" position="after">
<page name="components">
<field name="components" colspan="4"/>
</page>
</xpath>
</data>

View File

@@ -0,0 +1,19 @@
<?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="line"/>
<field name="line"/>
<label name="sequence"/>
<field name="sequence"/>
<label name="product"/>
<field name="product"/>
<label name="fixed"/>
<field name="fixed"/>
<label name="quantity"/>
<field name="quantity"/>
<label name="unit"/>
<field name="unit"/>
</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="line" expand="1"/>
<field name="product" expand="2"/>
<field name="quantity" symbol="unit"/>
</tree>

View File

@@ -0,0 +1,11 @@
<?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='general']" position="after">
<page string="Components" id="components">
<field name="components" colspan="4"/>
<field name="component_children" colspan="4"/>
</page>
</xpath>
</data>

View File

@@ -0,0 +1,19 @@
<?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="line"/>
<field name="line"/>
<label name="sequence"/>
<field name="sequence"/>
<label name="product"/>
<field name="product"/>
<label name="fixed"/>
<field name="fixed"/>
<label name="quantity"/>
<field name="quantity"/>
<label name="unit"/>
<field name="unit"/>
</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="line" expand="1"/>
<field name="product" expand="2"/>
<field name="quantity" symbol="unit"/>
</tree>

View File

@@ -0,0 +1,11 @@
<?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='general']" position="after">
<page string="Components" id="components">
<field name="components" colspan="4"/>
<field name="component_children" colspan="4"/>
</page>
</xpath>
</data>