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.

View File

@@ -0,0 +1,30 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, Workflow
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
def send_feedback(invoices):
pool = Pool()
Document = pool.get('document.incoming')
documents = [d for i in invoices for d in i.documents_incoming]
with Transaction().set_context(queue_batch=1):
Document.__queue__.ocr_send_feedback(documents)
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
@ModelView.button
@Workflow.transition('validated')
def validate_invoice(cls, invoices):
super().validate_invoice(invoices)
send_feedback(invoices)
@classmethod
def _post(cls, invoices):
super()._post(invoices)
send_feedback(invoices)

View File

@@ -0,0 +1,484 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import bisect
import datetime as dt
import logging
import re
from decimal import Decimal
from operator import itemgetter
from trytond.cache import Cache
from trytond.model import (
MatchMixin, ModelSQL, ModelView, Workflow, fields, sequence_ordered)
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
logger = logging.getLogger(__name__)
class Incoming(metaclass=PoolMeta):
__name__ = 'document.incoming'
ocr_service = fields.Many2One(
'document.incoming.ocr.service', "OCR Service", readonly=True,
states={
'invisible': ~Eval('ocr_service'),
})
@classmethod
def __setup__(cls):
super().__setup__()
cls._buttons.update(
ocr_send_feedback={
'invisible': ~Eval('ocr_service') | (Eval('state') != 'done'),
'depends': ['ocr_service', 'state'],
},
)
@classmethod
@ModelView.button
@Workflow.transition('done')
def proceed(cls, documents, with_children=False):
pool = Pool()
Service = pool.get('document.incoming.ocr.service')
for document in documents:
service = Service.get_service(document)
if service:
document.ocr_service = service
document.parsed_data = service.process(document)
cls.save(documents)
super().proceed(documents, with_children=with_children)
def _process_document_incoming(self):
document = super()._process_document_incoming()
if self.ocr_service:
document_data = self.ocr_service.get_document_incoming(self)
document_type = document_data.get('document_type')
if (document_type
and document_type in dict(self.__class__.type.selection)):
document.type = document_type
return document
@classmethod
@ModelView.button
def ocr_send_feedback(cls, documents):
for document in documents:
if document.ocr_service:
document.ocr_service.send_feedback(document)
@classmethod
def copy(cls, documents, default=None):
default = default.copy() if default is not None else {}
default.setdefault('ocr_service')
return super().copy(documents, default=default)
class IncomingSupplierInvoice(metaclass=PoolMeta):
__name__ = 'document.incoming'
def _process_supplier_invoice(self):
pool = Pool()
Party = pool.get('party.party')
Currency = pool.get('currency.currency')
invoice = super()._process_supplier_invoice()
if self.ocr_service:
invoice_data = self.ocr_service.get_supplier_invoice(self)
tax_identifier = invoice_data.get('tax_identifier')
if tax_identifier and invoice.party:
tax_identifier_types = Party.tax_identifier_types()
for identifier in invoice.party.identifiers:
if (identifier.type in tax_identifier_types
and identifier.code == tax_identifier):
invoice.party_tax_identifier = identifier
currency = invoice_data.get('currency')
if currency:
try:
invoice.currency, = Currency.search([
('code', '=', currency),
])
except ValueError:
logger.debug(f"Cannot find currency '{currency}'")
invoice.reference = invoice_data.get('number')
invoice.description = invoice_data.get('description')
invoice_date = invoice_data.get('invoice_date')
if invoice_date:
try:
invoice.invoice_date = dt.date.fromisoformat(invoice_date)
except ValueError:
logger.debug(f"Cannot parse invoice date '{invoice_date}'")
payment_term_date = invoice_data.get('payment_term_date')
if payment_term_date:
try:
invoice.payment_term_date = dt.date.fromisoformat(
payment_term_date)
invoice.payment_term = None
except ValueError:
logger.debug(
"Cannot parse payment term date "
f"'{payment_term_date}'")
lines = []
for parsed_line in invoice_data.get('lines', []):
line = self._process_supplier_invoice_line(
invoice, parsed_line, invoice_data)
if line:
lines.append(line)
if not lines:
line_data = self._process_supplier_invoice_line_single(
invoice, invoice_data)
if line_data:
line = self._process_supplier_invoice_line(
invoice, line_data, invoice_data)
if line:
lines.append(line)
invoice.lines = lines
taxes = []
for parsed_tax in invoice_data.get('taxes', []):
tax = self._process_supplier_invoice_tax(
invoice, parsed_tax)
if tax:
taxes.append(tax)
if taxes:
for line in invoice.lines:
line.taxes = None
invoice.taxes = taxes
return invoice
def _process_supplier_invoice_line_single(self, invoice, invoice_data):
total_amount = invoice_data.get('total_amount')
if total_amount:
return {'quantity': 1, 'amount': total_amount}
def _process_supplier_invoice_line(self, invoice, line_data, invoice_data):
from trytond.modules.product import round_price
pool = Pool()
AccountConfiguration = pool.get('account.configuration')
InvoiceLine = pool.get('account.invoice.line')
Product = pool.get('product.product')
UoM = pool.get('product.uom')
account_configuration = AccountConfiguration(1)
line = InvoiceLine(
invoice=invoice,
currency=invoice.currency,
company=invoice.company)
product_name = line_data.get('product_name')
if product_name:
try:
product, = Product.search([
('rec_name', 'ilike', product_name),
])
except ValueError:
logger.debug(f"Cannot find product '{product_name}'")
line.product = None
else:
line.product = product.id
line.on_change_product()
else:
line.product = None
line.description = line_data.get('description')
if not line.product:
if line.description:
similar_lines = InvoiceLine.search([
('description', 'ilike', line.description),
('invoice.company', '=', invoice.company),
('invoice.type', '=', invoice.type),
('invoice.state', 'in',
['validated', 'posted', 'paid']),
],
order=[('invoice.invoice_date', 'DESC')],
limit=1)
else:
similar_lines = []
if similar_lines:
similar_line, = similar_lines
line.account = similar_line.account
line.product = similar_line.product
line.unit = similar_line.unit
line.taxes = similar_line.taxes
else:
line.account = account_configuration.get_multivalue(
'default_category_account_expense',
company=invoice.company.id)
line.on_change_account()
unit = line_data.get('unit')
if unit:
try:
unit, = UoM.search([
('rec_name', 'ilike', unit),
])
except ValueError:
logger.debug(f"Cannot find UoM '{unit}'")
else:
if (not line.product
or line.product.default_uom.category == unit.category):
line.unit = unit
quantity = line_data.get('quantity') or 0
if getattr(line, 'unit', None):
quantity = line.unit.round(quantity)
line.quantity = quantity or 1
unit_price = line_data.get('unit_price')
amount = line_data.get('amount')
if unit_price is not None:
line.unit_price = round_price(unit_price)
elif amount is not None:
line.unit_price = round_price(
amount / Decimal(str(line.quantity)))
else:
line.unit_price = 0
return line
def _process_supplier_invoice_tax(self, invoice, parsed_tax):
pool = Pool()
Tax = pool.get('account.tax')
InvoiceTax = pool.get('account.invoice.tax')
invoice_tax = InvoiceTax(invoice=invoice, manual=True)
try:
tax, = Tax.search([
['OR',
('group', '=', None),
('group.kind', 'in', ['purchase', 'both']),
],
('company', '=', invoice.company.id),
('type', '=', parsed_tax.get('type')),
('amount', '=', parsed_tax.get('amount')),
('rate', '=', parsed_tax.get('rate')),
])
except ValueError:
logger.debug(f"Cannot find tax for '{parsed_tax}'")
return
invoice_tax.tax = tax.id
invoice_tax.on_change_tax()
base = parsed_tax.get('base')
if base is not None:
invoice_tax.base = invoice.currency.round(base)
invoice_tax.on_change_base()
else:
amount = parsed_tax.get('amount') or 0
invoice_tax.base = 0
invoice_tax.amount = invoice_tax.currency.round(amount)
return invoice_tax
@property
def supplier_invoice_company(self):
pool = Pool()
Company = pool.get('company.company')
Party = pool.get('party.party')
Identifier = pool.get('party.identifier')
company = super().supplier_invoice_company
if self.ocr_service:
invoice_data = self.ocr_service.get_supplier_invoice(self)
company_name = invoice_data.get('company_name')
if company_name:
try:
company, = Company.search([
('party.rec_name', 'ilike', company_name),
])
except ValueError:
logger.debug(f"Cannot find company '{company_name}'")
tax_identifier = invoice_data.get('company_tax_identifier')
if tax_identifier:
identifiers = Identifier.search([
('code', '=', tax_identifier),
('type', 'in', Party.tax_identifier_types()),
])
if len(identifiers) == 1:
identifier, = identifiers
try:
company, = Company.search([
('party', '=', identifier.party.id),
])
except ValueError:
logger.debug(
"Cannot find company for party "
f"'{identifier.party.id}'")
else:
logger.debug(f"Cannot find company '{tax_identifier}'")
return company
@property
def supplier_invoice_party(self):
pool = Pool()
Party = pool.get('party.party')
Identifier = pool.get('party.identifier')
party = super().supplier_invoice_party
if self.ocr_service:
invoice_data = self.ocr_service.get_supplier_invoice(self)
supplier_name = invoice_data.get('supplier_name')
if supplier_name:
try:
party, = Party.search([
('rec_name', 'ilike', supplier_name),
])
except ValueError:
logger.debug(f"Cannot find party '{supplier_name}'")
tax_identifier = invoice_data.get('tax_identifier')
if tax_identifier:
identifiers = Identifier.search([
('code', '=', tax_identifier),
('type', 'in', Party.tax_identifier_types()),
])
if len(identifiers) == 1:
identifier, = identifiers
party = identifier.party
else:
logger.debug(f"Cannot find party '{tax_identifier}'")
return party
class IncomingSupplierInvoicePurchase(metaclass=PoolMeta):
__name__ = 'document.incoming'
def _process_supplier_invoice_line(self, invoice, line_data, invoice_data):
pool = Pool()
PurchaseLine = pool.get('purchase.line')
UoM = pool.get('product.uom')
line = super()._process_supplier_invoice_line(
invoice, line_data, invoice_data)
if (line and line.product and line.unit
and (line_data.get('purchase_orders')
or line_data.get('purchase_order'))):
if line_data.get('purchase_order'):
numbers = [line_data['purchase_order']]
else:
numbers = re.split(r'[ ,;]', line_data['purchase_orders'])
purchase_lines = PurchaseLine.search([
('purchase.company', '=', invoice.company),
('purchase.rec_name', 'in', numbers),
('type', '=', 'line'),
('product', '=', line.product.id),
])
if purchase_lines:
quantities = []
for purchase_line in purchase_lines:
quantity = UoM.compute_qty(
purchase_line.unit, purchase_line.quantity, line.unit)
quantities.append((quantity, purchase_line))
key = itemgetter(0)
quantities.sort(key=key)
index = bisect.bisect_left(quantities, line.quantity, key=key)
if index >= len(quantities):
index = -1
line.origin = str(quantities[index][1])
return line
class IncomingOCRService(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
__name__ = 'document.incoming.ocr.service'
type = fields.Selection([
(None, ''),
], "Type")
company = fields.Many2One(
'company.company', "Company",
help="The company for which the service is used.\n"
"Leave empty for any company.")
source = fields.Char(
"Source",
help="The regular expression to match the document source.\n"
"Leave empty to allow any source.")
document_type = fields.Selection(
'get_document_types', "Type",
help="The document type to match.\n"
"Leave empty for any type.")
_get_service_cache = Cache(
'document.incoming.ocr.service.get_service', context=False)
@classmethod
def get_document_types(cls):
pool = Pool()
Incoming = pool.get('document.incoming')
return Incoming.fields_get(['type'])['type']['selection']
@classmethod
def get_service(cls, document):
pattern = cls._get_pattern(document)
key = tuple(sorted(pattern.items()))
service_id = cls._get_service_cache.get(key, -1)
if service_id is None:
return None
if service_id >= 0:
return cls(service_id)
for service in cls.search([]):
if service.match(pattern):
break
else:
service = None
cls._get_service_cache.set(key, service.id if service else None)
return service
@classmethod
def _get_pattern(cls, document):
return {
'company': document.company.id if document.company else None,
'source': document.source or None,
'document_type': document.type or None,
'mime_type': document.mime_type,
}
def match(self, pattern):
pattern = pattern.copy()
source = pattern.pop('source', None)
if (self.source
and (not source
or not re.search(self.source, source))):
return False
if not self.match_mime_type(pattern.pop('mime_type', None)):
return False
return super().match(pattern)
def match_mime_type(self, mime_type):
return True
def process(self, document):
if self.type:
return getattr(self, f'_process_{self.type}')(document)
def get_document_incoming(self, document):
if self.type:
return getattr(
self, f'_get_document_incoming_{self.type}')(document)
else:
return {}
def get_supplier_invoice(self, document):
if self.type:
return getattr(
self, f'_get_supplier_invoice_{self.type}')(document)
else:
return {}
def send_feedback(self, document):
if self.type:
getattr(self, f'_send_feedback_{self.type}')(document)
@classmethod
def on_modification(cls, mode, services, field_names=None):
super().on_modification(mode, services, field_names=field_names)
cls._get_service_cache.clear()

View File

@@ -0,0 +1,90 @@
<?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="document_incoming_view_form">
<field name="model">document.incoming</field>
<field name="inherit" ref="document_incoming.document_incoming_view_form"/>
<field name="name">document_incoming_form</field>
</record>
<record model="ir.model.button" id="document_incoming_proceed_button">
<field name="model">document.incoming</field>
<field name="name">ocr_send_feedback</field>
<field name="string">Send Feedback</field>
</record>
<record model="ir.ui.view" id="document_incoming_ocr_service_view_form">
<field name="model">document.incoming.ocr.service</field>
<field name="type">form</field>
<field name="name">document_incoming_ocr_service_form</field>
</record>
<record model="ir.ui.view" id="document_incoming_ocr_service_view_list">
<field name="model">document.incoming.ocr.service</field>
<field name="type">tree</field>
<field name="priority" eval="10"/>
<field name="name">document_incoming_ocr_service_list</field>
</record>
<record model="ir.ui.view" id="document_incoming_ocr_service_view_list_sequence">
<field name="model">document.incoming.ocr.service</field>
<field name="type">tree</field>
<field name="priority" eval="20"/>
<field name="name">document_incoming_ocr_service_list_sequence</field>
</record>
<record model="ir.action.act_window" id="act_document_incoming_ocr_service_form">
<field name="name">OCR Services</field>
<field name="res_model">document.incoming.ocr.service</field>
</record>
<record model="ir.action.act_window.view" id="act_document_incoming_ocr_service_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="document_incoming_ocr_service_view_list_sequence"/>
<field name="act_window" ref="act_document_incoming_ocr_service_form"/>
</record>
<record model="ir.action.act_window.view" id="act_document_incoming_ocr_service_form_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="document_incoming_ocr_service_view_form"/>
<field name="act_window" ref="act_document_incoming_ocr_service_form"/>
</record>
<menuitem
parent="document_incoming.menu_configuration"
action="act_document_incoming_ocr_service_form"
sequence="20"
id="menu_document_incoming_ocr_service_form"/>
<record model="ir.model.access" id="access_document_incoming_ocr_service">
<field name="model">document.incoming.ocr.service</field>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_document_incoming_ocr_service_group_document_incoming_admin">
<field name="model">document.incoming.ocr.service</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.rule.group" id="rule_group_document_incoming_ocr_service_companies">
<field name="name">User in companies</field>
<field name="model">document.incoming.ocr.service</field>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_document_incoming_ocr_service_companies1">
<field name="domain" eval="[('company', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_document_incoming_ocr_service_companies"/>
</record>
<record model="ir.rule" id="rule_document_incoming_ocr_service_companies2">
<field name="domain" eval="[('company', '=', None)]" pyson="1"/>
<field name="rule_group" ref="rule_group_document_incoming_ocr_service_companies"/>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,72 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "Servei OCR"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Empresa"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Tipus"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Origen"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Tipus"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"L'empresa que en la que s'utilitzarà el servei.\n"
"Deixeu-ho en blanc per totes les empreses."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
"El tipus de document a coincidir.\n"
"Deixeu-ho en blanc per tots els tipus."
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
"L'expressió regular a coincidir amb l'origen del document.\n"
"Deixeu-ho en blanc per tots els origens."
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "Servei OCR de documents entrants"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Serveis OCR"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Envia feedback"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Usuari a les empreses"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Serveis OCR"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Criteri"

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,72 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "OCR Schrifterkennungsdienst"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Unternehmen"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Typ"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Quelle"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Typ"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"Das Unternehmen für das der Service genutzt wird.\n"
"Leer lassen für alle Unternehmen."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
"Auswahl des passenden Dokumententyps.\n"
"Leer lassen für jeden Typ."
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
"Der reguläre Ausdruck dem die Dokumentenquelle entsprechen muss.\n"
"Leer lassen um jede Dokumentenquelle zuzulassen."
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "Eingehendes Dokument OCR Schrifterkennungsdienst"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "OCR Schrifterkennungsservice"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Feedback senden"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Benutzer in Unternehmen"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "OCR Schrifterkennungsservice"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Kriterien"

View File

@@ -0,0 +1,72 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "Servicio OCR"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Empresa"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Tipo"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Origen"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Tipo"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"La empresa en la que se usa el servicio.\n"
"Dejar en blanco para todas las empresas."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
"El tipo de documento a coinicidir.\n"
"Dejar en blanco para todos los tipos."
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
"La expresión regular a coincidir con el origen del documento.\n"
"Dejar en blanco para cualquier origen."
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "Servicio OCR de documentos entrantes"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Servicios OCR"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Enviar feedback"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Usuario en las empresas"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Servicios OCR"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Criterio"

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,72 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "Service ROC"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Société"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Type"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Source"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Type"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"La société pour laquelle le service est utilisé.\n"
"Laissez vide pour n'importe quelle société."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
"Le type de document à faire correspondre.\n"
"Laissez vide pour nimporte quel type."
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
"L'expression régulière correspondant à la source du document.\n"
"Laissez vide pour autoriser nimporte quelle source."
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "Service ROC de document entrant"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Services ROC"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Envoyer des retours"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Utilisateur dans les sociétés"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Services ROC"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Critères"

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,72 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "OCR service"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Bedrijf"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Soort"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Bron"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Soort"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"Het bedrijf waarvoor de dienst wordt gebruikt.\n"
"Laat leeg voor elk bedrijf."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
"Het bijpassende soort document.\n"
"Laat leeg voor elke soort."
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
"De reguliere expressie die overeenkomt met de documentbron.\n"
"Laat leeg om elke bron toe te staan."
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "OCR service voor inkomende documenten"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "OCR services"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Feedback verzenden"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Gebruiker in bedrijven"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "OCR services"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Criteria"

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,70 @@
#
#, fuzzy
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr "Storitev OCR"
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr "Družba"
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr "Vrsta"
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr "Izvor"
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr "Vrsta"
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
"Družba, ki uporablja storitev.\n"
"Pustite prazno za vse družbe."
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
#, fuzzy
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr "Storitev OCR vhodnih dokumentov"
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Storitve OCR"
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr "Pošlji povratno informacijo"
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr "Uporabnik v družbah"
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr "Storitve OCR"
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr "Kriterij"

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

View File

@@ -0,0 +1,66 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:document.incoming,ocr_service:"
msgid "OCR Service"
msgstr ""
msgctxt "field:document.incoming.ocr.service,company:"
msgid "Company"
msgstr ""
msgctxt "field:document.incoming.ocr.service,document_type:"
msgid "Type"
msgstr ""
msgctxt "field:document.incoming.ocr.service,source:"
msgid "Source"
msgstr ""
msgctxt "field:document.incoming.ocr.service,type:"
msgid "Type"
msgstr ""
msgctxt "help:document.incoming.ocr.service,company:"
msgid ""
"The company for which the service is used.\n"
"Leave empty for any company."
msgstr ""
msgctxt "help:document.incoming.ocr.service,document_type:"
msgid ""
"The document type to match.\n"
"Leave empty for any type."
msgstr ""
msgctxt "help:document.incoming.ocr.service,source:"
msgid ""
"The regular expression to match the document source.\n"
"Leave empty to allow any source."
msgstr ""
msgctxt "model:document.incoming.ocr.service,string:"
msgid "Document Incoming Ocr Service"
msgstr ""
msgctxt "model:ir.action,name:act_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "model:ir.model.button,string:document_incoming_proceed_button"
msgid "Send Feedback"
msgstr ""
msgctxt ""
"model:ir.rule.group,name:rule_group_document_incoming_ocr_service_companies"
msgid "User in companies"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_document_incoming_ocr_service_form"
msgid "OCR Services"
msgstr ""
msgctxt "view:document.incoming.ocr.service:"
msgid "Criteria"
msgstr ""

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,34 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.modules.company.tests import CompanyTestMixin
from trytond.pool import Pool
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
class DocumentIncomingOcrTestCase(CompanyTestMixin, ModuleTestCase):
"Test Document Incoming Ocr module"
module = 'document_incoming_ocr'
@with_transaction()
def test_service_match(self):
"Test Service match"
pool = Pool()
Service = pool.get('document.incoming.ocr.service')
for service, pattern, result in [
(Service(source=None), {}, True),
(Service(source='test'), {}, False),
(Service(source='test'), {'source': 'test'}, True),
(Service(source='test'), {'source': None}, False),
(Service(source='test'), {'source': 'test source'}, True),
(Service(source='Test'), {'source': 'test'}, False),
(Service(source='(?i)test'), {'source': 'Test'}, True),
(Service(source='test$'), {'source': 'test source'}, False),
(Service(source='test$'), {'source': 'source test'}, True),
]:
with self.subTest(service=service, pattern=pattern):
self.assertEqual(service.match(pattern), result)
del ModuleTestCase

View File

@@ -0,0 +1,28 @@
[tryton]
version=7.8.1
depends:
company
document_incoming
ir
extras_depend:
account_invoice
account_product
document_incoming_invoice
product
purchase
xml:
document.xml
[register]
model:
document.Incoming
document.IncomingOCRService
[register account_invoice account_product document_incoming_invoice product]
model:
account.Invoice
document.IncomingSupplierInvoice
[register purchase]
model:
document.IncomingSupplierInvoicePurchase

View File

@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='type']" position="after">
<label name="ocr_service"/>
<field name="ocr_service"/>
<newline/>
</xpath>
<xpath expr="//button[@name='proceed']" position="after">
<button name="ocr_send_feedback" icon="tryton-send"/>
</xpath>
</data>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="type"/>
<field name="type"/>
<label name="sequence"/>
<field name="sequence"/>
<separator string="Criteria" id="criteria" colspan="4"/>
<label name="source"/>
<field name="source"/>
<label name="company"/>
<field name="company"/>
<label name="document_type"/>
<field name="document_type"/>
</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>
<field name="company" expand="1" optional="1"/>
<field name="source" expand="1" optional="0"/>
<field name="document_type" expand="1" optional="0"/>
<field name="type" expand="2"/>
</tree>

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="company" expand="1" optional="1"/>
<field name="source" expand="1" optional="0"/>
<field name="document_type" expand="1" optional="0"/>
<field name="type" expand="2"/>
</tree>