[MERGE] manual forward port of accounting-pocalypse (beaa30a3d1)

This commit merges the following models
 * account.invoice and account.move
 * account.invoice.line and account.move.line
 * account.voucher and account.move
 * account.voucher.line and account.move.line

It was the opportunity for a big cleanup of the code, so it also restructures the whole account module, its different models/fields, the tests etc. for a better world and a better code readability.

==== Rationale ====
The rationale of this huge change is that we want journal entries / invoices to be easily edited, and changes reflected in the other model. It's a HUGE feature and very strategic for the fiduciary companies. For example, changing the account of a journal entry needs to be automatically reflected on the related invoice.

The same reasoning applies to sale/purchase vouchers.

==== Changes made in features =====
When creating an invoice, you are now creating a journal entry directly.
--> The object account.invoice no longer exists.
In the same fashion when creating an invoice line, you're now adding journal items directly in the journal entry representing the invoice. If this invoice line has some tax, it may create additional journal items as well.
--> The models account.invoice.line & account.invoice.tax no longer exist

Identically, when creating a sale/purchase receipt with its lines, you are now creating a journal entry directly and there's no more usability difference between encoding a receipt or an invoice.
--> The object account.voucher no longer exists.
--> The object account.voucher.line no longer exists.
--> The whole account_voucher module no longer exists.

Positive side-effects coming from these changes are
* draft invoices/bills/sale or purchase receipts now create a draft accounting entry. Validate these objects now simply post its journal entry. That means that draft invoices/bills/sale or purchase receipt can straightforwardly be included in reporting or budgets.
* opening a journal entry in form view will now always open the correct view: if it's a sale/purchase journal entry we will have a customer invoice/vendor bill view or a sale/purchase receipt view, whatever the menu we're coming from.
* code & business logic simplification. It is also condensed in a single place instead of being partially duplicated on invoices, vouchers and journal entries.

There should be no feature loss, except the one allowing to group multiple journal items together based on the same product during the invoice validation.

==== Changes made in models =====
* account.invoice: model removed. Instead, now use account.move with following mapping

field (account.invoice) 		field (account.move)
-----------------------			--------------------
name 					invoice_payment_ref
number 					name
reference 				ref
comment 				narration
user_id 				invoice_user_id
amount_					total_company_signed amount_total_signed
residual 				amount_residual
state 					state + invoice_payment_state 		/!\ selection changed
date_invoice 				invoice_date
date_due 				invoice_date_due
sent 					invoice_sent
origin 					invoice_origin
payment_term_id 			invoice_payment_term_id
partner_bank_id 			invoice_partner_bank_id
incoterm_id 				invoice_incoterm_id
vendor_bill_id 				invoice_vendor_bill_id
source_email 				invoice_source_email
vendor_display_name 			invoice_vendor_display_name
invoice_icon 				invoice_vendor_icon
cash_rounding_id 			invoice_cash_rounding_id
sequence_number_next 			invoice_sequence_number_next
sequence_number_next_prefix 		invoice_sequence_number_next_prefix

'invoices' subset of account.move can be accessed by using the selection field 'type' or one of the many helpers like is_invoice()

* account.move: now has a valid state 'cancel' that has to be excluded from all business logic
* account.move: field 'amount' renamed into 'amount_total'
* account.move: field 'reverse_entry_id' renamed into 'reversed_entry_id'
* account.move.line: now has a field 'display_type' that has to be excluded from all business logic, in order to support invoice layouting
* account.invoice.line: model removed. Instead, now use account.move.line with following mapping

field (account.invoice.line) 		field (account.move.line)
----------------------------		-------------------------
invoice_id 				move_id
uom_id 					product_uom_id
invoice_line_tax_ids 			tax_ids
account_analytic_id 			analytic_account_id

'invoice lines' subset of all account.move.line from a journal entry can be accessed by using the boolean field 'exclude_from_invoice_tab'

* account.invoice.tax: model removed. Instead, now use account.move.line with following mapping

field (account.invoice.tax) 		field (account.move.line)
---------------------------		-------------------------
invoice_id 				move_id
account_analytic_id 			analytic_account_id
amount 					price_unit
base 					tax_base_amount

'tax lines' subset of all account.move.line from a journal entry can be accessed by using the relational field 'tax_line_id'

* account.invoice.confirm: model removed. Instead, now use the 'post()' function of account.move
* account.invoice.refund: model removed. Instead, now use account.move.reversal to reverse the entries with the same options as we had for invoices
* account.voucher: model removed. Instead, now use account.move of type in ['out_receipt', 'in_receipt]
* account.voucher.line: model removed. Instead, now use account.move.line

==== Changes made in functions ====
* on account.move, method _run_post_draft_to_post() renamed into _autopost_draft_entries()
* on account.move, method action_account_invoice_payment() renamed into action_invoice_register_payment()
* on account.move, method action_invoice_reconcile_to_check() renamed into action_open_matching_suspense_moves()
* on account.move, method _get_domain_edition_mode_available() renamed into _get_domain_matching_supsense_moves()
* on account.move, method _get_intrastat_country_id() renamed into _get_invoice_intrastat_country_id()
* on account.move.line, method _get_domain_for_edition_mode() renamed into _get_suspense_moves_domain()
* in account.bank.statement, contextual key 'edition_mode' renamed into 'suspense_moves_mode'

Was task 1917430
This commit is contained in:
Laurent Smet
2019-07-01 13:45:57 +02:00
committed by Christophe Simonis
parent 230bb2a84d
commit bc131c0cfb
321 changed files with 12221 additions and 59862 deletions
-3
View File
@@ -32,12 +32,9 @@ You could use this simplified accounting in case you work with an (external) acc
'views/account_view.xml',
'views/account_report.xml',
'data/mail_template_data.xml',
'wizard/account_invoice_refund_view.xml',
'wizard/account_validate_move_view.xml',
'wizard/account_invoice_state_view.xml',
'wizard/pos_box.xml',
'views/account_end_fy.xml',
'views/account_invoice_view.xml',
'views/partner_view.xml',
'views/product_view.xml',
'views/account_analytic_view.xml',
+10 -8
View File
@@ -11,7 +11,9 @@ class PortalAccount(CustomerPortal):
def _prepare_portal_layout_values(self):
values = super(PortalAccount, self)._prepare_portal_layout_values()
invoice_count = request.env['account.invoice'].search_count([])
invoice_count = request.env['account.move'].search_count([
('type', 'in', ('out_invoice', 'in_invoice', 'out_refund', 'in_refund', 'out_receipt', 'in_receipt')),
])
values['invoice_count'] = invoice_count
return values
@@ -29,13 +31,13 @@ class PortalAccount(CustomerPortal):
@http.route(['/my/invoices', '/my/invoices/page/<int:page>'], type='http', auth="user", website=True)
def portal_my_invoices(self, page=1, date_begin=None, date_end=None, sortby=None, **kw):
values = self._prepare_portal_layout_values()
AccountInvoice = request.env['account.invoice']
AccountInvoice = request.env['account.move']
domain = []
domain = [('type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]
searchbar_sortings = {
'date': {'label': _('Invoice Date'), 'order': 'date_invoice desc'},
'duedate': {'label': _('Due Date'), 'order': 'date_due desc'},
'date': {'label': _('Invoice Date'), 'order': 'invoice_date desc'},
'duedate': {'label': _('Due Date'), 'order': 'invoice_date_due desc'},
'name': {'label': _('Reference'), 'order': 'name desc'},
'state': {'label': _('Status'), 'order': 'state'},
}
@@ -44,7 +46,7 @@ class PortalAccount(CustomerPortal):
sortby = 'date'
order = searchbar_sortings[sortby]['order']
archive_groups = self._get_archive_groups('account.invoice', domain)
archive_groups = self._get_archive_groups('account.move', domain)
if date_begin and date_end:
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
@@ -77,7 +79,7 @@ class PortalAccount(CustomerPortal):
@http.route(['/my/invoices/<int:invoice_id>'], type='http', auth="public", website=True)
def portal_my_invoice_detail(self, invoice_id, access_token=None, report_type=None, download=False, **kw):
try:
invoice_sudo = self._document_check_access('account.invoice', invoice_id, access_token)
invoice_sudo = self._document_check_access('account.move', invoice_id, access_token)
except (AccessError, MissingError):
return request.redirect('/my')
@@ -88,7 +90,7 @@ class PortalAccount(CustomerPortal):
acquirers = values.get('acquirers')
if acquirers:
country_id = values.get('partner_id') and values.get('partner_id')[0].country_id.id
values['acq_extra_fees'] = acquirers.get_acquirer_extra_fees(invoice_sudo.residual, invoice_sudo.currency_id, country_id)
values['acq_extra_fees'] = acquirers.get_acquirer_extra_fees(invoice_sudo.amount_residual, invoice_sudo.currency_id, country_id)
return request.render("account.portal_invoice_page", values)
+6 -6
View File
@@ -78,19 +78,19 @@
<!-- Account-related subtypes for messaging / Chatter -->
<record id="mt_invoice_validated" model="mail.message.subtype">
<field name="name">Validated</field>
<field name="res_model">account.invoice</field>
<field name="res_model">account.move</field>
<field name="default" eval="False"/>
<field name="description">Invoice validated</field>
</record>
<record id="mt_invoice_paid" model="mail.message.subtype">
<field name="name">Paid</field>
<field name="res_model">account.invoice</field>
<field name="res_model">account.move</field>
<field name="default" eval="False"/>
<field name="description">Invoice paid</field>
</record>
<record id="mt_invoice_created" model="mail.message.subtype">
<field name="name">Invoice Created</field>
<field name="res_model">account.invoice</field>
<field name="res_model">account.move</field>
<field name="default" eval="False"/>
<field name="hidden" eval="True"/>
<field name="description">Invoice Created</field>
@@ -175,10 +175,10 @@
</record>
<!-- Share Button in action menu -->
<record id="model_account_invoice_action_share" model="ir.actions.server">
<record id="model_account_move_action_share" model="ir.actions.server">
<field name="name">Share</field>
<field name="model_id" ref="account.model_account_invoice"/>
<field name="binding_model_id" ref="account.model_account_invoice"/>
<field name="model_id" ref="account.model_account_move"/>
<field name="binding_model_id" ref="account.model_account_move"/>
<field name="state">code</field>
<field name="code">action = records.action_share()</field>
</record>
+8 -8
View File
@@ -7,10 +7,10 @@
<!--Email template -->
<record id="email_template_edi_invoice" model="mail.template">
<field name="name">Invoice: Send by email</field>
<field name="model_id" ref="account.model_account_invoice"/>
<field name="model_id" ref="account.model_account_move"/>
<field name="email_from">${(object.user_id.email_formatted or user.email_formatted) |safe}</field>
<field name="partner_to">${object.partner_id.id}</field>
<field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})</field>
<field name="subject">${object.company_id.name} Invoice (Ref ${object.name or 'n/a'})</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
@@ -22,17 +22,17 @@
% endif
<br /><br />
Here is your
% if object.number:
invoice <strong>${object.number}</strong>
% if object.name:
invoice <strong>${object.name}</strong>
% else:
invoice
%endif
% if object.origin:
(with reference: ${object.origin})
% if object.invoice_origin:
(with reference: ${object.invoice_origin})
% endif
amounting in <strong>${format_amount(object.amount_total, object.currency_id)}</strong>
from ${object.company_id.name}.
% if object.state=='paid':
% if object.invoice_payment_state == 'paid':
This invoice is already paid.
% else:
Please remit payment at your earliest convenience.
@@ -43,7 +43,7 @@
</div>
</field>
<field name="report_template" ref="account_invoices"/>
<field name="report_name">Invoice_${(object.number or '').replace('/','_')}${object.state == 'draft' and '_draft' or ''}</field>
<field name="report_name">Invoice_${(object.name or '').replace('/','_')}${object.state == 'draft' and '_draft' or ''}</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="user_signature" eval="False"/>
<field name="auto_delete" eval="True"/>
+1 -1
View File
@@ -8,7 +8,7 @@
<field name="nextcall" eval="(DateTime.now().replace(hour=2, minute=0) + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')" />
<field name="doall" eval="False"/>
<field name="model_id" ref="model_account_move"/>
<field name="code">model._run_post_draft_to_post()</field>
<field name="code">model._autopost_draft_entries()</field>
<field name="state">code</field>
</record>
</odoo>
+2 -1
View File
@@ -4,10 +4,11 @@ from . import partner
from . import account
from . import account_reconcile_model
from . import account_payment
from . import account_invoice
from . import account_payment_term
from . import account_bank_statement
from . import account_move
from . import account_payment_term
from . import account_bank_statement
from . import chart_template
from . import account_analytic_line
from . import account_journal_dashboard
+31 -40
View File
@@ -553,8 +553,6 @@ class AccountJournal(models.Model):
domain=[('deprecated', '=', False)], help="It acts as a default account for debit amount")
update_posted = fields.Boolean(string='Allow Cancelling Entries',
help="Check this box if you want to allow the cancellation the entries related to this journal or of the invoice related to this journal")
group_invoice_lines = fields.Boolean(string='Group Invoice Lines',
help="If this box is checked, the system will try to group the accounting lines when generating them from invoices.")
sequence_id = fields.Many2one('ir.sequence', string='Entry Sequence',
help="This field contains the information related to the numbering of the journal entries of this journal.", required=True, copy=False)
refund_sequence_id = fields.Many2one('ir.sequence', string='Credit Note Entry Sequence',
@@ -738,7 +736,7 @@ class AccountJournal(models.Model):
if self.alias_id:
self.alias_id.write(alias_values)
else:
self.alias_id = self.env['mail.alias'].with_context(alias_model_name='account.invoice',
self.alias_id = self.env['mail.alias'].with_context(alias_model_name='account.move',
alias_parent_model_name='account.journal').create(alias_values)
if vals.get('alias_name'):
@@ -1179,17 +1177,6 @@ class AccountTax(models.Model):
if self.price_include:
self.include_base_amount = True
def get_grouping_key(self, invoice_tax_val):
""" Returns a string that will be used to group account.invoice.tax sharing the same properties"""
self.ensure_one()
return str(invoice_tax_val['tax_id']) + '-' + \
str(invoice_tax_val.get('tax_repartition_line_id')) + '-' + \
str(invoice_tax_val['account_id']) + '-' + \
str(invoice_tax_val['account_analytic_id']) + '-' + \
str(invoice_tax_val.get('analytic_tag_ids', [])) + '-' + \
str(invoice_tax_val.get('tax_ids') or []) + '-' + \
str(invoice_tax_val.get('tag_ids') or [])
def _compute_amount(self, base_amount, price_unit, quantity=1.0, product=None, partner=None):
""" Returns the amount of a single tax. base_amount is the actual amount on which the tax is applied, which is
price_unit * quantity eventually affected by previous taxes (if tax is include_base_amount XOR price_include)
@@ -1210,7 +1197,7 @@ class AccountTax(models.Model):
else:
return quantity * self.amount
price_include = self._context['force_price_include'] if 'force_price_include' in self._context else self.price_include
price_include = self._context.get('force_price_include', self.price_include)
# base * (1 + tax_amount) = new_base
if self.amount_type == 'percent' and not price_include:
@@ -1254,12 +1241,15 @@ class AccountTax(models.Model):
return rep_lines.filtered(lambda x: x.repartition_type == repartition_type).mapped('tag_ids')
@api.multi
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False):
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True):
""" Returns all information required to apply taxes (in self + their children in case of a tax group).
We consider the sequence of the parent for group of taxes.
Eg. considering letters as taxes and alphabetic order as sequence :
[G, B([A, D, F]), E, C] will be computed as [A, D, F, C, E, G]
'handle_price_include' is used when we need to ignore all tax included in price. If False, it means the
amount passed to this method will be considered as the base of all computations.
RETURN: {
'total_excluded': 0.0, # Total without taxes
'total_included': 0.0, # Total with taxes
@@ -1362,28 +1352,29 @@ class AccountTax(models.Model):
incl_fixed_amount = incl_percent_amount = incl_division_amount = 0
# Store the tax amounts we compute while searching for the total_excluded
cached_tax_amounts = {}
for tax in reversed(taxes):
if tax.include_base_amount:
base = recompute_base(base, incl_fixed_amount, incl_percent_amount, incl_division_amount)
incl_fixed_amount = incl_percent_amount = incl_division_amount = 0
store_included_tax_total = True
if tax.price_include:
if tax.amount_type == 'percent':
incl_percent_amount += tax.amount
elif tax.amount_type == 'division':
incl_division_amount += tax.amount
elif tax.amount_type == 'fixed':
incl_fixed_amount += quantity * tax.amount
else:
# tax.amount_type == other (python)
tax_amount = tax._compute_amount(base, price_unit, quantity, product, partner)
incl_fixed_amount += tax_amount
# Avoid unecessary re-computation
cached_tax_amounts[i] = tax_amount
if store_included_tax_total:
total_included_checkpoints[i] = base
store_included_tax_total = False
i -= 1
if handle_price_include:
for tax in reversed(taxes):
if tax.include_base_amount:
base = recompute_base(base, incl_fixed_amount, incl_percent_amount, incl_division_amount)
incl_fixed_amount = incl_percent_amount = incl_division_amount = 0
store_included_tax_total = True
if tax.price_include:
if tax.amount_type == 'percent':
incl_percent_amount += tax.amount
elif tax.amount_type == 'division':
incl_division_amount += tax.amount
elif tax.amount_type == 'fixed':
incl_fixed_amount += quantity * tax.amount
else:
# tax.amount_type == other (python)
tax_amount = tax._compute_amount(base, price_unit, quantity, product, partner)
incl_fixed_amount += tax_amount
# Avoid unecessary re-computation
cached_tax_amounts[i] = tax_amount
if store_included_tax_total:
total_included_checkpoints[i] = base
store_included_tax_total = False
i -= 1
total_excluded = recompute_base(base, incl_fixed_amount, incl_percent_amount, incl_division_amount)
@@ -1438,8 +1429,8 @@ class AccountTax(models.Model):
'price_include': tax.price_include,
'tax_exigibility': tax.tax_exigibility,
'tax_repartition_line_id': repartition_line.id,
'tag_ids': [(6, False, (repartition_line.tag_ids + subsequent_tags).ids)],
'tax_ids': [(6, False, subsequent_taxes.ids)]
'tag_ids': (repartition_line.tag_ids + subsequent_tags).ids,
'tax_ids': subsequent_taxes.ids,
})
total_amount += line_amount
@@ -395,6 +395,7 @@ class AccountBankStatementLine(models.Model):
aml_to_cancel.remove_move_reconcile()
moves_to_cancel = aml_to_cancel.mapped('move_id')
moves_to_cancel.button_cancel()
moves_to_cancel.button_draft()
moves_to_cancel.unlink()
if payment_to_cancel:
payment_to_cancel.unlink()
@@ -432,7 +433,9 @@ class AccountBankStatementLine(models.Model):
if self.ref:
ref = move_ref + ' - ' + self.ref if move_ref else self.ref
data = {
'type': 'entry',
'journal_id': self.statement_id.journal_id.id,
'currency_id': self.statement_id.currency_id.id,
'date': self.statement_id.accounting_date or self.date,
'ref': ref,
}
@@ -622,7 +625,7 @@ class AccountBankStatementLine(models.Model):
"""
payable_account_type = self.env.ref('account.data_account_type_payable')
receivable_account_type = self.env.ref('account.data_account_type_receivable')
edition_mode = self._context.get('edition_mode')
suspense_moves_mode = self._context.get('suspense_moves_mode')
counterpart_aml_dicts = counterpart_aml_dicts or []
payment_aml_rec = payment_aml_rec or self.env['account.move.line']
new_aml_dicts = new_aml_dicts or []
@@ -639,7 +642,7 @@ class AccountBankStatementLine(models.Model):
if any(rec.statement_id for rec in payment_aml_rec):
raise UserError(_('A selected move line was already reconciled.'))
for aml_dict in counterpart_aml_dicts:
if aml_dict['move_line'].reconciled and not edition_mode:
if aml_dict['move_line'].reconciled and not suspense_moves_mode:
raise UserError(_('A selected move line was already reconciled.'))
if isinstance(aml_dict['move_line'], int):
aml_dict['move_line'] = aml_obj.browse(aml_dict['move_line'])
@@ -653,7 +656,7 @@ class AccountBankStatementLine(models.Model):
user_type_id = self.env['account.account'].browse(aml_dict.get('account_id')).user_type_id
if user_type_id in [payable_account_type, receivable_account_type] and user_type_id not in account_types:
account_types |= user_type_id
if edition_mode:
if suspense_moves_mode:
if any(not line.journal_entry_ids for line in self):
raise UserError(_('Some selected statement line were not already reconciled with an account move.'))
else:
@@ -686,9 +689,9 @@ class AccountBankStatementLine(models.Model):
# Create the move
self.sequence = self.statement_id.line_ids.ids.index(self.id) + 1
move_vals = self._prepare_reconciliation_move(self.statement_id.name)
if edition_mode:
if suspense_moves_mode:
self.button_cancel_reconciliation()
move = self.env['account.move'].create(move_vals)
move = self.env['account.move'].with_context(default_journal_id=move_vals['journal_id']).create(move_vals)
counterpart_moves = (counterpart_moves | move)
# Create The payment
@@ -730,7 +733,7 @@ class AccountBankStatementLine(models.Model):
(new_aml | counterpart_move_line).reconcile()
self._check_invoice_state(counterpart_move_line.invoice_id)
self._check_invoice_state(counterpart_move_line.move_id)
# Balance the move
st_line_amount = -sum([x.balance for x in move.line_ids])
@@ -756,7 +759,7 @@ class AccountBankStatementLine(models.Model):
})
self.bank_account_id = bank_account
counterpart_moves.assert_balanced()
counterpart_moves._check_balanced()
return counterpart_moves
@api.multi
@@ -790,5 +793,4 @@ class AccountBankStatementLine(models.Model):
aml_dict['currency_id'] = statement_currency.id
def _check_invoice_state(self, invoice):
if invoice.state == 'in_payment' and all([payment.state == 'reconciled' for payment in invoice.mapped('payment_move_line_ids.payment_id')]):
invoice.write({'state': 'paid'})
invoice._compute_amount()
File diff suppressed because it is too large Load Diff
@@ -9,6 +9,9 @@ from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DF, safe_eval
from odoo.tools.misc import formatLang, format_date as odoo_format_date
import random
import ast
class account_journal(models.Model):
_inherit = "account.journal"
@@ -157,12 +160,12 @@ class account_journal(models.Model):
start_date = (first_day_of_week + timedelta(days=-7))
for i in range(0,6):
if i == 0:
query += "("+select_sql_clause+" and date_due < '"+start_date.strftime(DF)+"')"
query += "("+select_sql_clause+" and invoice_date_due < '"+start_date.strftime(DF)+"')"
elif i == 5:
query += " UNION ALL ("+select_sql_clause+" and date_due >= '"+start_date.strftime(DF)+"')"
query += " UNION ALL ("+select_sql_clause+" and invoice_date_due >= '"+start_date.strftime(DF)+"')"
else:
next_date = start_date + timedelta(days=7)
query += " UNION ALL ("+select_sql_clause+" and date_due >= '"+start_date.strftime(DF)+"' and date_due < '"+next_date.strftime(DF)+"')"
query += " UNION ALL ("+select_sql_clause+" and invoice_date_due >= '"+start_date.strftime(DF)+"' and invoice_date_due < '"+next_date.strftime(DF)+"')"
start_date = next_date
self.env.cr.execute(query, query_args)
@@ -190,9 +193,17 @@ class account_journal(models.Model):
the bar graph's data as its first element, and the arguments dictionary
for it as its second.
"""
return ("""SELECT sum(residual_company_signed) as total, min(date_due) as aggr_date
FROM account_invoice
WHERE journal_id = %(journal_id)s and state = 'open'""", {'journal_id':self.id})
return ('''
SELECT
SUM((CASE WHEN move.type IN ('out_refund', 'in_refund') THEN -1 else 1 END) * line.amount_residual) AS total,
MIN(invoice_date_due) AS aggr_date
FROM account_move_line line
JOIN account_move move ON move.id = line.move_id
WHERE move.journal_id = %(journal_id)s
AND move.state = 'posted'
AND move.invoice_payment_state = 'not_paid'
AND move.type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')
''', {'journal_id': self.id})
@api.multi
def get_journal_dashboard_datas(self):
@@ -241,7 +252,20 @@ class account_journal(models.Model):
query_results_drafts = self.env.cr.dictfetchall()
today = fields.Date.today()
query = """SELECT residual_signed as amount_total, currency_id AS currency, type, date_invoice, company_id FROM account_invoice WHERE journal_id = %s AND date <= %s AND state = 'open';"""
query = '''
SELECT
(CASE WHEN type IN ('out_refund', 'in_refund') THEN -1 ELSE 1 END) * amount_residual AS amount_total,
currency_id AS currency,
type,
invoice_date,
company_id
FROM account_move move
WHERE journal_id = %s
AND date <= %s
AND state = 'posted'
AND invoice_payment_state = 'not_paid'
AND type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt');
'''
self.env.cr.execute(query, (self.id, today))
late_query_results = self.env.cr.dictfetchall()
curr_cache = {}
@@ -282,9 +306,19 @@ class account_journal(models.Model):
data as its first element, and the arguments dictionary to use to run
it as its second.
"""
return ("""SELECT state, residual_signed as amount_total, currency_id AS currency, type, date_invoice, company_id
FROM account_invoice
WHERE journal_id = %(journal_id)s AND state = 'open';""", {'journal_id':self.id})
return ('''
SELECT
(CASE WHEN move.type IN ('out_refund', 'in_refund') THEN -1 ELSE 1 END) * move.amount_residual AS amount_total,
move.currency_id AS currency,
move.type,
move.invoice_date,
move.company_id
FROM account_move move
WHERE move.journal_id = %(journal_id)s
AND move.state = 'posted'
AND move.invoice_payment_state = 'not_paid'
AND move.type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt');
''', {'journal_id': self.id})
def _get_draft_bills_query(self):
"""
@@ -292,18 +326,19 @@ class account_journal(models.Model):
gather the bills in draft state data, and the arguments
dictionary to use to run it as its second.
"""
# there is no account_move_lines for draft invoices, so no relevant residual_signed value
return ("""SELECT state,
(CASE WHEN inv.type in ('out_invoice', 'in_invoice')
THEN inv.amount_total
ELSE (-1 * inv.amount_total)
END) AS amount_total,
inv.currency_id AS currency,
inv.type,
inv.date_invoice,
inv.company_id
FROM account_invoice inv
WHERE journal_id = %(journal_id)s AND state = 'draft';""", {'journal_id':self.id})
return ('''
SELECT
(CASE WHEN move.type IN ('out_refund', 'in_refund') THEN -1 ELSE 1 END) * move.amount_total AS amount_total,
move.currency_id AS currency,
move.type,
move.invoice_date,
move.company_id
FROM account_move move
WHERE move.journal_id = %(journal_id)s
AND move.state = 'draft'
AND move.invoice_payment_state = 'not_paid'
AND move.type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt');
''', {'journal_id': self.id})
def _count_results_and_sum_amounts(self, results_dict, target_currency, curr_cache=None):
""" Loops on a query result to count the total number of invoices and sum
@@ -320,7 +355,7 @@ class account_journal(models.Model):
cur = self.env['res.currency'].browse(result.get('currency'))
company = self.env['res.company'].browse(result.get('company_id')) or self.env.company
rslt_count += 1
date = result.get('date_invoice') or fields.Date.today()
date = result.get('invoice_date') or fields.Date.today()
amount = result.get('amount_total', 0) or 0
if cur != target_currency:
@@ -336,27 +371,20 @@ class account_journal(models.Model):
@api.multi
def action_create_new(self):
ctx = self._context.copy()
model = 'account.invoice'
ctx['default_journal_id'] = self.id
if self.type == 'sale':
ctx.update({'journal_type': self.type, 'default_type': 'out_invoice', 'type': 'out_invoice', 'default_journal_id': self.id})
if ctx.get('refund'):
ctx.update({'default_type':'out_refund', 'type':'out_refund'})
view_id = self.env.ref('account.invoice_form').id
ctx['default_type'] = 'out_refund' if ctx.get('refund') else 'out_invoice'
elif self.type == 'purchase':
ctx.update({'journal_type': self.type, 'default_type': 'in_invoice', 'type': 'in_invoice', 'default_journal_id': self.id})
if ctx.get('refund'):
ctx.update({'default_type': 'in_refund', 'type': 'in_refund'})
view_id = self.env.ref('account.invoice_supplier_form').id
ctx['default_type'] = 'in_refund' if ctx.get('refund') else 'in_invoice'
else:
ctx.update({'default_journal_id': self.id, 'view_no_maturity': True})
view_id = self.env.ref('account.view_move_form').id
model = 'account.move'
ctx['default_type'] = 'entry'
ctx['view_no_maturity'] = True
return {
'name': _('Create invoice/bill'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': model,
'view_id': view_id,
'res_model': 'account.move',
'view_id': self.env.ref('account.view_move_form').id,
'context': ctx,
}
@@ -400,7 +428,7 @@ class account_journal(models.Model):
self.ensure_one()
ids = self.to_check_ids().ids
action_context = {'show_mode_selector': False, 'company_ids': self.mapped('company_id').ids}
action_context.update({'edition_mode': True})
action_context.update({'suspense_moves_mode': True})
action_context.update({'statement_line_ids': ids})
return {
'type': 'ir.actions.client',
@@ -410,7 +438,7 @@ class account_journal(models.Model):
def to_check_ids(self):
self.ensure_one()
domain = self.env['account.move.line']._get_domain_for_edition_mode()
domain = self.env['account.move.line']._get_suspense_moves_domain()
domain.append(('journal_id', '=', self.id))
statement_line_ids = self.env['account.move.line'].search(domain).mapped('statement_line_id')
return statement_line_ids
@@ -418,60 +446,42 @@ class account_journal(models.Model):
@api.multi
def open_action(self):
"""return action based on type for related journals"""
action_name = self._context.get('action_name', False)
action_name = self._context.get('action_name')
# Find action based on journal.
if not action_name:
if self.type == 'bank':
action_name = 'action_bank_statement_tree'
elif self.type == 'cash':
action_name = 'action_view_bank_statement_tree'
elif self.type == 'sale':
action_name = 'action_invoice_tree1'
use_domain = expression.AND(
[self.env.context.get('use_domain', []), [('journal_id', '=', self.id)]]
)
self = self.with_context(use_domain=use_domain)
action_name = 'action_move_out_invoice_type'
elif self.type == 'purchase':
action_name = 'action_vendor_bill_template'
use_domain = expression.AND(
[self.env.context.get('use_domain', []), [('journal_id', '=', self.id)]]
)
self = self.with_context(use_domain=use_domain)
action_name = 'action_move_in_invoice_type'
else:
action_name = 'action_move_journal_line'
_journal_invoice_type_map = {
('sale', None): 'out_invoice',
('purchase', None): 'in_invoice',
('sale', 'refund'): 'out_refund',
('purchase', 'refund'): 'in_refund',
('bank', None): 'bank',
('cash', None): 'cash',
('general', None): 'general',
}
invoice_type = _journal_invoice_type_map[(self.type, self._context.get('invoice_type'))]
# Set 'account.' prefix if missing.
if '.' not in action_name:
action_name = 'account.%s' % action_name
ctx = self._context.copy()
ctx.pop('group_by', None)
ctx.update({
'journal_type': self.type,
action = self.env.ref(action_name).read()[0]
context = self._context.copy()
if 'context' in action and type(action['context']) == str:
context.update(ast.literal_eval(action['context']))
else:
context.update(action.get('context', {}))
action['context'] = context
action['context'].update({
'default_journal_id': self.id,
'default_type': invoice_type,
'type': invoice_type,
'search_default_journal_id': self.id,
})
[action] = self.env.ref('account.%s' % action_name).read()
action['context'] = ctx
action['domain'] = self._context.get('use_domain', [])
account_invoice_filter = self.env.ref('account.view_account_invoice_filter', False)
if action_name in ['action_invoice_tree1', 'action_vendor_bill_template']:
action['search_view_id'] = account_invoice_filter and account_invoice_filter.id or False
if action_name in ['action_bank_statement_tree', 'action_view_bank_statement_tree']:
action['views'] = False
action['view_id'] = False
if self.type == 'purchase':
new_help = self.env['account.invoice'].with_context(ctx).complete_empty_list_help()
action.update({'help': (action.get('help') or '') + new_help})
if self.type == 'sale':
action['domain'] = [('type', 'in', ('out_invoice', 'out_refund', 'out_receipt'))]
elif self.type == 'purchase':
action['domain'] = [('type', 'in', ('in_invoice', 'in_refund', 'in_receipt'))]
return action
@api.multi
File diff suppressed because it is too large Load Diff
+276 -244
View File
@@ -2,22 +2,14 @@
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
from odoo.tools import float_compare
from itertools import groupby
MAP_INVOICE_TYPE_PARTNER_TYPE = {
'out_invoice': 'customer',
'out_refund': 'customer',
'out_receipt': 'customer',
'in_invoice': 'supplier',
'in_refund': 'supplier',
}
# Since invoice amounts are unsigned, this is how we know if money comes in or goes out
MAP_INVOICE_TYPE_PAYMENT_SIGN = {
'out_invoice': 1,
'in_refund': -1,
'in_invoice': -1,
'out_refund': 1,
'in_receipt': 'supplier',
}
@@ -47,11 +39,11 @@ class account_payment(models.Model):
# For money transfer, money goes from journal_id to a transfer account, then from the transfer account to destination_journal_id
destination_journal_id = fields.Many2one('account.journal', string='Transfer To', domain=[('type', 'in', ('bank', 'cash'))], readonly=True, states={'draft': [('readonly', False)]})
invoice_ids = fields.Many2many('account.invoice', 'account_invoice_payment_rel', 'payment_id', 'invoice_id', string="Invoices", copy=False, readonly=True,
invoice_ids = fields.Many2many('account.move', 'account_invoice_payment_rel', 'payment_id', 'invoice_id', string="Invoices", copy=False, readonly=True,
help="""Technical field containing the invoice for which the payment has been generated.
This does not especially correspond to the invoices reconciled with the payment,
as it can have been generated first, and reconciled later""")
reconciled_invoice_ids = fields.Many2many('account.invoice', string='Reconciled Invoices', compute='_compute_reconciled_invoice_ids', help="Invoices whose journal items have been reconciled with this payment's.")
reconciled_invoice_ids = fields.Many2many('account.move', string='Reconciled Invoices', compute='_compute_reconciled_invoice_ids', help="Invoices whose journal items have been reconciled with these payments.")
has_invoices = fields.Boolean(compute="_compute_reconciled_invoice_ids", help="Technical field used for usability purposes")
move_line_ids = fields.One2many('account.move.line', 'payment_id', readonly=True, copy=False, ondelete='restrict')
@@ -94,19 +86,19 @@ class account_payment(models.Model):
require_partner_bank_account = fields.Boolean(compute='_compute_show_partner_bank', help='Technical field used to know whether the field `partner_bank_account_id` needs to be required or not in the payments form views')
@api.model
def default_get(self, fields):
rec = super(account_payment, self).default_get(fields)
def default_get(self, default_fields):
rec = super(account_payment, self).default_get(default_fields)
active_ids = self._context.get('active_ids') or self._context.get('active_id')
active_model = self._context.get('active_model')
# Check for selected invoices ids
if not active_ids or active_model != 'account.invoice':
if not active_ids or active_model != 'account.move':
return rec
invoices = self.env['account.invoice'].browse(active_ids)
invoices = self.env['account.move'].browse(active_ids).filtered(lambda move: move.is_invoice(include_receipts=True))
# Check all invoices are open
if any(invoice.state != 'open' for invoice in invoices):
if not invoices or any(invoice.state != 'posted' for invoice in invoices):
raise UserError(_("You can only register payments for open invoices"))
# Check if, in batch payments, there are not negative invoices and positive invoices
dtype = invoices[0].type
@@ -119,23 +111,23 @@ class account_payment(models.Model):
(dtype == 'out_invoice' and inv.type == 'out_refund')):
raise UserError(_("You cannot register payments for customer invoices and credit notes at the same time."))
amount = self._compute_payment_amount(invoices, invoices[0].currency_id)
amount = self._compute_payment_amount(invoices, invoices[0].currency_id, invoices[0].journal_id, rec.get('payment_date') or fields.Date.today())
rec.update({
'currency_id': invoices[0].currency_id.id,
'amount': abs(amount),
'payment_type': 'inbound' if amount > 0 else 'outbound',
'partner_id': invoices[0].commercial_partner_id.id,
'partner_type': MAP_INVOICE_TYPE_PARTNER_TYPE[invoices[0].type],
'communication': invoices[0].reference or invoices[0].number,
'communication': invoices[0].ref or invoices[0].name,
'invoice_ids': [(6, 0, invoices.ids)],
})
return rec
@api.one
@api.constrains('amount')
def _check_amount(self):
if self.amount < 0:
raise ValidationError(_('The payment amount cannot be negative.'))
for payment in self:
if payment.amount < 0:
raise ValidationError(_('The payment amount cannot be negative.'))
@api.model
def _get_method_codes_using_bank_account(self):
@@ -169,11 +161,14 @@ class account_payment(models.Model):
def _compute_payment_difference(self):
for pay in self.filtered(lambda p: p.invoice_ids and p.state == 'draft'):
payment_amount = -pay.amount if pay.payment_type == 'outbound' else pay.amount
pay.payment_difference = pay._compute_payment_amount() - payment_amount
pay.payment_difference = pay._compute_payment_amount(pay.invoice_ids, pay.currency_id, pay.journal_id, pay.payment_date) - payment_amount
@api.onchange('journal_id')
def _onchange_journal(self):
if self.journal_id:
if self.journal_id.currency_id:
self.currency_id = self.journal_id.currency_id
# Set default payment method (we consider the first to be the default one)
payment_methods = self.payment_type == 'inbound' and self.journal_id.inbound_payment_method_ids or self.journal_id.outbound_payment_method_ids
payment_methods_list = payment_methods.ids
@@ -190,18 +185,18 @@ class account_payment(models.Model):
domain = {'payment_method_id': [('payment_type', '=', payment_type), ('id', 'in', payment_methods_list)]}
if self.env.context.get('active_model') == 'account.invoice':
if self.env.context.get('active_model') == 'account.move':
active_ids = self._context.get('active_ids')
invoices = self.env['account.invoice'].browse(active_ids)
self.amount = abs(self._compute_payment_amount(invoices))
invoices = self.env['account.move'].browse(active_ids)
self.amount = abs(self._compute_payment_amount(invoices, self.currency_id, self.journal_id, self.payment_date))
return {'domain': domain}
return {}
@api.onchange('partner_id')
def _onchange_partner_id(self):
if self.invoice_ids and self.invoice_ids[0].partner_bank_id:
self.partner_bank_account_id = self.invoice_ids[0].partner_bank_id
if self.invoice_ids and self.invoice_ids[0].invoice_partner_bank_id:
self.partner_bank_account_id = self.invoice_ids[0].invoice_partner_bank_id
elif self.partner_id != self.partner_bank_account_id.partner_id:
# This condition ensures we use the default value provided into
# context for partner_bank_account_id properly when provided with a
@@ -272,7 +267,7 @@ class account_payment(models.Model):
@api.onchange('currency_id')
def _onchange_currency(self):
self.amount = abs(self._compute_payment_amount())
self.amount = abs(self._compute_payment_amount(self.invoice_ids, self.currency_id, self.journal_id, self.payment_date))
if self.journal_id: # TODO: only return if currency differ?
return
@@ -285,36 +280,48 @@ class account_payment(models.Model):
if journal:
return {'value': {'journal_id': journal.id}}
@api.multi
def _compute_payment_amount(self, invoices=None, currency=None):
@api.model
def _compute_payment_amount(self, invoices, currency, journal, date):
'''Compute the total amount for the payment wizard.
:param invoices: If not specified, pick all the invoices.
:param currency: If not specified, search a default currency on wizard/journal.
:return: The total amount to pay the invoices.
:param invoices: Invoices on which compute the total as an account.invoice recordset.
:param currency: The payment's currency as a res.currency record.
:param journal: The payment's journal as an account.journal record.
:param date: The payment's date as a datetime.date object.
:return: The total amount to pay the invoices.
'''
company = journal.company_id
currency = currency or journal.currency_id or company.currency_id
date = date or fields.Date.today()
# Get the payment invoices
if not invoices:
invoices = self.invoice_ids
return 0.0
# Get the payment currency
if not currency:
currency = self.currency_id or self.journal_id.currency_id or self.journal_id.company_id.currency_id
self._cr.execute('''
SELECT
move.type AS type,
move.currency_id AS currency_id,
SUM(line.amount_residual) AS amount_residual,
SUM(line.amount_residual_currency) AS residual_currency
FROM account_move move
LEFT JOIN account_move_line line ON line.move_id = move.id
LEFT JOIN account_account account ON account.id = line.account_id
LEFT JOIN account_account_type account_type ON account_type.id = account.user_type_id
WHERE move.id IN %s
AND account_type.type IN ('receivable', 'payable')
GROUP BY move.id, move.type
''', [tuple(invoices.ids)])
query_res = self._cr.dictfetchall()
# Avoid currency rounding issues by summing the amounts according to the company_currency_id before
invoice_datas = invoices.read_group(
[('id', 'in', invoices.ids)],
['currency_id', 'type', 'residual_signed'],
['currency_id', 'type'], lazy=False)
total = 0.0
for invoice_data in invoice_datas:
amount_total = MAP_INVOICE_TYPE_PAYMENT_SIGN[invoice_data['type']] * invoice_data['residual_signed']
payment_currency = self.env['res.currency'].browse(invoice_data['currency_id'][0])
if payment_currency == currency:
total += amount_total
for res in query_res:
move_currency = self.env['res.currency'].browse(res['currency_id'])
if move_currency == currency and move_currency != company.currency_id:
total += res['residual_currency']
elif move_currency == currency == company.currency_id:
total += res['amount_residual']
else:
total += payment_currency._convert(amount_total, currency, self.env.company, self.payment_date or fields.Date.today())
total += move_currency._convert(res['amount_residual'], currency, company, date)
return total
@api.multi
@@ -358,7 +365,8 @@ class account_payment(models.Model):
@api.depends('invoice_ids', 'payment_type', 'partner_type', 'partner_id')
def _compute_destination_account_id(self):
if self.invoice_ids:
self.destination_account_id = self.invoice_ids[0].account_id.id
self.destination_account_id = self.invoice_ids[0].mapped('line_ids.account_id')\
.filtered(lambda account: account.user_type_id.type in ('receivable', 'payable'))[0]
elif self.payment_type == 'transfer':
if not self.company_id.transfer_account_id.id:
raise UserError(_('There is no Transfer Account defined in the accounting settings. Please define one to be able to confirm this transfer.'))
@@ -378,8 +386,9 @@ class account_payment(models.Model):
@api.depends('move_line_ids.matched_debit_ids', 'move_line_ids.matched_credit_ids')
def _compute_reconciled_invoice_ids(self):
for record in self:
record.reconciled_invoice_ids = (record.move_line_ids.mapped('matched_debit_ids.debit_move_id.invoice_id') |
record.move_line_ids.mapped('matched_credit_ids.credit_move_id.invoice_id'))
reconciled_moves = record.move_line_ids.mapped('matched_debit_ids.debit_move_id.move_id')\
+ record.move_line_ids.mapped('matched_credit_ids.credit_move_id.move_id')
record.reconciled_invoice_ids = reconciled_moves.filtered(lambda move: move.is_invoice())
record.has_invoices = bool(record.reconciled_invoice_ids)
@api.multi
@@ -411,16 +420,12 @@ class account_payment(models.Model):
@api.multi
def button_invoices(self):
if self.partner_type == 'supplier':
views = [(self.env.ref('account.invoice_supplier_tree').id, 'tree'), (self.env.ref('account.invoice_supplier_form').id, 'form')]
else:
views = [(self.env.ref('account.invoice_tree').id, 'tree'), (self.env.ref('account.invoice_form').id, 'form')]
return {
'name': _('Paid Invoices'),
'view_mode': 'tree,form',
'res_model': 'account.invoice',
'res_model': 'account.move',
'view_id': False,
'views': views,
'views': [(self.env.ref('account.view_move_tree').id, 'tree'), (self.env.ref('account.view_move_form').id, 'form')],
'type': 'ir.actions.act_window',
'domain': [('id', 'in', [x.id for x in self.reconciled_invoice_ids])],
}
@@ -454,6 +459,186 @@ class account_payment(models.Model):
raise UserError(_('It is not allowed to delete a payment that already created a journal entry since it would create a gap in the numbering. You should create the journal entry again and cancel it thanks to a regular revert.'))
return super(account_payment, self).unlink()
@api.multi
def _prepare_payment_moves(self):
''' Prepare the creation of journal entries (account.move) by creating a list of python dictionary to be passed
to the 'create' method.
Example 1: outbound with write-off:
Account | Debit | Credit
---------------------------------------------------------
BANK | 900.0 |
RECEIVABLE | | 1000.0
WRITE-OFF ACCOUNT | 100.0 |
Example 2: internal transfer from BANK to CASH:
Account | Debit | Credit
---------------------------------------------------------
BANK | | 1000.0
TRANSFER | 1000.0 |
CASH | 1000.0 |
TRANSFER | | 1000.0
:return: A list of Python dictionary to be passed to env['account.move'].create.
'''
all_move_vals = []
for payment in self:
company_currency = payment.company_id.currency_id
# Compute amounts.
write_off_amount = payment.payment_difference_handling == 'reconcile' and -payment.payment_difference or 0.0
if payment.payment_type in ('outbound', 'transfer'):
counterpart_amount = payment.amount
liquidity_line_account = payment.journal_id.default_debit_account_id
else:
counterpart_amount = -payment.amount
liquidity_line_account = payment.journal_id.default_credit_account_id
# Manage currency.
if payment.currency_id == company_currency:
# Single-currency.
balance = counterpart_amount
write_off_balance = write_off_amount
counterpart_amount = write_off_amount = 0.0
currency_id = False
else:
# Multi-currencies.
balance = payment.currency_id._convert(counterpart_amount, company_currency, payment.company_id, payment.payment_date)
write_off_balance = payment.currency_id._convert(write_off_amount, company_currency, payment.company_id, payment.payment_date)
currency_id = payment.currency_id.id
# Manage custom currency on journal for liquidity line.
if payment.journal_id.currency_id and payment.currency_id != payment.journal_id.currency_id:
# Custom currency on journal.
liquidity_line_currency_id = payment.journal_id.currency_id.id
liquidity_amount = company_currency._convert(
balance, payment.journal_id.currency_id, payment.company_id, payment.payment_date)
else:
# Use the payment currency.
liquidity_line_currency_id = currency_id
liquidity_amount = counterpart_amount
# Compute 'name' to be used in receivable/payable line.
rec_pay_line_name = ''
if payment.payment_type == 'transfer':
rec_pay_line_name = payment.name
else:
if payment.partner_type == 'customer':
if payment.payment_type == 'inbound':
rec_pay_line_name += _("Customer Payment")
elif payment.payment_type == 'outbound':
rec_pay_line_name += _("Customer Credit Note")
elif payment.partner_type == 'supplier':
if payment.payment_type == 'inbound':
rec_pay_line_name += _("Vendor Credit Note")
elif payment.payment_type == 'outbound':
rec_pay_line_name += _("Vendor Payment")
if payment.invoice_ids:
rec_pay_line_name += ': %s' % ', '.join(payment.invoice_ids.mapped('name'))
# Compute 'name' to be used in liquidity line.
if payment.payment_type == 'transfer':
liquidity_line_name = _('Transfer to %s') % payment.destination_journal_id.name
else:
liquidity_line_name = payment.name
# ==== 'inbound' / 'outbound' ====
move_vals = {
'date': payment.payment_date,
'ref': payment.communication,
'journal_id': payment.journal_id.id,
'currency_id': payment.journal_id.currency_id.id or payment.company_id.currency_id.id,
'partner_id': payment.partner_id.id,
'line_ids': [
# Receivable / Payable / Transfer line.
(0, 0, {
'name': rec_pay_line_name,
'amount_currency': counterpart_amount + write_off_amount,
'currency_id': currency_id,
'debit': balance + write_off_balance > 0.0 and balance + write_off_balance or 0.0,
'credit': balance + write_off_balance < 0.0 and -balance - write_off_balance or 0.0,
'date_maturity': payment.payment_date,
'partner_id': payment.partner_id.id,
'account_id': payment.destination_account_id.id,
'payment_id': payment.id,
}),
# Liquidity line.
(0, 0, {
'name': liquidity_line_name,
'amount_currency': -liquidity_amount,
'currency_id': liquidity_line_currency_id,
'debit': balance < 0.0 and -balance or 0.0,
'credit': balance > 0.0 and balance or 0.0,
'date_maturity': payment.payment_date,
'partner_id': payment.partner_id.id,
'account_id': liquidity_line_account.id,
'payment_id': payment.id,
}),
],
}
if write_off_balance:
# Write-off line.
move_vals['line_ids'].append((0, 0, {
'name': payment.writeoff_label,
'amount_currency': -write_off_amount,
'currency_id': currency_id,
'debit': write_off_balance < 0.0 and -write_off_balance or 0.0,
'credit': write_off_balance > 0.0 and write_off_balance or 0.0,
'date_maturity': payment.payment_date,
'partner_id': payment.partner_id.id,
'account_id': payment.writeoff_account_id.id,
'payment_id': payment.id,
}))
all_move_vals.append(move_vals)
# ==== 'transfer' ====
if payment.payment_type == 'transfer':
if payment.destination_journal_id.currency_id:
transfer_amount = payment.currency_id._convert(counterpart_amount, payment.destination_journal_id.currency_id, payment.company_id, payment.payment_date)
else:
transfer_amount = 0.0
transfer_move_vals = {
'date': payment.payment_date,
'ref': payment.communication,
'partner_id': payment.partner_id.id,
'journal_id': payment.destination_journal_id.id,
'line_ids': [
# Transfer debit line.
(0, 0, {
'name': payment.name,
'amount_currency': -counterpart_amount,
'currency_id': currency_id,
'debit': balance < 0.0 and -balance or 0.0,
'credit': balance > 0.0 and balance or 0.0,
'date_maturity': payment.payment_date,
'partner_id': payment.partner_id.id,
'account_id': payment.company_id.transfer_account_id.id,
'payment_id': payment.id,
}),
# Liquidity credit line.
(0, 0, {
'name': _('Transfer from %s') % payment.journal_id.name,
'amount_currency': transfer_amount,
'currency_id': payment.destination_journal_id.currency_id.id,
'debit': balance > 0.0 and balance or 0.0,
'credit': balance < 0.0 and -balance or 0.0,
'date_maturity': payment.payment_date,
'partner_id': payment.partner_id.id,
'account_id': payment.destination_journal_id.default_credit_account_id.id,
'payment_id': payment.id,
}),
],
}
all_move_vals.append(transfer_move_vals)
return all_move_vals
@api.multi
def post(self):
""" Create the journal items for the payment and update the payment's state to 'posted'.
@@ -462,12 +647,13 @@ class account_payment(models.Model):
If invoice_ids is not empty, there will be one reconcilable move line per invoice to reconcile with.
If the payment is a transfer, a second journal entry is created in the destination journal to receive money from the transfer account.
"""
AccountMove = self.env['account.move'].with_context(default_type='entry')
for rec in self:
if rec.state != 'draft':
raise UserError(_("Only a draft payment can be posted."))
if any(inv.state != 'open' for inv in rec.invoice_ids):
if any(inv.state != 'posted' for inv in rec.invoice_ids):
raise ValidationError(_("The payment cannot be processed because the invoice is not open!"))
# keep the name in case of a payment reset to draft
@@ -486,187 +672,35 @@ class account_payment(models.Model):
sequence_code = 'account.payment.supplier.refund'
if rec.payment_type == 'outbound':
sequence_code = 'account.payment.supplier.invoice'
rec.name = self.env['ir.sequence'].with_context(ir_sequence_date=rec.payment_date).next_by_code(sequence_code)
rec.name = self.env['ir.sequence'].next_by_code(sequence_code, sequence_date=rec.payment_date)
if not rec.name and rec.payment_type != 'transfer':
raise UserError(_("You have to define a sequence for %s in your company.") % (sequence_code,))
# Create the journal entry
amount = rec.amount * (rec.payment_type in ('outbound', 'transfer') and 1 or -1)
move = rec._create_payment_entry(amount)
moves = AccountMove.create(rec._prepare_payment_moves())
moves.filtered(lambda move: not move.journal_id.post_at_bank_rec).post()
# In case of a transfer, the first journal entry created debited the source liquidity account and credited
# the transfer account. Now we debit the transfer account and credit the destination liquidity account.
if rec.payment_type == 'transfer':
transfer_credit_aml = move.line_ids.filtered(lambda r: r.account_id == rec.company_id.transfer_account_id)
transfer_debit_aml = rec._create_transfer_entry(amount)
(transfer_credit_aml + transfer_debit_aml).reconcile()
# Update the state / move before performing any reconciliation.
rec.write({'state': 'posted', 'move_name': moves[0].name})
if rec.payment_type in ('inbound', 'outbound'):
# ==== 'inbound' / 'outbound' ====
if rec.invoice_ids:
(moves[0] + rec.invoice_ids).line_ids \
.filtered(lambda line: not line.reconciled and line.account_id == rec.destination_account_id)\
.reconcile()
elif rec.payment_type == 'transfer':
# ==== 'transfer' ====
moves.mapped('line_ids')\
.filtered(lambda line: line.account_id == rec.company_id.transfer_account_id)\
.reconcile()
rec.write({'state': 'posted', 'move_name': move.name})
return True
@api.multi
def action_draft(self):
return self.write({'state': 'draft'})
def _create_payment_entry(self, amount):
""" Create a journal entry corresponding to a payment, if the payment references invoice(s) they are reconciled.
Return the journal entry.
"""
aml_obj = self.env['account.move.line'].with_context(check_move_validity=False)
debit, credit, amount_currency, currency_id = aml_obj.with_context(date=self.payment_date)._compute_amount_fields(amount, self.currency_id, self.company_id.currency_id)
move = self.env['account.move'].create(self._get_move_vals())
#Write line corresponding to invoice payment
counterpart_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, move.id, False)
counterpart_aml_dict.update(self._get_counterpart_move_line_vals(self.invoice_ids))
counterpart_aml_dict.update({'currency_id': currency_id})
counterpart_aml = aml_obj.create(counterpart_aml_dict)
#Reconcile with the invoices
if self.payment_difference_handling == 'reconcile' and self.payment_difference:
writeoff_line = self._get_shared_move_line_vals(0, 0, 0, move.id, False)
debit_wo, credit_wo, amount_currency_wo, currency_id = aml_obj.with_context(date=self.payment_date)._compute_amount_fields(self.payment_difference, self.currency_id, self.company_id.currency_id)
writeoff_line['name'] = self.writeoff_label
writeoff_line['account_id'] = self.writeoff_account_id.id
writeoff_line['debit'] = debit_wo
writeoff_line['credit'] = credit_wo
writeoff_line['amount_currency'] = amount_currency_wo
writeoff_line['currency_id'] = currency_id
writeoff_line = aml_obj.create(writeoff_line)
if counterpart_aml['debit'] or (writeoff_line['credit'] and not counterpart_aml['credit']):
counterpart_aml['debit'] += credit_wo - debit_wo
if counterpart_aml['credit'] or (writeoff_line['debit'] and not counterpart_aml['debit']):
counterpart_aml['credit'] += debit_wo - credit_wo
counterpart_aml['amount_currency'] -= amount_currency_wo
#Write counterpart lines
if not self.currency_id.is_zero(self.amount):
if not self.currency_id != self.company_id.currency_id:
amount_currency = 0
liquidity_aml_dict = self._get_shared_move_line_vals(credit, debit, -amount_currency, move.id, False)
liquidity_aml_dict.update(self._get_liquidity_move_line_vals(-amount))
aml_obj.create(liquidity_aml_dict)
#validate the payment
if not self.journal_id.post_at_bank_rec:
move.post()
#reconcile the invoice receivable/payable line(s) with the payment
if self.invoice_ids:
self.invoice_ids.register_payment(counterpart_aml)
return move
def _create_transfer_entry(self, amount):
""" Create the journal entry corresponding to the 'incoming money' part of an internal transfer, return the reconcilable move line
"""
aml_obj = self.env['account.move.line'].with_context(check_move_validity=False)
debit, credit, amount_currency, dummy = aml_obj.with_context(date=self.payment_date)._compute_amount_fields(amount, self.currency_id, self.company_id.currency_id)
amount_currency = self.destination_journal_id.currency_id and self.currency_id._convert(amount, self.destination_journal_id.currency_id, self.company_id, self.payment_date or fields.Date.today()) or 0
dst_move = self.env['account.move'].create(self._get_move_vals(self.destination_journal_id))
dst_liquidity_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, dst_move.id)
dst_liquidity_aml_dict.update({
'name': _('Transfer from %s') % self.journal_id.name,
'account_id': self.destination_journal_id.default_credit_account_id.id,
'currency_id': self.destination_journal_id.currency_id.id,
'journal_id': self.destination_journal_id.id})
aml_obj.create(dst_liquidity_aml_dict)
transfer_debit_aml_dict = self._get_shared_move_line_vals(credit, debit, 0, dst_move.id)
transfer_debit_aml_dict.update({
'name': self.name,
'account_id': self.company_id.transfer_account_id.id,
'journal_id': self.destination_journal_id.id})
if self.currency_id != self.company_id.currency_id:
transfer_debit_aml_dict.update({
'currency_id': self.currency_id.id,
'amount_currency': -self.amount,
})
transfer_debit_aml = aml_obj.create(transfer_debit_aml_dict)
if not self.destination_journal_id.post_at_bank_rec:
dst_move.post()
return transfer_debit_aml
def _get_move_vals(self, journal=None):
""" Return dict to create the payment move
"""
journal = journal or self.journal_id
move_vals = {
'date': self.payment_date,
'ref': self.communication or '',
'company_id': self.company_id.id,
'journal_id': journal.id,
}
if self.move_name:
move_vals['name'] = self.move_name
return move_vals
def _get_shared_move_line_vals(self, debit, credit, amount_currency, move_id, invoice_id=False):
""" Returns values common to both move lines (except for debit, credit and amount_currency which are reversed)
"""
return {
'partner_id': self.payment_type in ('inbound', 'outbound') and self.env['res.partner']._find_accounting_partner(self.partner_id).id or False,
'invoice_id': invoice_id and invoice_id.id or False,
'move_id': move_id,
'debit': debit,
'credit': credit,
'amount_currency': amount_currency or False,
'payment_id': self.id,
'journal_id': self.journal_id.id,
}
def _get_counterpart_move_line_vals(self, invoice=False):
if self.payment_type == 'transfer':
name = self.name
else:
name = ''
if self.partner_type == 'customer':
if self.payment_type == 'inbound':
name += _("Customer Payment")
elif self.payment_type == 'outbound':
name += _("Customer Credit Note")
elif self.partner_type == 'supplier':
if self.payment_type == 'inbound':
name += _("Vendor Credit Note")
elif self.payment_type == 'outbound':
name += _("Vendor Payment")
if invoice:
name += ': '
for inv in invoice:
if inv.move_id:
name += inv.number + ', '
name = name[:len(name)-2]
return {
'name': name,
'account_id': self.destination_account_id.id,
'currency_id': self.currency_id != self.company_id.currency_id and self.currency_id.id or False,
}
def _get_liquidity_move_line_vals(self, amount):
name = self.name
if self.payment_type == 'transfer':
name = _('Transfer to %s') % self.destination_journal_id.name
vals = {
'name': name,
'account_id': self.payment_type in ('outbound', 'transfer') and self.journal_id.default_debit_account_id.id or self.journal_id.default_credit_account_id.id,
'journal_id': self.journal_id.id,
'currency_id': self.currency_id != self.company_id.currency_id and self.currency_id.id or False,
}
# If the journal has a currency specified, the journal item need to be expressed in this currency
if self.journal_id.currency_id and self.currency_id != self.journal_id.currency_id:
amount = self.currency_id._convert(amount, self.journal_id.currency_id, self.company_id, self.payment_date or fields.Date.today())
debit, credit, amount_currency, dummy = self.env['account.move.line'].with_context(date=self.payment_date)._compute_amount_fields(amount, self.journal_id.currency_id, self.company_id.currency_id)
vals.update({
'amount_currency': amount_currency,
'currency_id': self.journal_id.currency_id.id,
})
return vals
@api.multi
def _get_invoice_payment_amount(self, inv):
"""
Computes the amount covered by the current payment in the given invoice.
@@ -677,11 +711,10 @@ class account_payment(models.Model):
self.ensure_one()
return sum([
data['amount']
for data in inv._get_payments_vals()
for data in inv._get_reconciled_info_JSON_values()
if data['account_payment_id'] == self.id
])
class payment_register(models.TransientModel):
_name = 'account.payment.register'
_description = 'Register Payment'
@@ -694,21 +727,20 @@ class payment_register(models.TransientModel):
"Check: Pay bill by check and print it from Odoo.\n"
"Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo, you are suggested to reconcile the transaction with the batch deposit.To enable batch deposit, module account_batch_payment must be installed.\n"
"SEPA Credit Transfer: Pay bill from a SEPA Credit Transfer file you submit to your bank. To enable sepa credit transfer, module account_sepa must be installed ")
invoice_ids = fields.Many2many('account.invoice', 'account_invoice_payment_rel_transient', 'payment_id', 'invoice_id', string="Invoices", copy=False, readonly=True)
invoice_ids = fields.Many2many('account.move', 'account_invoice_payment_rel_transient', 'payment_id', 'invoice_id', string="Invoices", copy=False, readonly=True)
@api.model
def default_get(self, fields):
rec = super(payment_register, self).default_get(fields)
active_ids = self._context.get('active_ids')
active_model = self._context.get('active_model')
invoices = self.env['account.invoice'].browse(active_ids)
invoices = self.env['account.move'].browse(active_ids)
# Check all invoices are open
if any(invoice.state != 'open' for invoice in invoices):
if any(invoice.state != 'posted' or invoice.invoice_payment_state != 'not_paid' or not invoice.is_invoice() for invoice in invoices):
raise UserError(_("You can only register payments for open invoices"))
# Check all invoices are inbound or all invoices are outbound
outbound_list = [invoice.type in ('in_invoice', 'out_refund') for invoice in invoices]
first_outbound = invoices[0].type in ('in_invoice', 'out_refund')
outbound_list = [invoice.is_outbound() for invoice in invoices]
first_outbound = invoices[0].is_outbound()
if any(x != first_outbound for x in outbound_list):
raise UserError(_("You can only register at the same time for payment that are all inbound or all outbound"))
if 'invoice_ids' not in rec:
@@ -716,7 +748,7 @@ class payment_register(models.TransientModel):
if 'journal_id' not in rec:
rec['journal_id'] = self.env['account.journal'].search([('company_id', '=', self.env.company.id), ('type', 'in', ('bank', 'cash'))], limit=1).id
if 'payment_method_id' not in rec:
if invoices[0].type in ('out_invoice', 'in_refund'):
if invoices[0].is_inbound():
domain = [('payment_type', '=', 'inbound')]
else:
domain = [('payment_type', '=', 'outbound')]
@@ -726,9 +758,9 @@ class payment_register(models.TransientModel):
@api.onchange('journal_id', 'invoice_ids')
def _onchange_journal(self):
active_ids = self._context.get('active_ids')
invoices = self.env['account.invoice'].browse(active_ids)
invoices = self.env['account.move'].browse(active_ids)
if self.journal_id and invoices:
if invoices[0].type in ('out_invoice', 'in_refund'):
if invoices[0].is_inbound():
domain = [('payment_type', '=', 'inbound'), ('id', 'in', self.journal_id.inbound_payment_method_ids.ids)]
else:
domain = [('payment_type', '=', 'outbound'), ('id', 'in', self.journal_id.outbound_payment_method_ids.ids)]
@@ -743,19 +775,19 @@ class payment_register(models.TransientModel):
:param invoice: A single invoice/bill to pay.
:return: The payment values as a dictionary.
'''
amount = self.env['account.payment']._compute_payment_amount(invoices=invoice, currency=invoice.currency_id)
amount = self.env['account.payment']._compute_payment_amount(invoice, invoice.currency_id, self.journal_id, self.payment_date)
values = {
'journal_id': self.journal_id.id,
'payment_method_id': self.payment_method_id.id,
'payment_date': self.payment_date,
'communication': invoice.reference or invoice.number,
'communication': invoice.ref or invoice.name,
'invoice_ids': [(6, 0, invoice.ids)],
'payment_type': ('inbound' if amount > 0 else 'outbound'),
'amount': abs(amount),
'currency_id': invoice.currency_id.id,
'partner_id': invoice.commercial_partner_id.id,
'partner_type': MAP_INVOICE_TYPE_PARTNER_TYPE[invoice.type],
'partner_bank_account_id': invoice.partner_bank_id.id,
'partner_bank_account_id': invoice.invoice_partner_bank_id.id,
}
return values
+16 -17
View File
@@ -33,15 +33,15 @@ class AccountPaymentTerm(models.Model):
raise ValidationError(_('A Payment Term should have only one line of type Balance.'))
@api.multi
def compute(self, value, date_ref=False):
def compute(self, value, date_ref=False, currency=None):
self.ensure_one()
date_ref = date_ref or fields.Date.today()
amount = value
sign = value < 0 and -1 or 1
result = []
if self.env.context.get('currency_id'):
if not currency and self.env.context.get('currency_id'):
currency = self.env['res.currency'].browse(self.env.context['currency_id'])
else:
elif not currency:
currency = self.env.company.currency_id
for line in self.line_ids:
if line.value == 'fixed':
@@ -50,19 +50,18 @@ class AccountPaymentTerm(models.Model):
amt = currency.round(value * (line.value_amount / 100.0))
elif line.value == 'balance':
amt = currency.round(amount)
if amt:
next_date = fields.Date.from_string(date_ref)
if line.option == 'day_after_invoice_date':
next_date += relativedelta(days=line.days)
if line.day_of_the_month > 0:
months_delta = (line.day_of_the_month < next_date.day) and 1 or 0
next_date += relativedelta(day=line.day_of_the_month, months=months_delta)
elif line.option == 'day_following_month':
next_date += relativedelta(day=line.days, months=1)
elif line.option == 'day_current_month':
next_date += relativedelta(day=line.days, months=0)
result.append((fields.Date.to_string(next_date), amt))
amount -= amt
next_date = fields.Date.from_string(date_ref)
if line.option == 'day_after_invoice_date':
next_date += relativedelta(days=line.days)
if line.day_of_the_month > 0:
months_delta = (line.day_of_the_month < next_date.day) and 1 or 0
next_date += relativedelta(day=line.day_of_the_month, months=months_delta)
elif line.option == 'day_following_month':
next_date += relativedelta(day=line.days, months=1)
elif line.option == 'day_current_month':
next_date += relativedelta(day=line.days, months=0)
result.append((fields.Date.to_string(next_date), amt))
amount -= amt
amount = sum(amt for _, amt in result)
dist = currency.round(value - amount)
if dist:
@@ -73,7 +72,7 @@ class AccountPaymentTerm(models.Model):
@api.multi
def unlink(self):
for terms in self:
if self.env['account.invoice'].search([('payment_term_id', 'in', terms.ids)]):
if self.env['account.move'].search([('payment_term_id', 'in', terms.ids)]):
raise UserError(_('You can not delete payment terms as other records still reference it. However, you can archive it.'))
property_recs = self.env['ir.property'].search([('value_reference', 'in', ['account.payment.term,%s'%payment_term.id for payment_term in terms])])
property_recs.unlink()
@@ -102,18 +102,25 @@ class AccountReconcileModel(models.Model):
second_analytic_account_id = fields.Many2one('account.analytic.account', string='Second Analytic Account', ondelete='set null')
second_analytic_tag_ids = fields.Many2many('account.analytic.tag', string='Second Analytic Tags',
relation='account_reconcile_model_second_analytic_tag_rel')
number_entries = fields.Integer(string='Number of entries related to this model', compute='_compute_number_entries')
@api.multi
def action_reconcile_stat(self):
self.ensure_one()
action = self.env.ref('account.action_move_journal_line').read()[0]
self._cr.execute('''
SELECT ARRAY_AGG(DISTINCT move_id)
FROM account_move_line
WHERE reconcile_model_id = %s
''', [self.id])
action.update({
'context': {'search_default_reconcile_model_id': self.name},
'context': {},
'domain': [('id', 'in', self._cr.fetchone()[0])],
'help': """<p class="o_view_nocontent_empty_folder">{}</p>""".format(_('No move from this reconciliation model')),
})
return action
@api.multi
def _compute_number_entries(self):
data = self.env['account.move.line'].read_group([('reconcile_model_id', 'in', self.ids)], ['reconcile_model_ids'], 'reconcile_model_id')
@@ -438,10 +445,11 @@ class AccountReconcileModel(models.Model):
LEFT JOIN res_company company ON company.id = st_line.company_id
LEFT JOIN partners_table line_partner ON line_partner.line_id = st_line.id
, account_move_line aml
LEFT JOIN account_move move ON move.id = aml.move_id
LEFT JOIN account_move move ON move.id = aml.move_id AND move.state = 'posted'
LEFT JOIN account_account account ON account.id = aml.account_id
WHERE st_line.id IN %s
AND aml.company_id = st_line.company_id
AND move.state = 'posted'
AND (
-- the field match_partner of the rule might enforce the second part of
-- the OR condition, later in _apply_conditions()
@@ -456,7 +464,7 @@ class AccountReconcileModel(models.Model):
-- if there is a partner, propose all aml of the partner, otherwise propose only the ones
-- matching the statement line communication
AND
AND
(
(
line_partner.partner_id != 0
+1 -1
View File
@@ -264,7 +264,7 @@ class AccountChartTemplate(models.Model):
the provided company (meaning hence that its chart of accounts cannot
be changed anymore).
"""
model_to_check = ['account.move.line', 'account.invoice', 'account.payment', 'account.bank.statement']
model_to_check = ['account.move', 'account.payment', 'account.bank.statement']
for model in model_to_check:
if len(self.env[model].search([('company_id', '=', company_id.id)])) > 0:
return True
+20 -22
View File
@@ -2,7 +2,6 @@
from datetime import timedelta, datetime
import calendar
import time
from dateutil.relativedelta import relativedelta
from odoo import fields, models, api, _
@@ -10,6 +9,7 @@ from odoo.exceptions import ValidationError, UserError, RedirectWarning
from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
from odoo.tools.float_utils import float_round, float_is_zero
from odoo.tools import date_utils
from odoo.tests.common import Form
MONTH_SELECTION = [
@@ -102,7 +102,7 @@ Best Regards,'''))
account_dashboard_onboarding_state = fields.Selection([('not_done', "Not done"), ('just_done', "Just done"), ('done', "Done"), ('closed', "Closed")], string="State of the account dashboard onboarding panel", default='not_done')
invoice_terms = fields.Text(string='Default Terms and Conditions', translate=True)
@api.constrains('account_opening_date', 'fiscalyear_last_day', 'fiscalyear_last_month')
@api.constrains('account_opening_move_id', 'fiscalyear_last_day', 'fiscalyear_last_month')
def _check_fiscalyear_last_day(self):
# if the user explicitly chooses the 29th of February we allow it:
# there is no "fiscalyear_last_year" so we do not know his intentions.
@@ -483,7 +483,7 @@ Best Regards,'''))
company_id = self.env.company.id
# try to find an existing sample invoice
sample_invoice = self.env['account.invoice'].search(
sample_invoice = self.env['account.move'].search(
[('company_id', '=', company_id),
('partner_id', '=', partner.id)], limit=1)
@@ -498,25 +498,23 @@ Best Regards,'''))
"\nPlease go to Configuration > Journals.")
raise RedirectWarning(msg, action.id, _("Go to the journal configuration"))
sample_invoice = self.env['account.invoice'].create({
'name': _("Sample invoice"),
'journal_id': journal.id,
sample_invoice = self.env['account.move'].with_context(default_type='out_invoice', default_journal_id=journal.id).create({
'invoice_payment_ref': _('Sample invoice'),
'partner_id': partner.id,
})
# sample invoice lines
self.env['account.invoice.line'].create({
'name': _("Sample invoice line name"),
'invoice_id': sample_invoice.id,
'account_id': account.id,
'price_unit': 199.99,
'quantity': 2,
})
self.env['account.invoice.line'].create({
'name': _("Sample invoice line name 2"),
'invoice_id': sample_invoice.id,
'account_id': account.id,
'price_unit': 25,
'quantity': 1,
'invoice_line_ids': [
(0, 0, {
'name': _('Sample invoice line name'),
'account_id': account.id,
'quantity': 2,
'price_unit': 199.99,
}),
(0, 0, {
'name': _('Sample invoice line name 2'),
'account_id': account.id,
'quantity': 1,
'price_unit': 25.0,
}),
],
})
return sample_invoice
@@ -531,7 +529,7 @@ Best Regards,'''))
'default_res_id': sample_invoice.id,
'default_use_template': bool(template),
'default_template_id': template and template.id or False,
'default_model': 'account.invoice',
'default_model': 'account.move',
'default_composition_mode': 'comment',
'mark_invoice_as_sent': True,
'custom_layout': 'mail.mail_notification_borders',
+11 -7
View File
@@ -16,14 +16,18 @@ class Digest(models.Model):
raise AccessError(_("Do not have access, skip this data for user's digest email"))
for record in self:
start, end, company = record._get_kpi_compute_parameters()
account_moves = self.env['account.move'].read_group([
('journal_id.type', '=', 'sale'),
('company_id', '=', company.id),
('date', '>=', start),
('date', '<', end)], ['journal_id', 'amount'], ['journal_id'])
record.kpi_account_total_revenue_value = sum([account_move['amount'] for account_move in account_moves])
self._cr.execute('''
SELECT SUM(line.debit)
FROM account_move_line line
JOIN account_move move ON move.id = line.move_id
JOIN account_journal journal ON journal.id = move.journal_id
WHERE line.company_id = %s AND line.date >= %s AND line.date < %s
AND journal.type = 'sale'
''', [company.id, start, end])
query_res = self._cr.fetchone()
record.kpi_account_total_revenue_value = query_res and query_res[0] or 0.0
def compute_kpis_actions(self, company, user):
res = super(Digest, self).compute_kpis_actions(company, user)
res['kpi_account_total_revenue'] = 'account.action_invoice_tree1&menu_id=%s' % self.env.ref('account.menu_finance').id
res['kpi_account_total_revenue'] = 'account.action_move_out_invoice_type&menu_id=%s' % self.env.ref('account.menu_finance').id
return res
+11 -10
View File
@@ -209,7 +209,7 @@ class ResPartner(models.Model):
if where_clause:
where_clause = 'AND ' + where_clause
self._cr.execute("""SELECT account_move_line.partner_id, act.type, SUM(account_move_line.amount_residual)
FROM account_move_line
FROM """ + tables + """
LEFT JOIN account_account a ON (account_move_line.account_id=a.id)
LEFT JOIN account_account_type act ON (a.user_type_id=act.id)
WHERE act.type IN ('receivable','payable')
@@ -286,7 +286,7 @@ class ResPartner(models.Model):
# price_total is in the company currency
query = """
SELECT SUM(price_total) as total, partner_id
SELECT SUM(price_subtotal) as total, partner_id
FROM account_invoice_report account_invoice_report
WHERE %s
GROUP BY partner_id
@@ -410,7 +410,7 @@ class ResPartner(models.Model):
help='Last time the invoices & payments matching was performed for this partner. '
'It is set either if there\'s not at least an unreconciled debit and an unreconciled credit '
'or if you click the "Done" button.')
invoice_ids = fields.One2many('account.invoice', 'partner_id', string='Invoices', readonly=True, copy=False)
invoice_ids = fields.One2many('account.move', 'partner_id', string='Invoices', readonly=True, copy=False)
contract_ids = fields.One2many('account.analytic.account', 'partner_id', string='Partner Contracts', readonly=True)
bank_account_count = fields.Integer(compute='_compute_bank_count', string="Bank")
trust = fields.Selection([('good', 'Good Debtor'), ('normal', 'Normal Debtor'), ('bad', 'Bad Debtor')], string='Degree of trust you have in this debtor', default='normal', company_dependent=True)
@@ -437,15 +437,17 @@ class ResPartner(models.Model):
@api.multi
def action_view_partner_invoices(self):
self.ensure_one()
action = self.env.ref('account.action_invoice_refund_out_tree').read()[0]
action['domain'] = [('type','in', ['out_invoice', 'out_refund']), ('state', '!=', 'cancel')]
action['domain'].append(('partner_id', 'child_of', self.id))
action = self.env.ref('account.action_move_out_invoice_type').read()[0]
action['domain'] = [
('type', 'in', ('out_invoice', 'out_refund')),
('type', '=', 'posted'),
('partner_id', 'child_of', self.id),
]
action['context'] = {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale', 'search_default_unpaid': 1}
return action
@api.onchange('company_id')
def _onchange_company_id(self):
company = self.env['res.company']
if self.company_id:
company = self.company_id
else:
@@ -456,10 +458,9 @@ class ResPartner(models.Model):
can_edit_vat = super(ResPartner, self).can_edit_vat()
if not can_edit_vat:
return can_edit_vat
Invoice = self.env['account.invoice']
has_invoice = Invoice.search([
has_invoice = self.env['account.move'].search([
('type', 'in', ['out_invoice', 'out_refund']),
('partner_id', 'child_of', self.commercial_partner_id.id),
('state', 'not in', ['draft', 'cancel'])
('state', '=', 'posted')
], limit=1)
return can_edit_vat and not (bool(has_invoice))
-28
View File
@@ -55,31 +55,3 @@ class ProductTemplate(models.Model):
if not fiscal_pos:
fiscal_pos = self.env['account.fiscal.position']
return fiscal_pos.map_accounts(accounts)
class ProductProduct(models.Model):
_inherit = "product.product"
@api.model
def _convert_prepared_anglosaxon_line(self, line, partner):
return {
'date_maturity': line.get('date_maturity', False),
'partner_id': partner,
'name': line['name'],
'debit': line['price'] > 0 and line['price'],
'credit': line['price'] < 0 and -line['price'],
'account_id': line['account_id'],
'analytic_line_ids': line.get('analytic_line_ids', []),
'amount_currency': line['price'] > 0 and abs(line.get('amount_currency', False)) or -abs(line.get('amount_currency', False)),
'currency_id': line.get('currency_id', False),
'quantity': line.get('quantity', 1.00),
'product_id': line.get('product_id', False),
'product_uom_id': line.get('uom_id', False),
'analytic_account_id': line.get('account_analytic_id', False),
'invoice_id': line.get('invoice_id', False),
'tax_ids': line.get('tax_ids', False),
'tax_line_id': line.get('tax_line_id', False),
'analytic_tag_ids': line.get('analytic_tag_ids', False),
'tax_repartition_line_id': line.get('tax_repartition_line_id'),
'tag_ids': line.get('tag_ids'),
'tax_base_amount': line.get('tax_base_amount'),
}
@@ -200,7 +200,7 @@ class AccountReconciliation(models.AbstractModel):
"""
if not bank_statement_line_ids:
return {}
edition_mode = self._context.get('edition_mode')
suspense_moves_mode = self._context.get('suspense_moves_mode')
bank_statements = self.env['account.bank.statement.line'].browse(bank_statement_line_ids).mapped('statement_id')
search_sql = '''
@@ -220,7 +220,7 @@ class AccountReconciliation(models.AbstractModel):
{srch}
GROUP BY line.id
'''.format(
cond=not edition_mode and "AND NOT EXISTS (SELECT 1 from account_move_line aml WHERE aml.statement_line_id = line.id)" or "",
cond=not suspense_moves_mode and "AND NOT EXISTS (SELECT 1 from account_move_line aml WHERE aml.statement_line_id = line.id)" or "",
srch=search_str and search_sql or "",
)
self.env.cr.execute(query, {'ids':tuple(bank_statement_line_ids), 'search_str':search_str})
@@ -503,7 +503,7 @@ class AccountReconciliation(models.AbstractModel):
AccountMoveLine = self.env['account.move.line']
#Always exclude the journal items that have been marked as 'to be checked' in a former bank statement reconciliation
to_check_excluded = AccountMoveLine.search(AccountMoveLine._get_domain_for_edition_mode()).ids
to_check_excluded = AccountMoveLine.search(AccountMoveLine._get_suspense_moves_domain()).ids
excluded_ids.extend(to_check_excluded)
domain_reconciliation = [
+129 -136
View File
@@ -8,46 +8,19 @@ class AccountInvoiceReport(models.Model):
_name = "account.invoice.report"
_description = "Invoices Statistics"
_auto = False
_rec_name = 'date'
_rec_name = 'invoice_date'
_order = 'invoice_date desc'
@api.multi
@api.depends('currency_id', 'date', 'price_total', 'price_average', 'residual')
def _compute_amounts_in_user_currency(self):
"""Compute the amounts in the currency of the user
"""
user_currency_id = self.env.company.currency_id
currency_rate_id = self.env['res.currency.rate'].search([
('rate', '=', 1),
'|', ('company_id', '=', self.env.company.id), ('company_id', '=', False)], limit=1)
base_currency_id = currency_rate_id.currency_id
for record in self:
date = record.date or fields.Date.today()
company = record.company_id
record.user_currency_price_total = base_currency_id._convert(record.price_total, user_currency_id, company, date)
record.user_currency_price_average = base_currency_id._convert(record.price_average, user_currency_id, company, date)
record.user_currency_residual = base_currency_id._convert(record.residual, user_currency_id, company, date)
number = fields.Char('Invoice #', readonly=True)
date = fields.Date(readonly=True, string="Invoice Date")
product_id = fields.Many2one('product.product', string='Product', readonly=True)
product_qty = fields.Float(string='Product Quantity', readonly=True)
uom_name = fields.Char(string='Reference Unit of Measure', readonly=True)
payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms', oldname='payment_term', readonly=True)
fiscal_position_id = fields.Many2one('account.fiscal.position', oldname='fiscal_position', string='Fiscal Position', readonly=True)
currency_id = fields.Many2one('res.currency', string='Currency', readonly=True)
categ_id = fields.Many2one('product.category', string='Product Category', readonly=True)
# ==== Invoice fields ====
move_id = fields.Many2one('account.move', readonly=True)
name = fields.Char('Invoice #', readonly=True)
journal_id = fields.Many2one('account.journal', string='Journal', readonly=True)
company_id = fields.Many2one('res.company', string='Company', readonly=True)
currency_id = fields.Many2one('res.currency', string='Currency', readonly=True)
partner_id = fields.Many2one('res.partner', string='Partner', readonly=True)
commercial_partner_id = fields.Many2one('res.partner', string='Partner Company', help="Commercial Entity")
company_id = fields.Many2one('res.company', string='Company', readonly=True)
user_id = fields.Many2one('res.users', string='Salesperson', readonly=True)
price_total = fields.Float(string='Untaxed Total', readonly=True)
user_currency_price_total = fields.Float(string="Total Without Tax in Currency", compute='_compute_amounts_in_user_currency', digits=0)
price_average = fields.Float(string='Average Price', readonly=True, group_operator="avg")
user_currency_price_average = fields.Float(string="Average Price in Currency", compute='_compute_amounts_in_user_currency', digits=0)
currency_rate = fields.Float(string='Currency Rate', readonly=True, group_operator="avg", groups="base.group_multi_currency")
nbr = fields.Integer(string='Line Count', readonly=True) # TDE FIXME master: rename into nbr_lines
invoice_id = fields.Many2one('account.invoice', readonly=True)
country_id = fields.Many2one('res.country', string="Partner Company's Country")
invoice_user_id = fields.Many2one('res.users', string='Salesperson', readonly=True)
type = fields.Selection([
('out_invoice', 'Customer Invoice'),
('in_invoice', 'Vendor Bill'),
@@ -56,32 +29,42 @@ class AccountInvoiceReport(models.Model):
], readonly=True)
state = fields.Selection([
('draft', 'Draft'),
('open', 'Open'),
('paid', 'Paid'),
('posted', 'Open'),
('cancel', 'Cancelled')
], string='Invoice Status', readonly=True)
date_due = fields.Date(string='Due Date', readonly=True)
account_id = fields.Many2one('account.account', string='Receivable/Payable Account', readonly=True, domain=[('deprecated', '=', False)])
account_line_id = fields.Many2one('account.account', string='Revenue/Expense Account', readonly=True, domain=[('deprecated', '=', False)])
partner_bank_id = fields.Many2one('res.partner.bank', string='Bank Account', readonly=True)
invoice_payment_state = fields.Selection(selection=[
('not_paid', 'Not Paid'),
('in_payment', 'In Payment'),
('paid', 'paid')
], string='Payment Status', readonly=True)
fiscal_position_id = fields.Many2one('account.fiscal.position', oldname='fiscal_position', string='Fiscal Position', readonly=True)
invoice_date = fields.Date(readonly=True, string="Invoice Date")
invoice_payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms', oldname='payment_term', readonly=True)
invoice_partner_bank_id = fields.Many2one('res.partner.bank', string='Bank Account', readonly=True)
nbr_lines = fields.Integer(string='Line Count', readonly=True)
residual = fields.Float(string='Due Amount', readonly=True)
user_currency_residual = fields.Float(string="Total Residual", compute='_compute_amounts_in_user_currency', digits=0)
country_id = fields.Many2one('res.country', string="Partner Company's Country")
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account', groups="analytic.group_analytic_accounting")
amount_total = fields.Float(string='Total', readonly=True)
_order = 'date desc'
# ==== Invoice line fields ====
quantity = fields.Float(string='Product Quantity', readonly=True)
product_id = fields.Many2one('product.product', string='Product', readonly=True)
product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure', readonly=True)
product_categ_id = fields.Many2one('product.category', string='Product Category', readonly=True)
invoice_date_due = fields.Date(string='Due Date', readonly=True)
account_id = fields.Many2one('account.account', string='Revenue/Expense Account', readonly=True, domain=[('deprecated', '=', False)])
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', groups="analytic.group_analytic_accounting")
price_subtotal = fields.Float(string='Untaxed Total', readonly=True)
price_average = fields.Float(string='Average Price', readonly=True, group_operator="avg")
_depends = {
'account.invoice': [
'account_id', 'amount_total_company_signed', 'commercial_partner_id', 'company_id',
'currency_id', 'date_due', 'date_invoice', 'fiscal_position_id',
'journal_id', 'number', 'partner_bank_id', 'partner_id', 'payment_term_id',
'residual', 'state', 'type', 'user_id',
'account.move': [
'name', 'state', 'type', 'partner_id', 'invoice_user_id', 'fiscal_position_id',
'invoice_date', 'invoice_date_due', 'invoice_payment_term_id', 'invoice_partner_bank_id',
],
'account.invoice.line': [
'account_id', 'invoice_id', 'price_subtotal', 'product_id',
'quantity', 'uom_id', 'account_analytic_id',
'account.move.line': [
'quantity', 'price_subtotal', 'amount_residual', 'balance', 'amount_currency',
'move_id', 'product_id', 'product_uom_id', 'account_id', 'analytic_account_id',
'journal_id', 'company_id', 'currency_id', 'partner_id',
],
'product.product': ['product_tmpl_id'],
'product.template': ['categ_id'],
@@ -90,97 +73,107 @@ class AccountInvoiceReport(models.Model):
'res.partner': ['country_id'],
}
@api.model
def _select(self):
select_str = """
SELECT sub.id, sub.number, sub.date, sub.product_id, sub.partner_id, sub.country_id, sub.account_analytic_id,
sub.payment_term_id, sub.uom_name, sub.currency_id, sub.journal_id,
sub.fiscal_position_id, sub.user_id, sub.company_id, sub.nbr, sub.invoice_id, sub.type, sub.state,
sub.categ_id, sub.date_due, sub.account_id, sub.account_line_id, sub.partner_bank_id,
sub.product_qty, sub.price_total as price_total, sub.price_average as price_average, sub.amount_total / COALESCE(cr.rate, 1) as amount_total,
COALESCE(cr.rate, 1) as currency_rate, sub.residual as residual, sub.commercial_partner_id as commercial_partner_id
"""
return select_str
def _sub_select(self):
select_str = """
SELECT ail.id AS id,
ai.date_invoice AS date,
ai.number as number,
ail.product_id, ai.partner_id, ai.payment_term_id, ail.account_analytic_id,
u2.name AS uom_name,
ai.currency_id, ai.journal_id, ai.fiscal_position_id, ai.user_id, ai.company_id,
1 AS nbr,
ai.id AS invoice_id, ai.type, ai.state, pt.categ_id, ai.date_due, ai.account_id, ail.account_id AS account_line_id,
ai.partner_bank_id,
SUM ((invoice_type.sign_qty * ail.quantity) / COALESCE(u.factor,1) * COALESCE(u2.factor,1)) AS product_qty,
SUM(ail.price_subtotal_signed * invoice_type.sign) AS price_total,
SUM(ail.price_total * invoice_type.sign_qty) AS amount_total,
SUM(ABS(ail.price_subtotal_signed)) / CASE
WHEN SUM(ail.quantity / COALESCE(u.factor,1) * COALESCE(u2.factor,1)) <> 0::numeric
THEN SUM(ail.quantity / COALESCE(u.factor,1) * COALESCE(u2.factor,1))
ELSE 1::numeric
END AS price_average,
ai.residual_company_signed / (SELECT count(*) FROM account_invoice_line l where invoice_id = ai.id) *
count(*) * invoice_type.sign AS residual,
ai.commercial_partner_id as commercial_partner_id,
coalesce(partner.country_id, partner_ai.country_id) AS country_id
"""
return select_str
return '''
SELECT
line.id,
line.move_id,
line.product_id,
line.account_id,
line.analytic_account_id,
line.journal_id,
line.company_id,
line.currency_id,
line.partner_id AS commercial_partner_id,
move.name,
move.state,
move.type,
move.partner_id,
move.invoice_user_id,
move.fiscal_position_id,
move.invoice_payment_state,
move.invoice_date,
move.invoice_date_due,
move.invoice_payment_term_id,
move.invoice_partner_bank_id,
move.amount_residual_signed AS residual,
move.amount_total_signed AS amount_total,
uom_template.id AS product_uom_id,
template.categ_id AS product_categ_id,
SUM(line.quantity / NULLIF(COALESCE(uom_line.factor, 1) * COALESCE(uom_template.factor, 1), 0.0))
AS quantity,
-SUM(line.balance) AS price_subtotal,
-SUM(line.balance / NULLIF(COALESCE(uom_line.factor, 1) * COALESCE(uom_template.factor, 1), 0.0))
AS price_average,
COALESCE(partner.country_id, commercial_partner.country_id) AS country_id,
1 AS nbr_lines
'''
@api.model
def _from(self):
from_str = """
FROM account_invoice_line ail
JOIN account_invoice ai ON ai.id = ail.invoice_id
JOIN res_partner partner ON ai.commercial_partner_id = partner.id
JOIN res_partner partner_ai ON ai.partner_id = partner_ai.id
LEFT JOIN product_product pr ON pr.id = ail.product_id
left JOIN product_template pt ON pt.id = pr.product_tmpl_id
LEFT JOIN uom_uom u ON u.id = ail.uom_id
LEFT JOIN uom_uom u2 ON u2.id = pt.uom_id
JOIN (
-- Temporary table to decide if the qty should be added or retrieved (Invoice vs Credit Note)
SELECT id,(CASE
WHEN ai.type::text = ANY (ARRAY['in_refund'::character varying::text, 'in_invoice'::character varying::text])
THEN -1
ELSE 1
END) AS sign,(CASE
WHEN ai.type::text = ANY (ARRAY['out_refund'::character varying::text, 'in_invoice'::character varying::text])
THEN -1
ELSE 1
END) AS sign_qty
FROM account_invoice ai
) AS invoice_type ON invoice_type.id = ai.id
"""
return from_str
return '''
FROM account_move_line line
LEFT JOIN res_partner partner ON partner.id = line.partner_id
LEFT JOIN product_product product ON product.id = line.product_id
LEFT JOIN account_account account ON account.id = line.account_id
LEFT JOIN account_account_type user_type ON user_type.id = account.user_type_id
LEFT JOIN product_template template ON template.id = product.product_tmpl_id
LEFT JOIN uom_uom uom_line ON uom_line.id = line.product_uom_id
LEFT JOIN uom_uom uom_template ON uom_template.id = template.uom_id
INNER JOIN account_move move ON move.id = line.move_id
LEFT JOIN res_partner commercial_partner ON commercial_partner.id = move.commercial_partner_id
'''
@api.model
def _where(self):
return '''
WHERE move.type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')
AND line.account_id IS NOT NULL
AND NOT line.exclude_from_invoice_tab
'''
@api.model
def _group_by(self):
group_by_str = """
GROUP BY ail.id, ail.product_id, ail.account_analytic_id, ai.date_invoice, ai.id,
ai.partner_id, ai.payment_term_id, u2.name, u2.id, ai.currency_id, ai.journal_id,
ai.fiscal_position_id, ai.user_id, ai.company_id, ai.id, ai.type, invoice_type.sign, ai.state, pt.categ_id,
ai.date_due, ai.account_id, ail.account_id, ai.partner_bank_id, ai.residual_company_signed,
ai.amount_total_company_signed, ai.commercial_partner_id, coalesce(partner.country_id, partner_ai.country_id)
"""
return group_by_str
return '''
GROUP BY
line.id,
line.move_id,
line.product_id,
line.account_id,
line.analytic_account_id,
line.journal_id,
line.company_id,
line.currency_id,
line.partner_id,
move.name,
move.state,
move.type,
move.amount_residual_signed,
move.amount_total_signed,
move.partner_id,
move.invoice_user_id,
move.fiscal_position_id,
move.invoice_payment_state,
move.invoice_date,
move.invoice_date_due,
move.invoice_payment_term_id,
move.invoice_partner_bank_id,
uom_template.id,
template.categ_id,
COALESCE(partner.country_id, commercial_partner.country_id)
'''
@api.model_cr
def init(self):
# self._table = account_invoice_report
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
WITH currency_rate AS (%s)
%s
FROM (
%s %s WHERE ail.account_id IS NOT NULL %s
) AS sub
LEFT JOIN currency_rate cr ON
(cr.currency_id = sub.currency_id AND
cr.company_id = sub.company_id AND
cr.date_start <= COALESCE(sub.date, NOW()) AND
(cr.date_end IS NULL OR cr.date_end > COALESCE(sub.date, NOW())))
)""" % (
self._table, self.env['res.currency']._select_companies_rates(),
self._select(), self._sub_select(), self._from(), self._group_by()))
self.env.cr.execute('''
CREATE OR REPLACE VIEW %s AS (
%s %s %s %s
)
''' % (
self._table, self._select(), self._from(), self._where(), self._group_by()
))
class ReportInvoiceWithPayment(models.AbstractModel):
@@ -6,9 +6,9 @@
<field name="model">account.invoice.report</field>
<field name="arch" type="xml">
<pivot string="Invoices Analysis" disable_linking="True">
<field name="categ_id" type="row"/>
<field name="date" type="col"/>
<field name="price_total" type="measure"/>
<field name="product_categ_id" type="row"/>
<field name="invoice_date" type="col"/>
<field name="price_subtotal" type="measure"/>
</pivot>
</field>
</record>
@@ -18,8 +18,8 @@
<field name="model">account.invoice.report</field>
<field name="arch" type="xml">
<graph string="Invoices Analysis">
<field name="categ_id"/>
<field name="price_total" type="measure"/>
<field name="product_categ_id"/>
<field name="price_subtotal" type="measure"/>
</graph>
</field>
</record>
@@ -30,35 +30,35 @@
<field name="model_id">account.invoice.report</field>
<field name="domain">[]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date:month', 'user_id']}</field>
<field name="context">{'group_by': ['invoice_date:month', 'invoice_user_id']}</field>
</record>
<record id="filter_invoice_product" model="ir.filters">
<field name="name">By Product</field>
<field name="model_id">account.invoice.report</field>
<field name="domain">[]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date:month', 'product_id'], 'set_visible':True, 'residual_invisible':True}</field>
<field name="context">{'group_by': ['invoice_date:month', 'product_id'], 'set_visible':True, 'residual_invisible':True}</field>
</record>
<record id="filter_invoice_product_category" model="ir.filters">
<field name="name">By Product Category</field>
<field name="model_id">account.invoice.report</field>
<field name="domain">[]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date:month', 'categ_id'], 'residual_invisible':True}</field>
<field name="context">{'group_by': ['invoice_date:month', 'product_categ_id'], 'residual_invisible':True}</field>
</record>
<record id="filter_invoice_refund" model="ir.filters">
<field name="name">By Credit Note</field>
<field name="model_id">account.invoice.report</field>
<field name="domain">[('type', '=', 'out_refund')]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date:month', 'user_id']}</field>
<field name="context">{'group_by': ['invoice_date:month', 'invoice_user_id']}</field>
</record>
<record id="filter_invoice_country" model="ir.filters">
<field name="name">By Country</field>
<field name="model_id">account.invoice.report</field>
<field name="domain">[]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date:month', 'country_id']}</field>
<field name="context">{'group_by': ['invoice_date:month', 'country_id']}</field>
</record>
<record id="view_account_invoice_report_search" model="ir.ui.view">
@@ -66,9 +66,9 @@
<field name="model">account.invoice.report</field>
<field name="arch" type="xml">
<search string="Invoices Analysis">
<filter string="My Invoices" name="my_invoice" domain="[('user_id', '=', uid)]"/>
<filter string="My Invoices" name="my_invoice" domain="[('invoice_user_id', '=', uid)]"/>
<separator/>
<field name="date"/>
<field name="invoice_date"/>
<separator/>
<filter string="To Invoice" name="toinvoice" domain="[('state','=','draft')]" help = "Draft Invoices"/>
<filter string="Invoiced" name="current" domain="[('state','not in', ('draft','cancel'))]"/>
@@ -79,19 +79,19 @@
<filter string="Invoices" name="invoice" domain="['|', ('type','=','out_invoice'),('type','=','in_invoice')]"/>
<filter string="Credit Notes" name="creditnote" domain="['|', ('type','=','out_refund'),('type','=','in_refund')]"/>
<field name="partner_id" operator="child_of"/>
<field name="user_id" />
<field name="invoice_user_id" />
<field name="product_id" />
<field name="categ_id" filter_domain="[('categ_id', 'child_of', self)]"/>
<field name="product_categ_id" filter_domain="[('product_categ_id', 'child_of', self)]"/>
<group expand="1" string="Group By">
<filter string="Salesperson" name='user' context="{'group_by':'user_id'}"/>
<filter string="Salesperson" name='user' context="{'group_by':'invoice_user_id'}"/>
<filter string="Partner" name="partner_id" context="{'group_by':'partner_id','residual_visible':True}"/>
<filter string="Product Category" name="category_product" context="{'group_by':'categ_id','residual_invisible':True}"/>
<filter string="Product Category" name="category_product" context="{'group_by':'product_categ_id','residual_invisible':True}"/>
<filter string="Status" name="status" context="{'group_by':'state'}"/>
<filter string="Analytic Account" name="account_analytic_id" context="{'group_by':'account_analytic_id'}" groups="analytic.group_analytic_accounting" />
<filter string="Analytic Account" name="analytic_account_id" context="{'group_by':'analytic_account_id'}" groups="analytic.group_analytic_accounting" />
<filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical" />
<filter string="Date" name="date" context="{'group_by':'date'}"/>
<filter string="Due Date" name="duemonth" context="{'group_by':'date_due:month'}"/>
<filter string="Date" name="invoice_date" context="{'group_by':'invoice_date'}"/>
<filter string="Due Date" name="duemonth" context="{'group_by':'invoice_date_due:month'}"/>
</group>
</search>
</field>
+5 -19
View File
@@ -131,13 +131,6 @@
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<record id="invoice_comp_rule" model="ir.rule">
<field name="name">Invoice multi-company</field>
<field name="model_id" ref="model_account_invoice"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<record id="invoice_analysis_comp_rule" model="ir.rule">
<field name="name">Invoice Analysis multi-company</field>
<field name="model_id" ref="model_account_invoice_report"/>
@@ -152,13 +145,6 @@
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<record model="ir.rule" id="account_invoice_line_comp_rule">
<field name="name">Invoice Line company rule</field>
<field name="model_id" ref="model_account_invoice_line"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<record model="ir.rule" id="account_bank_statement_comp_rule">
<field name="name">Account bank statement company rule</field>
<field name="model_id" ref="model_account_bank_statement"/>
@@ -193,18 +179,18 @@
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<!-- Portal for invoice and invoice lines -->
<!-- Portal for invoice move and invoice move lines -->
<record id="account_invoice_rule_portal" model="ir.rule">
<field name="name">Portal Personal Account Invoices</field>
<field name="model_id" ref="account.model_account_invoice"/>
<field name="domain_force">[('message_partner_ids','child_of',[user.commercial_partner_id.id])]</field>
<field name="model_id" ref="account.model_account_move"/>
<field name="domain_force">[('type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund')), ('message_partner_ids','child_of',[user.commercial_partner_id.id])]</field>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
</record>
<record id="account_invoice_line_rule_portal" model="ir.rule">
<field name="name">Portal Invoice Lines</field>
<field name="model_id" ref="account.model_account_invoice_line"/>
<field name="domain_force">[('invoice_id.message_partner_ids','child_of',[user.commercial_partner_id.id])]</field>
<field name="model_id" ref="account.model_account_move_line"/>
<field name="domain_force">[('move_id.type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund')), ('move_id.message_partner_ids','child_of',[user.commercial_partner_id.id])]</field>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
</record>
</data>
+2 -9
View File
@@ -23,11 +23,10 @@ access_account_bank_statement,account.bank.statement,model_account_bank_statemen
access_account_bank_statement_line,account.bank.statement.line,model_account_bank_statement_line,account.group_account_user,1,1,1,1
access_account_analytic_line_manager,account.analytic.line manager,model_account_analytic_line,account.group_account_manager,1,0,0,0
access_account_analytic_account,account.analytic.account,analytic.model_account_analytic_account,base.group_user,1,0,0,0
access_account_invoice_uinvoice,account.invoice,model_account_invoice,account.group_account_invoice,1,1,1,1
access_account_invoice_line_uinvoice,account.invoice.line,model_account_invoice_line,account.group_account_invoice,1,1,1,1
access_account_invoice_tax_uinvoice,account.invoice.tax,model_account_invoice_tax,account.group_account_invoice,1,1,1,1
access_account_move_uinvoice,account.move,model_account_move,account.group_account_invoice,1,1,1,1
access_account_move_line_uinvoice,account.move.line invoice,model_account_move_line,account.group_account_invoice,1,1,1,1
access_account_invoice_portal,account.move.portal,account.model_account_move,base.group_portal,1,0,0,0
access_account_invoice_line_portal,account.move.line.portal,account.model_account_move_line,base.group_portal,1,0,0,0
access_account_payment_term_manager,account.payment.term,model_account_payment_term,account.group_account_manager,1,1,1,1
access_account_payment_term_line_manager,account.payment.term.line,model_account_payment_term_line,account.group_account_manager,1,1,1,1
access_account_cash_rounding_uinvoice,account.cash.rounding,model_account_cash_rounding,account.group_account_invoice,1,1,1,1
@@ -35,11 +34,8 @@ access_account_tax_manager,account.tax,model_account_tax,account.group_account_m
access_account_journal_manager,account.journal,model_account_journal,account.group_account_manager,1,1,1,1
access_account_journal_user,account.journal,model_account_journal,account.group_account_user,1,0,0,0
access_account_journal_invoice,account.journal invoice,model_account_journal,account.group_account_invoice,1,0,0,0
access_account_invoice_group_invoice,account.invoice group invoice,model_account_invoice,account.group_account_invoice,1,1,1,1
access_res_currency_account_manager,res.currency account manager,base.model_res_currency,group_account_manager,1,1,1,1
access_res_currency_rate_account_manager,res.currency.rate account manager,base.model_res_currency_rate,group_account_manager,1,1,1,1
access_account_invoice_portal,account.invoice.portal,account.model_account_invoice,base.group_portal,1,0,0,0
access_account_invoice_line_portal,account.invoice.line.portal,account.model_account_invoice_line,base.group_portal,1,0,0,0
access_account_payment_term_partner_manager,account.payment.term partner manager,model_account_payment_term,base.group_user,1,0,0,0
access_account_payment_term_line_partner_manager,account.payment.term.line partner manager,model_account_payment_term_line,base.group_user,1,0,0,0
access_account_fiscal_position_product_manager,account.fiscal.position account.manager,model_account_fiscal_position,account.group_account_manager,1,1,1,1
@@ -55,12 +51,9 @@ access_account_invoice_report_user,account.invoice.report_user,model_account_inv
access_account_invoice_report,account.invoice.report,model_account_invoice_report,account.group_account_manager,1,1,1,1
access_account_invoice_report_billing,account.invoice.report_billing,model_account_invoice_report,account.group_account_invoice,1,0,0,0
access_res_partner_group_account_manager,res_partner group_account_manager,model_res_partner,account.group_account_manager,1,0,0,0
access_account_invoice_accountant,account.invoice accountant,model_account_invoice,account.group_account_user,1,0,0,0
access_account_move_line_manager,account.move.line manager,model_account_move_line,account.group_account_manager,1,0,0,0
access_account_move_manager,account.move manager,model_account_move,account.group_account_manager,1,0,0,0
access_account_invoice_tax_accountant,account.invoice.tax accountant,model_account_invoice_tax,account.group_account_user,1,0,0,0
access_account_analytic_line_invoice,account.analytic.line invoice,model_account_analytic_line,account.group_account_invoice,1,1,1,1
access_account_invoice_line_accountant,account.invoice.line accountant,model_account_invoice_line,account.group_account_user,1,0,0,0
access_account_account_invoice,account.account invoice,model_account_account,account.group_account_invoice,1,0,0,0
access_account_analytic_accountant,account.analytic.account accountant,analytic.model_account_analytic_account,account.group_account_user,1,1,1,1
access_account_account_type_invoice,account.account.type invoice,model_account_account_type,account.group_account_invoice,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
23 access_account_bank_statement_line account.bank.statement.line model_account_bank_statement_line account.group_account_user 1 1 1 1
24 access_account_analytic_line_manager account.analytic.line manager model_account_analytic_line account.group_account_manager 1 0 0 0
25 access_account_analytic_account account.analytic.account analytic.model_account_analytic_account base.group_user 1 0 0 0
access_account_invoice_uinvoice account.invoice model_account_invoice account.group_account_invoice 1 1 1 1
access_account_invoice_line_uinvoice account.invoice.line model_account_invoice_line account.group_account_invoice 1 1 1 1
access_account_invoice_tax_uinvoice account.invoice.tax model_account_invoice_tax account.group_account_invoice 1 1 1 1
26 access_account_move_uinvoice account.move model_account_move account.group_account_invoice 1 1 1 1
27 access_account_move_line_uinvoice account.move.line invoice model_account_move_line account.group_account_invoice 1 1 1 1
28 access_account_invoice_portal account.move.portal account.model_account_move base.group_portal 1 0 0 0
29 access_account_invoice_line_portal account.move.line.portal account.model_account_move_line base.group_portal 1 0 0 0
30 access_account_payment_term_manager account.payment.term model_account_payment_term account.group_account_manager 1 1 1 1
31 access_account_payment_term_line_manager account.payment.term.line model_account_payment_term_line account.group_account_manager 1 1 1 1
32 access_account_cash_rounding_uinvoice account.cash.rounding model_account_cash_rounding account.group_account_invoice 1 1 1 1
34 access_account_journal_manager account.journal model_account_journal account.group_account_manager 1 1 1 1
35 access_account_journal_user account.journal model_account_journal account.group_account_user 1 0 0 0
36 access_account_journal_invoice account.journal invoice model_account_journal account.group_account_invoice 1 0 0 0
access_account_invoice_group_invoice account.invoice group invoice model_account_invoice account.group_account_invoice 1 1 1 1
37 access_res_currency_account_manager res.currency account manager base.model_res_currency group_account_manager 1 1 1 1
38 access_res_currency_rate_account_manager res.currency.rate account manager base.model_res_currency_rate group_account_manager 1 1 1 1
access_account_invoice_portal account.invoice.portal account.model_account_invoice base.group_portal 1 0 0 0
access_account_invoice_line_portal account.invoice.line.portal account.model_account_invoice_line base.group_portal 1 0 0 0
39 access_account_payment_term_partner_manager account.payment.term partner manager model_account_payment_term base.group_user 1 0 0 0
40 access_account_payment_term_line_partner_manager account.payment.term.line partner manager model_account_payment_term_line base.group_user 1 0 0 0
41 access_account_fiscal_position_product_manager account.fiscal.position account.manager model_account_fiscal_position account.group_account_manager 1 1 1 1
51 access_account_invoice_report account.invoice.report model_account_invoice_report account.group_account_manager 1 1 1 1
52 access_account_invoice_report_billing account.invoice.report_billing model_account_invoice_report account.group_account_invoice 1 0 0 0
53 access_res_partner_group_account_manager res_partner group_account_manager model_res_partner account.group_account_manager 1 0 0 0
access_account_invoice_accountant account.invoice accountant model_account_invoice account.group_account_user 1 0 0 0
54 access_account_move_line_manager account.move.line manager model_account_move_line account.group_account_manager 1 0 0 0
55 access_account_move_manager account.move manager model_account_move account.group_account_manager 1 0 0 0
access_account_invoice_tax_accountant account.invoice.tax accountant model_account_invoice_tax account.group_account_user 1 0 0 0
56 access_account_analytic_line_invoice account.analytic.line invoice model_account_analytic_line account.group_account_invoice 1 1 1 1
access_account_invoice_line_accountant account.invoice.line accountant model_account_invoice_line account.group_account_user 1 0 0 0
57 access_account_account_invoice account.account invoice model_account_account account.group_account_invoice 1 0 0 0
58 access_account_analytic_accountant account.analytic.account accountant analytic.model_account_analytic_account account.group_account_user 1 1 1 1
59 access_account_account_type_invoice account.account.type invoice model_account_account_type account.group_account_invoice 1 0 0 0
@@ -69,7 +69,6 @@ var ShowPaymentLineWidget = AbstractField.extend({
move_id: content.move_id,
ref: content.ref,
account_payment_id: content.account_payment_id,
invoice_id: content.invoice_id,
}));
$content.filter('.js_unreconcile_payment').on('click', self._onRemoveMoveReconcile.bind(self));
$content.filter('.js_open_payment').on('click', self._onOpenPayment.bind(self));
@@ -96,15 +95,11 @@ var ShowPaymentLineWidget = AbstractField.extend({
* @param {MouseEvent} event
*/
_onOpenPayment: function (event) {
var invoiceId = parseInt($(event.target).attr('invoice-id'));
var paymentId = parseInt($(event.target).attr('payment-id'));
var moveId = parseInt($(event.target).attr('move-id'));
var res_model;
var id;
if (invoiceId !== undefined && !isNaN(invoiceId)){
res_model = "account.invoice";
id = invoiceId;
} else if (paymentId !== undefined && !isNaN(paymentId)){
if (paymentId !== undefined && !isNaN(paymentId)){
res_model = "account.payment";
id = paymentId;
} else if (moveId !== undefined && !isNaN(moveId)){
@@ -133,9 +128,9 @@ var ShowPaymentLineWidget = AbstractField.extend({
var self = this;
var id = $(event.target).data('id') || false;
this._rpc({
model: 'account.invoice',
method: 'assign_outstanding_credit',
args: [JSON.parse(this.value).invoice_id, id],
model: 'account.move',
method: 'js_assign_outstanding_line',
args: [JSON.parse(this.value).move_id, id],
}).then(function () {
self.trigger_up('reload');
});
@@ -153,7 +148,7 @@ var ShowPaymentLineWidget = AbstractField.extend({
model: 'account.move.line',
method: 'remove_move_reconcile',
args: [paymentId],
context: {'invoice_id': this.res_id},
context: {'move_id': this.res_id},
}).then(function () {
self.trigger_up('reload');
});
@@ -79,7 +79,7 @@
</table>
</div>
<button class="btn btn-sm btn-primary js_unreconcile_payment float-left" t-att-payment-id="payment_id" style="margin-top:5px; margin-bottom:5px;">Unreconcile</button>
<button class="btn btn-sm btn-secondary js_open_payment float-right" t-att-payment-id="account_payment_id" t-att-invoice-id="invoice_id" t-att-move-id="move_id" style="margin-top:5px; margin-bottom:5px;">View</button>
<button class="btn btn-sm btn-secondary js_open_payment float-right" t-att-payment-id="account_payment_id" t-att-move-id="move_id" style="margin-top:5px; margin-bottom:5px;">View</button>
</t>
</templates>
@@ -9,7 +9,7 @@ var createView = testUtils.createView;
QUnit.module('account', {
beforeEach: function () {
this.data = {
'account.invoice': {
'account.move': {
fields: {
payments_widget: {string: "payments_widget data", type: "char"},
outstanding_credits_debits_widget: {string: "outstanding_credits_debits_widget data", type: "char"},
@@ -17,7 +17,7 @@ QUnit.module('account', {
records: [{
id: 1,
payments_widget: '{"content": [{"digits": [69, 2], "currency": "$", "amount": 555.0, "name": "Customer Payment: INV/2017/0004", "date": "2017-04-25", "position": "before", "ref": "BNK1/2017/0003 (INV/2017/0004)", "payment_id": 22, "move_id": 10, "journal_name": "Bank"}], "outstanding": false, "title": "Less Payment"}',
outstanding_credits_debits_widget: '{"content": [{"digits": [69, 2], "currency": "$", "amount": 100.0, "journal_name": "INV/2017/0004", "position": "before", "id": 20}], "invoice_id": 4, "outstanding": true, "title": "Outstanding credits"}',
outstanding_credits_debits_widget: '{"content": [{"digits": [69, 2], "currency": "$", "amount": 100.0, "journal_name": "INV/2017/0004", "position": "before", "id": 20}], "move_id": 4, "outstanding": true, "title": "Outstanding credits"}',
}]
},
};
@@ -30,7 +30,7 @@ QUnit.module('account', {
var form = await createView({
View: FormView,
model: 'account.invoice',
model: 'account.move',
data: this.data,
arch: '<form>'+
'<field name="outstanding_credits_debits_widget" widget="payment"/>'+
@@ -40,11 +40,11 @@ QUnit.module('account', {
mockRPC: function (route, args) {
if (args.method === 'remove_move_reconcile') {
assert.deepEqual(args.args, [22], "should call remove_move_reconcile {warning: required focus}");
assert.deepEqual(args.kwargs, {context: {"invoice_id": 1}}, "should call remove_move_reconcile {warning: required focus}");
assert.deepEqual(args.kwargs, {context: {"move_id": 1}}, "should call remove_move_reconcile {warning: required focus}");
return Promise.resolve();
}
if (args.method === 'assign_outstanding_credit') {
assert.deepEqual(args.args, [4, 20], "should call assign_outstanding_credit {warning: required focus}");
if (args.method === 'js_assign_outstanding_line') {
assert.deepEqual(args.args, [4, 20], "should call js_assign_outstanding_line {warning: required focus}");
return Promise.resolve();
}
return this._super.apply(this, arguments);
+8 -11
View File
@@ -1,23 +1,20 @@
#Accounting tests written in python should extend the class AccountingTestCase.
#See its doc for more info.
# -*- coding: utf-8 -*-
from . import test_account_customer_invoice
from . import test_account_move_closed_period
from . import test_account_move_tax_lock_date
from . import test_account_supplier_invoice
from . import test_account_validate_account_move
from . import test_account_invoice_rounding
from . import test_account_move_out_invoice
from . import test_account_move_out_refund
from . import test_account_move_in_invoice
from . import test_account_move_in_refund
from . import test_account_move_entry
from . import test_account_invoice_report
from . import test_account_journal_dashboard
from . import test_bank_statement_reconciliation
from . import test_fiscal_position
from . import test_invoice_onchange
from . import test_reconciliation_widget
from . import test_payment
from . import test_product_id_change
from . import test_reconciliation
from . import test_search
from . import test_tax
from . import test_invoice_taxes
from . import test_account_move_taxes_edition
from . import test_templates_consistency
from . import test_account_fiscal_year
from . import test_account_all_l10n
@@ -0,0 +1,206 @@
# -*- coding: utf-8 -*-
from odoo import fields
from odoo.tests.common import Form, SavepointCase
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class AccountingSavepointCase(SavepointCase):
# -------------------------------------------------------------------------
# DATA GENERATION
# -------------------------------------------------------------------------
@classmethod
def setUpClass(cls):
super(AccountingSavepointCase, cls).setUpClass()
chart_template = cls.env.user.company_id.chart_template_id
if not chart_template:
chart_template = cls.env.ref('l10n_generic_coa.configurable_chart_template', raise_if_not_found=False)
if not chart_template:
cls.skipTest("Accounting Tests skipped because the user's company has no chart of accounts.")
# Create user.
user = cls.env['res.users'].create({
'name': 'Because I am accountman!',
'login': 'accountman',
'groups_id': [(6, 0, cls.env.user.groups_id.ids)],
})
user.partner_id.email = 'accountman@test.com'
# Shadow the current environment/cursor with one having the report user.
# This is mandatory to test access rights.
cls.env = cls.env(user=user)
cls.cr = cls.env.cr
cls.company_data = cls.setup_company_data('company_1_data')
cls.currency_data = cls.setup_multi_currency_data()
@classmethod
def setup_company_data(cls, company_name, **kwargs):
''' Create a new company having the name passed as parameter.
A chart of accounts will be installed to this company: the same as the current company one.
The current user will get access to this company.
:param company_name: The name of the company.
:return: A dictionary will be returned containing all relevant accounting data for testing.
'''
chart_template = cls.env.user.company_id.chart_template_id
company = cls.env['res.company'].create({
'name': company_name,
'currency_id': cls.env.user.company_id.currency_id.id,
**kwargs,
})
cls.env.user.company_ids |= company
cls.env.user.company_id = company
chart_template = cls.env['account.chart.template'].browse(chart_template.id)
chart_template.load_for_current_company(15.0, 15.0)
# The currency could be different after the installation of the chart template.
company.write({'currency_id': kwargs.get('currency_id', cls.env.user.company_id.currency_id.id)})
return {
'company': company,
'currency': company.currency_id,
'default_account_revenue': cls.env['account.account'].search([
('company_id', '=', company.id),
('user_type_id', '=', cls.env.ref('account.data_account_type_revenue').id)
], limit=1),
'default_account_expense': cls.env['account.account'].search([
('company_id', '=', company.id),
('user_type_id', '=', cls.env.ref('account.data_account_type_expenses').id)
], limit=1),
'default_account_receivable': cls.env['account.account'].search([
('company_id', '=', company.id),
('user_type_id.type', '=', 'receivable')
], limit=1),
'default_account_payable': cls.env['account.account'].search([
('company_id', '=', company.id),
('user_type_id.type', '=', 'payable')
], limit=1),
'default_account_tax_sale': company.account_sale_tax_id.mapped('invoice_repartition_line_ids.account_id'),
'default_account_tax_purchase': company.account_purchase_tax_id.mapped('invoice_repartition_line_ids.account_id'),
'default_journal_misc': cls.env['account.journal'].search([
('company_id', '=', company.id),
('type', '=', 'general')
], limit=1),
'default_journal_sale': cls.env['account.journal'].search([
('company_id', '=', company.id),
('type', '=', 'sale')
], limit=1),
'default_journal_purchase': cls.env['account.journal'].search([
('company_id', '=', company.id),
('type', '=', 'purchase')
], limit=1),
'default_tax_sale': company.account_sale_tax_id,
'default_tax_purchase': company.account_purchase_tax_id,
}
@classmethod
def setup_multi_currency_data(cls):
gold_currency = cls.env['res.currency'].create({
'name': 'Gold Coin',
'symbol': '☺',
'rounding': 0.001,
'position': 'after',
'currency_unit_label': 'Gold',
'currency_subunit_label': 'Silver',
})
rate1 = cls.env['res.currency.rate'].create({
'name': '2016-01-01',
'rate': 3.0,
'currency_id': gold_currency.id,
'company_id': cls.env.company.id,
})
rate2 = cls.env['res.currency.rate'].create({
'name': '2017-01-01',
'rate': 2.0,
'currency_id': gold_currency.id,
'company_id': cls.env.company.id,
})
return {
'currency': gold_currency,
'rates': rate1 + rate2,
}
@classmethod
def setup_armageddon_tax(cls, tax_name, company_data):
return cls.env['account.tax'].create({
'name': '%s (group)' % tax_name,
'amount_type': 'group',
'amount': 0.0,
'children_tax_ids': [
(0, 0, {
'name': '%s (child 1)' % tax_name,
'amount_type': 'percent',
'amount': 20.0,
'price_include': True,
'include_base_amount': True,
'tax_exigibility': 'on_invoice',
'invoice_repartition_line_ids': [
(0, 0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0, 0, {
'factor_percent': 40,
'repartition_type': 'tax',
'account_id': company_data['default_account_tax_sale'].id,
}),
(0, 0, {
'factor_percent': 60,
'repartition_type': 'tax',
# /!\ No account set.
}),
],
'refund_repartition_line_ids': [
(0, 0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0, 0, {
'factor_percent': 40,
'repartition_type': 'tax',
'account_id': company_data['default_account_tax_sale'].id,
}),
(0, 0, {
'factor_percent': 60,
'repartition_type': 'tax',
# /!\ No account set.
}),
],
}),
(0, 0, {
'name': '%s (child 2)' % tax_name,
'amount_type': 'percent',
'amount': 10.0,
'tax_exigibility': 'on_payment',
'cash_basis_transition_account_id': company_data['default_account_tax_sale'].copy().id,
'invoice_repartition_line_ids': [
(0, 0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0, 0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': company_data['default_account_tax_sale'].id,
}),
],
'refund_repartition_line_ids': [
(0, 0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0, 0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': company_data['default_account_tax_sale'].id,
}),
],
}),
],
})
+147
View File
@@ -0,0 +1,147 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.account_test_savepoint import AccountingSavepointCase
from odoo.tests.common import Form
from odoo.tests import tagged
from odoo.exceptions import ValidationError
from odoo import fields
import logging
_logger = logging.getLogger(__name__)
@tagged('post_install', '-at_install')
class InvoiceTestCommon(AccountingSavepointCase):
@classmethod
def setUpClass(cls):
super(InvoiceTestCommon, cls).setUpClass()
# ==== Taxes ====
cls.tax_sale_a = cls.company_data['default_tax_sale']
cls.tax_sale_b = cls.company_data['default_tax_sale'].copy()
cls.tax_purchase_a = cls.company_data['default_tax_purchase']
cls.tax_purchase_b = cls.company_data['default_tax_purchase'].copy()
cls.tax_armageddon = cls.setup_armageddon_tax('complex_tax', cls.company_data)
# ==== Products ====
cls.product_a = cls.env['product.product'].create({
'name': 'product_a',
'uom_id': cls.env.ref('uom.product_uom_unit').id,
'lst_price': 1000.0,
'standard_price': 800.0,
'property_account_income_id': cls.company_data['default_account_revenue'].id,
'property_account_expense_id': cls.company_data['default_account_expense'].id,
'taxes_id': [(6, 0, cls.tax_sale_a.ids)],
'supplier_taxes_id': [(6, 0, cls.tax_purchase_a.ids)],
})
cls.product_b = cls.env['product.product'].create({
'name': 'product_b',
'uom_id': cls.env.ref('uom.product_uom_dozen').id,
'lst_price': 200.0,
'standard_price': 160.0,
'property_account_income_id': cls.company_data['default_account_revenue'].copy().id,
'property_account_expense_id': cls.company_data['default_account_expense'].copy().id,
'taxes_id': [(6, 0, (cls.tax_sale_a + cls.tax_sale_b).ids)],
'supplier_taxes_id': [(6, 0, (cls.tax_purchase_a + cls.tax_purchase_b).ids)],
})
# ==== Fiscal positions ====
cls.fiscal_pos_a = cls.env['account.fiscal.position'].create({
'name': 'fiscal_pos_a',
'tax_ids': [
(0, None, {
'tax_src_id': cls.tax_sale_a.id,
'tax_dest_id': cls.tax_sale_b.id,
}),
(0, None, {
'tax_src_id': cls.tax_purchase_a.id,
'tax_dest_id': cls.tax_purchase_b.id,
}),
],
'account_ids': [
(0, None, {
'account_src_id': cls.product_a.property_account_income_id.id,
'account_dest_id': cls.product_b.property_account_income_id.id,
}),
(0, None, {
'account_src_id': cls.product_a.property_account_expense_id.id,
'account_dest_id': cls.product_b.property_account_expense_id.id,
}),
],
})
# ==== Payment terms ====
cls.pay_terms_a = cls.env.ref('account.account_payment_term_immediate')
cls.pay_terms_b = cls.env['account.payment.term'].create({
'name': '30% Advance End of Following Month',
'note': 'Payment terms: 30% Advance End of Following Month',
'line_ids': [
(0, 0, {
'value': 'percent',
'value_amount': 30.0,
'sequence': 400,
'days': 0,
'option': 'day_after_invoice_date',
}),
(0, 0, {
'value': 'balance',
'value_amount': 0.0,
'sequence': 500,
'days': 31,
'option': 'day_following_month',
}),
],
})
# ==== Partners ====
cls.partner_a = cls.env['res.partner'].create({
'name': 'partner_a',
'property_payment_term_id': cls.pay_terms_a.id,
'property_supplier_payment_term_id': cls.pay_terms_a.id,
'property_account_receivable_id': cls.company_data['default_account_receivable'].id,
'property_account_payable_id': cls.company_data['default_account_payable'].id,
'company_id': False,
})
cls.partner_b = cls.env['res.partner'].create({
'name': 'partner_b',
'property_payment_term_id': cls.pay_terms_b.id,
'property_supplier_payment_term_id': cls.pay_terms_b.id,
'property_account_position_id': cls.fiscal_pos_a.id,
'property_account_receivable_id': cls.company_data['default_account_receivable'].copy().id,
'property_account_payable_id': cls.company_data['default_account_payable'].copy().id,
'company_id': False,
})
# ==== Cash rounding ====
cls.cash_rounding_a = cls.env['account.cash.rounding'].create({
'name': 'add_invoice_line',
'rounding': 0.05,
'strategy': 'add_invoice_line',
'account_id': cls.company_data['default_account_revenue'].copy().id,
'rounding_method': 'UP',
})
cls.cash_rounding_b = cls.env['account.cash.rounding'].create({
'name': 'biggest_tax',
'rounding': 0.05,
'strategy': 'biggest_tax',
'rounding_method': 'DOWN',
})
@classmethod
def init_invoice(cls, move_type):
move_form = Form(cls.env['account.move'].with_context(default_type=move_type))
move_form.invoice_date = fields.Date.from_string('2019-01-01')
move_form.partner_id = cls.partner_a
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = cls.product_a
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = cls.product_b
return move_form.save()
def assertInvoiceValues(self, move, expected_lines_values, expected_move_values):
def sort_lines(lines):
return lines.sorted(lambda line: (line.exclude_from_invoice_tab, not bool(line.tax_line_id), line.name or '', line.balance))
self.assertRecordValues(sort_lines(move.line_ids), expected_lines_values)
self.assertRecordValues(sort_lines(move.invoice_line_ids), expected_lines_values[:len(move.invoice_line_ids)])
self.assertRecordValues(move, [expected_move_values])
@@ -1,364 +0,0 @@
from unittest.mock import patch
from odoo.addons.account.tests.account_test_users import AccountTestUsers
import datetime
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestAccountCustomerInvoice(AccountTestUsers):
def test_customer_invoice(self):
# I will create bank detail with using manager access rights
# because account manager can only create bank details.
self.res_partner_bank_0 = self.env['res.partner.bank'].sudo(self.account_manager.id).create(dict(
acc_type='bank',
company_id=self.main_company.id,
partner_id=self.main_partner.id,
acc_number='123456789',
bank_id=self.main_bank.id,
))
# Test with that user which have rights to make Invoicing and payment and who is accountant.
# Create a customer invoice
self.account_invoice_obj = self.env['account.invoice']
self.payment_term = self.env.ref('account.account_payment_term_advance')
self.journalrec = self.env['account.journal'].search([('type', '=', 'sale')])[0]
self.partner3 = self.env.ref('base.res_partner_3')
account_user_type = self.env.ref('account.data_account_type_receivable')
self.ova = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_current_assets').id)], limit=1)
#only adviser can create an account
self.account_rec1_id = self.account_model.sudo(self.account_manager.id).create(dict(
code="cust_acc",
name="customer account",
user_type_id=account_user_type.id,
reconcile=True,
))
invoice_line_data = [
(0, 0,
{
'product_id': self.env.ref('product.product_product_5').id,
'quantity': 10.0,
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
'name': 'product test 5',
'price_unit': 100.00,
}
)
]
self.account_invoice_customer0 = self.account_invoice_obj.sudo(self.account_user.id).create(dict(
name="Test Customer Invoice",
payment_term_id=self.payment_term.id,
journal_id=self.journalrec.id,
partner_id=self.partner3.id,
account_id=self.account_rec1_id.id,
invoice_line_ids=invoice_line_data
))
# I manually assign tax on invoice
invoice_tax_line = {
'name': 'Test Tax for Customer Invoice',
'manual': 1,
'amount': 9050,
'account_id': self.ova.id,
'invoice_id': self.account_invoice_customer0.id,
}
tax = self.env['account.invoice.tax'].create(invoice_tax_line)
assert tax, "Tax has not been assigned correctly"
total_before_confirm = self.partner3.total_invoiced
# I check that Initially customer invoice is in the "Draft" state
self.assertEquals(self.account_invoice_customer0.state, 'draft')
# I check that there is no move attached to the invoice
self.assertEquals(len(self.account_invoice_customer0.move_id), 0)
# I validate invoice by creating on
self.account_invoice_customer0.action_invoice_open()
# I check that the invoice state is "Open"
self.assertEquals(self.account_invoice_customer0.state, 'open')
# I check that now there is a move attached to the invoice
assert self.account_invoice_customer0.move_id, "Move not created for open invoice"
# I totally pay the Invoice
self.account_invoice_customer0.pay_and_reconcile(self.env['account.journal'].search([('type', '=', 'bank')], limit=1), 10050.0)
# I verify that invoice is now in Paid state
assert (self.account_invoice_customer0.state == 'paid'), "Invoice is not in Paid state"
self.partner3.invalidate_cache(ids=self.partner3.ids)
total_after_confirm = self.partner3.total_invoiced
self.assertEquals(total_after_confirm - total_before_confirm, self.account_invoice_customer0.amount_untaxed_signed)
# I created a credit note Using Add Credit Note Button
invoice_refund_obj = self.env['account.invoice.refund']
self.account_invoice_refund_0 = invoice_refund_obj.create(dict(
description='Credit Note for China Export',
date=datetime.date.today(),
filter_refund='refund'
))
# I clicked on Add Credit Note button.
self.account_invoice_refund_0.invoice_refund()
def test_customer_invoice_tax(self):
self.env.company.tax_calculation_rounding_method = 'round_globally'
payment_term = self.env.ref('account.account_payment_term_advance')
journalrec = self.env['account.journal'].search([('type', '=', 'sale')])[0]
partner3 = self.env.ref('base.res_partner_3')
account_id = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id
tax = self.env['account.tax'].create({
'name': 'Tax 15.0',
'amount': 15.0,
'amount_type': 'percent',
'type_tax_use': 'sale',
})
invoice_line_data = [
(0, 0,
{
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 40.0,
'account_id': account_id,
'name': 'product test 1',
'discount' : 10.00,
'price_unit': 2.27,
'invoice_line_tax_ids': [(6, 0, [tax.id])],
}
),
(0, 0,
{
'product_id': self.env.ref('product.product_product_2').id,
'quantity': 21.0,
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
'name': 'product test 2',
'discount' : 10.00,
'price_unit': 2.77,
'invoice_line_tax_ids': [(6, 0, [tax.id])],
}
),
(0, 0,
{
'product_id': self.env.ref('product.product_product_3').id,
'quantity': 21.0,
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
'name': 'product test 3',
'discount' : 10.00,
'price_unit': 2.77,
'invoice_line_tax_ids': [(6, 0, [tax.id])],
}
)
]
invoice = self.env['account.invoice'].create(dict(
name="Test Customer Invoice",
payment_term_id=payment_term.id,
journal_id=journalrec.id,
partner_id=partner3.id,
invoice_line_ids=invoice_line_data
))
self.assertAlmostEquals(invoice.amount_untaxed, sum([x.base for x in invoice.tax_line_ids]))
def test_customer_invoice_tax_refund(self):
company = self.env.company
tax_account = self.env['account.account'].create({
'name': 'TAX',
'code': 'TAX',
'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
'company_id': company.id,
})
tax_refund_account = self.env['account.account'].create({
'name': 'TAX_REFUND',
'code': 'TAX_R',
'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
'company_id': company.id,
})
journalrec = self.env['account.journal'].search([('type', '=', 'sale')])[0]
partner3 = self.env.ref('base.res_partner_3')
account_id = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id
tax = self.env['account.tax'].create({
'name': 'Tax 15.0',
'amount': 15.0,
'amount_type': 'percent',
'type_tax_use': 'sale',
'invoice_repartition_line_ids': [
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': tax_account.id,
}),
],
'refund_repartition_line_ids': [
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': tax_refund_account.id,
}),
],
})
invoice_line_data = [
(0, 0,
{
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 40.0,
'account_id': account_id,
'name': 'product test 1',
'discount': 10.00,
'price_unit': 2.27,
'invoice_line_tax_ids': [(6, 0, [tax.id])],
}
)]
invoice = self.env['account.invoice'].create(dict(
name="Test Customer Invoice",
journal_id=journalrec.id,
partner_id=partner3.id,
invoice_line_ids=invoice_line_data
))
invoice.action_invoice_open()
refund = invoice.refund()
self.assertEqual(invoice.tax_line_ids.mapped('account_id'), tax_account)
self.assertEqual(refund.tax_line_ids.mapped('account_id'), tax_refund_account)
def test_customer_invoice_dashboard(self):
def patched_today(*args, **kwargs):
return '2019-01-22'
date_invoice = '2019-01-21'
partner3 = self.env.ref('base.res_partner_3')
account_id = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id
journal = self.env['account.journal'].create({
'name': 'sale_0',
'code': 'SALE0',
'type': 'sale',
})
invoice_line_data = [
(0, 0,
{
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 40.0,
'account_id': account_id,
'name': 'product test 1',
'discount': 10.00,
'price_unit': 2.27,
}
)
]
invoice = self.env['account.invoice'].create(dict(
name="Test Customer Invoice",
journal_id=journal.id,
partner_id=partner3.id,
invoice_line_ids=invoice_line_data,
date_invoice=date_invoice,
))
refund_line_data = [
(0, 0,
{
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 1.0,
'account_id': account_id,
'name': 'product test 1',
'price_unit': 13.3,
}
)]
refund = self.env['account.invoice'].create(dict(
name="Test Customer Refund",
type='out_refund',
journal_id=journal.id,
partner_id=partner3.id,
invoice_line_ids=refund_line_data,
date_invoice=date_invoice,
))
# Check Draft
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 2)
self.assertIn('68.42', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 0)
self.assertIn('0.00', dashboard_data['sum_waiting'])
# Check Both
invoice.action_invoice_open()
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 1)
self.assertIn('-13.30', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 1)
self.assertIn('81.72', dashboard_data['sum_waiting'])
# Check waiting payment
refund.action_invoice_open()
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 0)
self.assertIn('0.00', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 2)
self.assertIn('68.42', dashboard_data['sum_waiting'])
# Check partial
receivable_account = refund.move_id.line_ids.mapped('account_id').filtered(lambda a: a.internal_type == 'receivable')
payment_move = self.env['account.move'].create({
'journal_id': journal.id,
})
payment_move_line = self.env['account.move.line'].with_context(check_move_validity=False).create({
'move_id': payment_move.id,
'account_id': receivable_account.id,
'debit': 10.00,
})
self.env['account.move.line'].with_context(check_move_validity=False).create({
'move_id': payment_move.id,
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_liquidity').id)], limit=1).id,
'credit': 10.00,
})
payment_move.post()
refund.register_payment(payment_move_line)
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 0)
self.assertIn('0.00', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 2)
self.assertIn('78.42', dashboard_data['sum_waiting'])
with patch('odoo.fields.Date.today', patched_today):
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_late'], 2)
self.assertIn('78.42', dashboard_data['sum_late'])
@@ -0,0 +1,123 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
from odoo.tests.common import Form
from odoo.tests import tagged
from odoo import fields
from unittest.mock import patch
@tagged('post_install', '-at_install')
class TestAccountInvoiceReport(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountInvoiceReport, cls).setUpClass()
cls.invoices = cls.env['account.move'].create([
{
'type': 'out_invoice',
'partner_id': cls.partner_a.id,
'invoice_date': fields.Date.from_string('2016-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 3,
'price_unit': 1000,
}),
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 3000,
}),
]
},
{
'type': 'out_receipt',
'invoice_date': fields.Date.from_string('2016-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 6000,
}),
]
},
{
'type': 'out_refund',
'partner_id': cls.partner_a.id,
'invoice_date': fields.Date.from_string('2017-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 1200,
}),
]
},
{
'type': 'in_invoice',
'partner_id': cls.partner_a.id,
'invoice_date': fields.Date.from_string('2016-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 60,
}),
]
},
{
'type': 'in_receipt',
'partner_id': cls.partner_a.id,
'invoice_date': fields.Date.from_string('2016-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 60,
}),
]
},
{
'type': 'in_refund',
'partner_id': cls.partner_a.id,
'invoice_date': fields.Date.from_string('2017-01-01'),
'currency_id': cls.currency_data['currency'].id,
'invoice_line_ids': [
(0, None, {
'product_id': cls.product_a.id,
'quantity': 1,
'price_unit': 12,
}),
]
},
])
def assertInvoiceReportValues(self, expected_values_list):
reports = self.env['account.invoice.report'].search([('company_id', '=', self.company_data['company'].id)], order='price_subtotal DESC')
expected_values_dict = [{
'amount_total': vals[0],
'price_average': vals[1],
'price_subtotal': vals[2],
'residual': vals[3],
'quantity': vals[4],
} for vals in expected_values_list]
self.assertRecordValues(reports, expected_values_dict)
def test_invoice_report_multiple_types(self):
self.assertInvoiceReportValues([
# amount_total price_average price_subtotal residual quantity
[2000, 2000, 2000, 2000, 1],
[2000, 1000, 1000, 2000, 1],
[2000, 1000, 1000, 2000, 3],
[6, 6, 6, 6, 1],
[-20, -20, -20, -20, 1],
[-20, -20, -20, -20, 1],
[-600, -600, -600, -600, 1],
])
@@ -1,108 +0,0 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.exceptions import ValidationError
from odoo.tests import tagged
import time
@tagged('post_install', '-at_install')
class TestAccountInvoiceRounding(AccountingTestCase):
def setUp(self):
super(TestAccountInvoiceRounding, self).setUp()
self.account_receivable = self.env['account.account'].search(
[('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1)
self.account_revenue = self.env['account.account'].search(
[('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1)
self.fixed_tax = self.env['account.tax'].create({
'name': 'Test Tax',
'amount': 0.0,
'amount_type': 'fixed',
})
def create_cash_rounding(self, rounding, method, strategy):
return self.env['account.cash.rounding'].create({
'name': 'rounding ' + method,
'rounding': rounding,
'account_id': self.account_receivable.id,
'strategy': strategy,
'rounding_method': method,
})
def create_invoice(self, amount, cash_rounding_id, tax_amount=None):
""" Returns an open invoice """
invoice_id = self.env['account.invoice'].create({
'partner_id': self.env.ref("base.res_partner_2").id,
'currency_id': self.env.ref('base.USD').id,
'name': 'invoice test rounding',
'account_id': self.account_receivable.id,
'type': 'out_invoice',
'date_invoice': time.strftime('%Y') + '-06-26',
})
if tax_amount:
self.fixed_tax.amount = tax_amount
self.env['account.invoice.line'].create({
'product_id': self.env.ref("product.product_product_4").id,
'quantity': 1,
'price_unit': amount,
'invoice_id': invoice_id.id,
'name': 'something',
'account_id': self.account_revenue.id,
'invoice_line_tax_ids': [(6, 0, [self.fixed_tax.id])] if tax_amount else None
})
# Create the tax_line_ids
invoice_id._onchange_invoice_line_ids()
# We need to set the cash_rounding_id after the _onchange_invoice_line_ids
# to avoid a ValidationError from _check_cash_rounding because the onchange
# are not well triggered in the tests.
try:
invoice_id.cash_rounding_id = cash_rounding_id
except ValidationError:
pass
invoice_id._onchange_cash_rounding()
invoice_id.action_invoice_open()
return invoice_id
def _check_invoice_rounding(self, inv, exp_lines_values, exp_tax_values=None):
inv_lines = inv.invoice_line_ids
self.assertEquals(len(inv_lines), len(exp_lines_values))
for i in range(0, len(exp_lines_values)):
self.assertEquals(inv_lines[i].price_unit, exp_lines_values[i])
if exp_tax_values:
tax_lines = inv.tax_line_ids
self.assertEquals(len(tax_lines), len(exp_tax_values))
for i in range(0, len(exp_tax_values)):
self.assertEquals(tax_lines[i].amount_total, exp_tax_values[i])
def test_rounding_add_invoice_line(self):
self._check_invoice_rounding(
self.create_invoice(100.2, self.create_cash_rounding(0.5, 'UP', 'add_invoice_line')),
[100.2, 0.3]
)
self._check_invoice_rounding(
self.create_invoice(100.9, self.create_cash_rounding(1.0, 'DOWN', 'add_invoice_line')),
[100.9, -0.9]
)
self._check_invoice_rounding(
self.create_invoice(100.5, self.create_cash_rounding(1.0, 'HALF-UP', 'add_invoice_line')),
[100.5, 0.5]
)
def test_rounding_biggest_tax(self):
self._check_invoice_rounding(
self.create_invoice(100.2, self.create_cash_rounding(0.5, 'UP', 'biggest_tax'), 1.0),
[100.2], [1.3]
)
self._check_invoice_rounding(
self.create_invoice(100.9, self.create_cash_rounding(1.0, 'DOWN', 'biggest_tax'), 2.0),
[100.9], [1.1]
)
self._check_invoice_rounding(
self.create_invoice(100.5, self.create_cash_rounding(1.0, 'HALF-UP', 'biggest_tax'), 1.0),
[100.5], [1.5]
)
@@ -0,0 +1,108 @@
from unittest.mock import patch
from odoo.addons.account.tests.account_test_users import AccountTestUsers
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestAccountJournalDashboard(AccountTestUsers):
def test_customer_invoice_dashboard(self):
def patched_today(*args, **kwargs):
return '2019-01-22'
date_invoice = '2019-01-21'
journal = self.env['account.journal'].create({
'name': 'sale_0',
'code': 'SALE0',
'type': 'sale',
})
invoice = self.env['account.move'].create({
'type': 'out_invoice',
'journal_id': journal.id,
'partner_id': self.env.ref('base.res_partner_3').id,
'invoice_date': date_invoice,
'date': date_invoice,
'invoice_line_ids': [(0, 0, {
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 40.0,
'name': 'product test 1',
'discount': 10.00,
'price_unit': 2.27,
})]
})
refund = self.env['account.move'].create({
'type': 'out_refund',
'journal_id': journal.id,
'partner_id': self.env.ref('base.res_partner_3').id,
'invoice_date': '2019-01-21',
'date': date_invoice,
'invoice_line_ids': [(0, 0, {
'product_id': self.env.ref('product.product_product_1').id,
'quantity': 1.0,
'name': 'product test 1',
'price_unit': 13.3,
})]
})
# Check Draft
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 2)
self.assertIn('68.42', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 0)
self.assertIn('0.00', dashboard_data['sum_waiting'])
# Check Both
invoice.post()
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 1)
self.assertIn('-13.30', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 1)
self.assertIn('81.72', dashboard_data['sum_waiting'])
# Check waiting payment
refund.post()
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 0)
self.assertIn('0.00', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 2)
self.assertIn('68.42', dashboard_data['sum_waiting'])
# Check partial
receivable_account = refund.line_ids.mapped('account_id').filtered(lambda a: a.internal_type == 'receivable')
payment_move = self.env['account.move'].create({
'journal_id': journal.id,
})
payment_move_line = self.env['account.move.line'].with_context(check_move_validity=False).create({
'move_id': payment_move.id,
'account_id': receivable_account.id,
'debit': 10.00,
})
self.env['account.move.line'].with_context(check_move_validity=False).create({
'move_id': payment_move.id,
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_liquidity').id)], limit=1).id,
'credit': 10.00,
})
payment_move.post()
refund.js_assign_outstanding_line(payment_move_line.id)
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_draft'], 0)
self.assertIn('0.00', dashboard_data['sum_draft'])
self.assertEquals(dashboard_data['number_waiting'], 2)
self.assertIn('78.42', dashboard_data['sum_waiting'])
with patch('odoo.fields.Date.today', patched_today):
dashboard_data = journal.get_journal_dashboard_datas()
self.assertEquals(dashboard_data['number_late'], 2)
self.assertIn('78.42', dashboard_data['sum_late'])
@@ -1,48 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.osv.orm import except_orm
from datetime import datetime
from dateutil.relativedelta import relativedelta
from calendar import monthrange
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestPeriodState(AccountingTestCase):
"""
Forbid creation of Journal Entries for a closed period.
"""
def setUp(self):
super(TestPeriodState, self).setUp()
self.user_id = self.env.user
last_day_month = datetime.now() - relativedelta(months=1)
last_day_month = last_day_month.replace(day=monthrange(last_day_month.year, last_day_month.month)[1])
self.last_day_month_str = last_day_month.strftime(DEFAULT_SERVER_DATE_FORMAT)
#make sure there is no unposted entry
draft_entries = self.env['account.move'].search([('date', '<=', self.last_day_month_str), ('state', '=', 'draft')])
if draft_entries:
draft_entries.post()
self.user_id.company_id.fiscalyear_lock_date = self.last_day_month_str
self.sale_journal_id = self.env['account.journal'].search([('type', '=', 'sale')])[0]
self.account_id = self.env['account.account'].search([('internal_type', '=', 'receivable')])[0]
def test_period_state(self):
with self.assertRaises(except_orm):
move = self.env['account.move'].create({
'name': '/',
'journal_id': self.sale_journal_id.id,
'date': self.last_day_month_str,
'line_ids': [(0, 0, {
'name': 'foo',
'debit': 10,
'account_id': self.account_id.id,
}), (0, 0, {
'name': 'bar',
'credit': 10,
'account_id': self.account_id.id,
})]
})
move.post()
@@ -0,0 +1,112 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
from odoo.tests import tagged
from odoo import fields
from odoo.exceptions import ValidationError, UserError
@tagged('post_install', '-at_install')
class TestAccountMove(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountMove, cls).setUpClass()
tax_repartition_line = cls.company_data['default_tax_sale'].invoice_repartition_line_ids\
.filtered(lambda line: line.repartition_type == 'tax')
cls.test_move = cls.env['account.move'].create({
'type': 'entry',
'date': fields.Date.from_string('2016-01-01'),
'line_ids': [
(0, None, {
'name': 'revenue line 1',
'account_id': cls.company_data['default_account_revenue'].id,
'debit': 500.0,
'credit': 0.0,
}),
(0, None, {
'name': 'revenue line 2',
'account_id': cls.company_data['default_account_revenue'].id,
'debit': 1000.0,
'credit': 0.0,
'tax_ids': [(6, 0, cls.company_data['default_tax_sale'].ids)],
}),
(0, None, {
'name': 'tax line',
'account_id': cls.company_data['default_account_tax_sale'].id,
'debit': 150.0,
'credit': 0.0,
'tax_repartition_line_id': tax_repartition_line.id,
}),
(0, None, {
'name': 'counterpart line',
'account_id': cls.company_data['default_account_expense'].id,
'debit': 0.0,
'credit': 1650.0,
}),
]
})
def test_misc_fiscalyear_lock_date_1(self):
with self.assertRaises((ValidationError, UserError)):
self.test_move.company_id.fiscalyear_lock_date = fields.Date.from_string('2017-01-01')
self.cr.execute('''UPDATE res_company SET fiscalyear_lock_date = '2017-01-01' WHERE id = %s''', self.test_move.company_id.ids)
with self.assertRaises((ValidationError, UserError)):
self.test_move.post()
with self.assertRaises(UserError):
self.env['account.move'].create(self.test_move.copy_data())
def test_misc_tax_lock_date_1(self):
# Set the tax lock date after the journal entry date.
self.test_move.company_id.tax_lock_date = fields.Date.from_string('2017-01-01')
# lines[0] = 'counterpart line'
# lines[1] = 'tax line'
# lines[2] = 'revenue line 1'
# lines[3] = 'revenue line 2'
lines = self.test_move.line_ids.sorted('debit')
# Writing not affecting a tax is allowed.
self.test_move.write({
'line_ids': [
(1, lines[0].id, {'credit': 1750.0}), # counterpart line
(1, lines[2].id, {'debit': 600.0}), # revenue line 1
],
})
self.cr.execute('SAVEPOINT test_misc_tax_lock_date_1')
# Writing something affecting a tax is not allowed.
with self.assertRaises(ValidationError):
self.test_move.write({
'line_ids': [
(1, lines[0].id, {'credit': 2750.0}),
(1, lines[3].id, {'debit': 2000.0}),
],
})
with self.assertRaises(ValidationError):
self.test_move.write({
'line_ids': [
(1, lines[3].id, {'tax_ids': [(6, 0, self.company_data['default_tax_purchase'].ids)]}),
],
})
with self.assertRaises(ValidationError):
self.test_move.write({
'line_ids': [
(1, lines[0].id, {'credit': 1900.0}),
(1, lines[1].id, {'debit': 300.0}),
],
})
with self.assertRaises(ValidationError):
self.test_move.unlink()
self.cr.execute('ROLLBACK TO SAVEPOINT test_misc_tax_lock_date_1')
with self.assertRaises(UserError):
self.test_move.post()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,956 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
from odoo.tests.common import Form
from odoo.tests import tagged
from odoo import fields
@tagged('post_install', '-at_install')
class TestAccountMoveInRefundOnchanges(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountMoveInRefundOnchanges, cls).setUpClass()
cls.invoice = cls.init_invoice('in_refund')
cls.product_line_vals_1 = {
'name': cls.product_a.name,
'product_id': cls.product_a.id,
'account_id': cls.product_a.property_account_expense_id.id,
'partner_id': cls.partner_a.id,
'product_uom_id': cls.product_a.uom_id.id,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 800.0,
'price_subtotal': 800.0,
'price_total': 920.0,
'tax_ids': cls.product_a.supplier_taxes_id.ids,
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 800.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.product_line_vals_2 = {
'name': cls.product_b.name,
'product_id': cls.product_b.id,
'account_id': cls.product_b.property_account_expense_id.id,
'partner_id': cls.partner_a.id,
'product_uom_id': cls.product_b.uom_id.id,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 160.0,
'price_subtotal': 160.0,
'price_total': 208.0,
'tax_ids': cls.product_b.supplier_taxes_id.ids,
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 160.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.tax_line_vals_1 = {
'name': cls.tax_purchase_a.name,
'product_id': False,
'account_id': cls.company_data['default_account_tax_purchase'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 144.0,
'price_subtotal': 144.0,
'price_total': 144.0,
'tax_ids': [],
'tax_line_id': cls.tax_purchase_a.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 144.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.tax_line_vals_2 = {
'name': cls.tax_purchase_b.name,
'product_id': False,
'account_id': cls.company_data['default_account_tax_purchase'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 24.0,
'price_subtotal': 24.0,
'price_total': 24.0,
'tax_ids': [],
'tax_line_id': cls.tax_purchase_b.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 24.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.term_line_vals_1 = {
'name': '',
'product_id': False,
'account_id': cls.company_data['default_account_payable'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': -1128.0,
'price_subtotal': -1128.0,
'price_total': -1128.0,
'tax_ids': [],
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 1128.0,
'credit': 0.0,
'date_maturity': fields.Date.from_string('2019-01-01'),
'tax_exigible': True,
}
cls.move_vals = {
'partner_id': cls.partner_a.id,
'currency_id': cls.company_data['currency'].id,
'journal_id': cls.company_data['default_journal_purchase'].id,
'date': fields.Date.from_string('2019-01-01'),
'fiscal_position_id': False,
'invoice_payment_ref': '',
'invoice_payment_term_id': cls.pay_terms_a.id,
'amount_untaxed': 960.0,
'amount_tax': 168.0,
'amount_total': 1128.0,
}
def setUp(self):
super(TestAccountMoveInRefundOnchanges, self).setUp()
self.assertInvoiceValues(self.invoice, [
self.product_line_vals_1,
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
def test_in_refund_line_onchange_product_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.product_id = self.product_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'name': self.product_b.name,
'product_id': self.product_b.id,
'product_uom_id': self.product_b.uom_id.id,
'account_id': self.product_b.property_account_expense_id.id,
'price_unit': 160.0,
'price_subtotal': 160.0,
'price_total': 208.0,
'tax_ids': self.product_b.supplier_taxes_id.ids,
'credit': 160.0,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 48.0,
'price_subtotal': 48.0,
'price_total': 48.0,
'credit': 48.0,
},
{
**self.tax_line_vals_2,
'price_unit': 48.0,
'price_subtotal': 48.0,
'price_total': 48.0,
'credit': 48.0,
},
{
**self.term_line_vals_1,
'price_unit': -416.0,
'price_subtotal': -416.0,
'price_total': -416.0,
'debit': 416.0,
},
], {
**self.move_vals,
'amount_untaxed': 320.0,
'amount_tax': 96.0,
'amount_total': 416.0,
})
def test_in_refund_line_onchange_business_fields_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
# Current price_unit is 1000.
# We set quantity = 4, discount = 50%, price_unit = 400 because (4 * 400) * 0.5 = 800.
line_form.quantity = 4
line_form.discount = 50
line_form.price_unit = 400
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 4,
'discount': 50.0,
'price_unit': 400.0,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
with move_form.line_ids.edit(2) as line_form:
# Reset field except the discount that becomes 100%.
# /!\ The modification is made on the accounting tab.
line_form.quantity = 1
line_form.discount = 100
line_form.price_unit = 800
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'discount': 100.0,
'price_subtotal': 0.0,
'price_total': 0.0,
'credit': 0.0,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 24.0,
'price_subtotal': 24.0,
'price_total': 24.0,
'credit': 24.0,
},
self.tax_line_vals_2,
{
**self.term_line_vals_1,
'price_unit': -208.0,
'price_subtotal': -208.0,
'price_total': -208.0,
'debit': 208.0,
},
], {
**self.move_vals,
'amount_untaxed': 160.0,
'amount_tax': 48.0,
'amount_total': 208.0,
})
def test_in_refund_line_onchange_accounting_fields_1(self):
move_form = Form(self.invoice)
with move_form.line_ids.edit(2) as line_form:
# Custom credit on the first product line.
line_form.credit = 3000
with move_form.line_ids.edit(3) as line_form:
# Custom debit on the second product line. Credit should be reset by onchange.
# /!\ It's a negative line.
line_form.debit = 500
with move_form.line_ids.edit(0) as line_form:
# Custom credit on the first tax line.
line_form.credit = 800
with move_form.line_ids.edit(4) as line_form:
# Custom credit on the second tax line.
line_form.credit = 250
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 3000.0,
'price_subtotal': 3000.0,
'price_total': 3450.0,
'credit': 3000.0,
},
{
**self.product_line_vals_2,
'price_unit': -500.0,
'price_subtotal': -500.0,
'price_total': -650.0,
'credit': 0.0,
'debit': 500.0,
},
{
**self.tax_line_vals_1,
'price_unit': 800.0,
'price_subtotal': 800.0,
'price_total': 800.0,
'credit': 800.0,
},
{
**self.tax_line_vals_2,
'price_unit': 250.0,
'price_subtotal': 250.0,
'price_total': 250.0,
'credit': 250.0,
},
{
**self.term_line_vals_1,
'price_unit': -3550.0,
'price_subtotal': -3550.0,
'price_total': -3550.0,
'debit': 3550.0,
},
], {
**self.move_vals,
'amount_untaxed': 2500.0,
'amount_tax': 1050.0,
'amount_total': 3550.0,
})
def test_in_refund_line_onchange_partner_1(self):
move_form = Form(self.invoice)
move_form.partner_id = self.partner_b
move_form.invoice_payment_ref = 'turlututu'
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'partner_id': self.partner_b.id,
},
{
**self.product_line_vals_2,
'partner_id': self.partner_b.id,
},
{
**self.tax_line_vals_1,
'partner_id': self.partner_b.id,
},
{
**self.tax_line_vals_2,
'partner_id': self.partner_b.id,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'partner_id': self.partner_b.id,
'price_unit': -338.4,
'price_subtotal': -338.4,
'price_total': -338.4,
'debit': 338.4,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'partner_id': self.partner_b.id,
'price_unit': -789.6,
'price_subtotal': -789.6,
'price_total': -789.6,
'debit': 789.6,
'date_maturity': fields.Date.from_string('2019-02-28'),
},
], {
**self.move_vals,
'partner_id': self.partner_b.id,
'invoice_payment_ref': 'turlututu',
'fiscal_position_id': self.fiscal_pos_a.id,
'invoice_payment_term_id': self.pay_terms_b.id,
'amount_untaxed': 960.0,
'amount_tax': 168.0,
'amount_total': 1128.0,
})
# Remove lines and recreate them to apply the fiscal position.
move_form = Form(self.invoice)
move_form.invoice_line_ids.remove(0)
move_form.invoice_line_ids.remove(0)
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product_a
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'account_id': self.product_b.property_account_expense_id.id,
'partner_id': self.partner_b.id,
'tax_ids': self.tax_purchase_b.ids,
},
{
**self.product_line_vals_2,
'partner_id': self.partner_b.id,
'price_total': 184.0,
'tax_ids': self.tax_purchase_b.ids,
},
{
**self.tax_line_vals_1,
'name': self.tax_purchase_b.name,
'partner_id': self.partner_b.id,
'tax_line_id': self.tax_purchase_b.id,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'account_id': self.partner_b.property_account_payable_id.id,
'partner_id': self.partner_b.id,
'price_unit': -331.2,
'price_subtotal': -331.2,
'price_total': -331.2,
'debit': 331.2,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'account_id': self.partner_b.property_account_payable_id.id,
'partner_id': self.partner_b.id,
'price_unit': -772.8,
'price_subtotal': -772.8,
'price_total': -772.8,
'debit': 772.8,
'date_maturity': fields.Date.from_string('2019-02-28'),
},
], {
**self.move_vals,
'partner_id': self.partner_b.id,
'invoice_payment_ref': 'turlututu',
'fiscal_position_id': self.fiscal_pos_a.id,
'invoice_payment_term_id': self.pay_terms_b.id,
'amount_untaxed': 960.0,
'amount_tax': 144.0,
'amount_total': 1104.0,
})
def test_in_refund_line_onchange_taxes_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.price_unit = 960
line_form.tax_ids.add(self.tax_armageddon)
move_form.save()
child_tax_1 = self.tax_armageddon.children_tax_ids[0]
child_tax_2 = self.tax_armageddon.children_tax_ids[1]
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 960.0,
'price_subtotal': 800.0,
'price_total': 1176.0,
'tax_ids': (self.tax_purchase_a + self.tax_armageddon).ids,
'tax_exigible': False,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
{
'name': child_tax_1.name,
'product_id': False,
'account_id': self.company_data['default_account_expense'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 96.0,
'price_subtotal': 96.0,
'price_total': 105.6,
'tax_ids': child_tax_2.ids,
'tax_line_id': child_tax_1.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 96.0,
'date_maturity': False,
'tax_exigible': True,
},
{
'name': child_tax_1.name,
'product_id': False,
'account_id': self.company_data['default_account_tax_sale'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 64.0,
'price_subtotal': 64.0,
'price_total': 70.4,
'tax_ids': child_tax_2.ids,
'tax_line_id': child_tax_1.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 64.0,
'date_maturity': False,
'tax_exigible': True,
},
{
'name': child_tax_2.name,
'product_id': False,
'account_id': child_tax_2.cash_basis_transition_account_id.id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 96.0,
'price_subtotal': 96.0,
'price_total': 96.0,
'tax_ids': [],
'tax_line_id': child_tax_2.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 96.0,
'date_maturity': False,
'tax_exigible': False,
},
{
**self.term_line_vals_1,
'price_unit': -1384.0,
'price_subtotal': -1384.0,
'price_total': -1384.0,
'debit': 1384.0,
},
], {
**self.move_vals,
'amount_untaxed': 960.0,
'amount_tax': 424.0,
'amount_total': 1384.0,
})
def test_in_refund_line_onchange_cash_rounding_1(self):
move_form = Form(self.invoice)
# Add a cash rounding having 'add_invoice_line'.
move_form.invoice_cash_rounding_id = self.cash_rounding_a
move_form.save()
# The cash rounding does nothing as the total is already rounded.
self.assertInvoiceValues(self.invoice, [
self.product_line_vals_1,
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.price_unit = 799.99
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
'name': 'add_invoice_line',
'product_id': False,
'account_id': self.cash_rounding_a.account_id.id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 0.01,
'price_subtotal': 0.01,
'price_total': 0.01,
'tax_ids': [],
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 0.01,
'date_maturity': False,
'tax_exigible': True,
},
{
**self.product_line_vals_1,
'price_unit': 799.99,
'price_subtotal': 799.99,
'price_total': 919.99,
'credit': 799.99,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
# Change the cash rounding to one having 'biggest_tax'.
move_form.invoice_cash_rounding_id = self.cash_rounding_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 799.99,
'price_subtotal': 799.99,
'price_total': 919.99,
'credit': 799.99,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
{
'name': '%s (rounding)' % self.tax_purchase_a.name,
'product_id': False,
'account_id': self.company_data['default_account_tax_purchase'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': -0.04,
'price_subtotal': -0.04,
'price_total': -0.04,
'tax_ids': [],
'tax_line_id': self.tax_purchase_a.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.04,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
},
{
**self.term_line_vals_1,
'price_unit': -1127.95,
'price_subtotal': -1127.95,
'price_total': -1127.95,
'debit': 1127.95,
},
], {
**self.move_vals,
'amount_untaxed': 959.99,
'amount_tax': 167.96,
'amount_total': 1127.95,
})
def test_in_refund_line_onchange_currency_1(self):
# New journal having a foreign currency set.
journal = self.company_data['default_journal_purchase'].copy()
journal.currency_id = self.currency_data['currency']
move_form = Form(self.invoice)
move_form.journal_id = journal
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -800.0,
'credit': 400.0,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -160.0,
'credit': 80.0,
},
{
**self.tax_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -144.0,
'credit': 72.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -24.0,
'credit': 12.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 1128.0,
'debit': 564.0,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
})
move_form = Form(self.invoice)
# Change the date to get another rate: 1/3 instead of 1/2.
move_form.date = fields.Date.from_string('2016-01-01')
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -800.0,
'credit': 266.67,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -160.0,
'credit': 53.33,
},
{
**self.tax_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -144.0,
'credit': 48.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -24.0,
'credit': 8.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 1128.0,
'debit': 376.0,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
})
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
# 0.045 * 0.1 = 0.0045. As the foreign currency has a 0.001 rounding,
# the result should be 0.005 after rounding.
line_form.quantity = 0.1
line_form.price_unit = 0.045
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 0.1,
'price_unit': 0.05,
'price_subtotal': 0.005,
'price_total': 0.006,
'currency_id': journal.currency_id.id,
'amount_currency': -0.005,
'credit': 0.0,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -160.0,
'credit': 53.33,
},
{
**self.tax_line_vals_1,
'price_unit': 24.0,
'price_subtotal': 24.001,
'price_total': 24.001,
'currency_id': journal.currency_id.id,
'amount_currency': -24.001,
'credit': 8.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': -24.0,
'credit': 8.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'price_unit': -208.01,
'price_subtotal': -208.006,
'price_total': -208.006,
'amount_currency': 208.006,
'debit': 69.33,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
'amount_untaxed': 160.005,
'amount_tax': 48.001,
'amount_total': 208.006,
})
move_form = Form(self.invoice)
move_form.currency_id = self.company_data['currency']
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 0.1,
'price_unit': 0.1,
'price_subtotal': 0.01,
'price_total': 0.01,
'credit': 0.01,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 24.0,
'price_subtotal': 24.0,
'price_total': 24.0,
'credit': 24.0,
},
self.tax_line_vals_2,
{
**self.term_line_vals_1,
'price_unit': -208.01,
'price_subtotal': -208.01,
'price_total': -208.01,
'debit': 208.01,
},
], {
**self.move_vals,
'currency_id': self.company_data['currency'].id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
'amount_untaxed': 160.01,
'amount_tax': 48.0,
'amount_total': 208.01,
})
def test_in_refund_line_onchange_sequence_number_1(self):
self.assertRecordValues(self.invoice, [{
'invoice_sequence_number_next': '0001',
'invoice_sequence_number_next_prefix': 'BILL/2019/',
}])
move_form = Form(self.invoice)
move_form.invoice_sequence_number_next = '0042'
move_form.save()
self.assertRecordValues(self.invoice, [{
'invoice_sequence_number_next': '0042',
'invoice_sequence_number_next_prefix': 'BILL/2019/',
}])
self.invoice.post()
self.assertRecordValues(self.invoice, [{'name': 'BILL/2019/0042'}])
invoice_copy = self.invoice.copy()
invoice_copy.post()
self.assertRecordValues(invoice_copy, [{'name': 'BILL/2019/0043'}])
def test_in_refund_onchange_past_invoice_1(self):
copy_invoice = self.invoice.copy()
move_form = Form(self.invoice)
move_form.invoice_line_ids.remove(0)
move_form.invoice_line_ids.remove(0)
move_form.invoice_vendor_bill_id = copy_invoice
move_form.save()
self.assertInvoiceValues(self.invoice, [
self.product_line_vals_1,
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
def test_in_refund_create_1(self):
# Test creating an account_move with the least information.
move = self.env['account.move'].create({
'type': 'in_refund',
'partner_id': self.partner_a.id,
'invoice_date': fields.Date.from_string('2019-01-01'),
'currency_id': self.currency_data['currency'].id,
'invoice_payment_term_id': self.pay_terms_a.id,
'invoice_line_ids': [
(0, None, self.product_line_vals_1),
(0, None, self.product_line_vals_2),
]
})
self.assertInvoiceValues(move, [
{
**self.product_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -800.0,
'credit': 400.0,
},
{
**self.product_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -160.0,
'credit': 80.0,
},
{
**self.tax_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -144.0,
'credit': 72.0,
},
{
**self.tax_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -24.0,
'credit': 12.0,
},
{
**self.term_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 1128.0,
'debit': 564.0,
},
], {
**self.move_vals,
'currency_id': self.currency_data['currency'].id,
})
def test_in_refund_write_1(self):
# Test creating an account_move with the least information.
move = self.env['account.move'].create({
'type': 'in_refund',
'partner_id': self.partner_a.id,
'invoice_date': fields.Date.from_string('2019-01-01'),
'currency_id': self.currency_data['currency'].id,
'invoice_payment_term_id': self.pay_terms_a.id,
'invoice_line_ids': [
(0, None, self.product_line_vals_1),
]
})
move.write({
'invoice_line_ids': [
(0, None, self.product_line_vals_2),
]
})
self.assertInvoiceValues(move, [
{
**self.product_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -800.0,
'credit': 400.0,
},
{
**self.product_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -160.0,
'credit': 80.0,
},
{
**self.tax_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -144.0,
'credit': 72.0,
},
{
**self.tax_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -24.0,
'credit': 12.0,
},
{
**self.term_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 1128.0,
'debit': 564.0,
},
], {
**self.move_vals,
'currency_id': self.currency_data['currency'].id,
})
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,939 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
from odoo.tests.common import Form
from odoo.tests import tagged
from odoo import fields
@tagged('post_install', '-at_install')
class TestAccountMoveOutRefundOnchanges(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountMoveOutRefundOnchanges, cls).setUpClass()
cls.invoice = cls.init_invoice('out_refund')
cls.product_line_vals_1 = {
'name': cls.product_a.name,
'product_id': cls.product_a.id,
'account_id': cls.product_a.property_account_income_id.id,
'partner_id': cls.partner_a.id,
'product_uom_id': cls.product_a.uom_id.id,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 1000.0,
'price_subtotal': 1000.0,
'price_total': 1150.0,
'tax_ids': cls.product_a.taxes_id.ids,
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 1000.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.product_line_vals_2 = {
'name': cls.product_b.name,
'product_id': cls.product_b.id,
'account_id': cls.product_b.property_account_income_id.id,
'partner_id': cls.partner_a.id,
'product_uom_id': cls.product_b.uom_id.id,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 200.0,
'price_subtotal': 200.0,
'price_total': 260.0,
'tax_ids': cls.product_b.taxes_id.ids,
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 200.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.tax_line_vals_1 = {
'name': cls.tax_sale_a.name,
'product_id': False,
'account_id': cls.company_data['default_account_tax_sale'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 180.0,
'price_subtotal': 180.0,
'price_total': 180.0,
'tax_ids': [],
'tax_line_id': cls.tax_sale_a.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 180.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.tax_line_vals_2 = {
'name': cls.tax_sale_b.name,
'product_id': False,
'account_id': cls.company_data['default_account_tax_sale'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 30.0,
'price_subtotal': 30.0,
'price_total': 30.0,
'tax_ids': [],
'tax_line_id': cls.tax_sale_b.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 30.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
}
cls.term_line_vals_1 = {
'name': '',
'product_id': False,
'account_id': cls.company_data['default_account_receivable'].id,
'partner_id': cls.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': -1410.0,
'price_subtotal': -1410.0,
'price_total': -1410.0,
'tax_ids': [],
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 1410.0,
'date_maturity': fields.Date.from_string('2019-01-01'),
'tax_exigible': True,
}
cls.move_vals = {
'partner_id': cls.partner_a.id,
'currency_id': cls.company_data['currency'].id,
'journal_id': cls.company_data['default_journal_sale'].id,
'date': fields.Date.from_string('2019-01-01'),
'fiscal_position_id': False,
'invoice_payment_ref': '',
'invoice_payment_term_id': cls.pay_terms_a.id,
'amount_untaxed': 1200.0,
'amount_tax': 210.0,
'amount_total': 1410.0,
}
def setUp(self):
super(TestAccountMoveOutRefundOnchanges, self).setUp()
self.assertInvoiceValues(self.invoice, [
self.product_line_vals_1,
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
def test_out_refund_line_onchange_product_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.product_id = self.product_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'name': self.product_b.name,
'product_id': self.product_b.id,
'product_uom_id': self.product_b.uom_id.id,
'account_id': self.product_b.property_account_income_id.id,
'price_unit': 200.0,
'price_subtotal': 200.0,
'price_total': 260.0,
'tax_ids': self.product_b.taxes_id.ids,
'debit': 200.0,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 60.0,
'price_subtotal': 60.0,
'price_total': 60.0,
'debit': 60.0,
},
{
**self.tax_line_vals_2,
'price_unit': 60.0,
'price_subtotal': 60.0,
'price_total': 60.0,
'debit': 60.0,
},
{
**self.term_line_vals_1,
'price_unit': -520.0,
'price_subtotal': -520.0,
'price_total': -520.0,
'credit': 520.0,
},
], {
**self.move_vals,
'amount_untaxed': 400.0,
'amount_tax': 120.0,
'amount_total': 520.0,
})
def test_out_refund_line_onchange_business_fields_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
# Current price_unit is 1000.
# We set quantity = 4, discount = 50%, price_unit = 500 because (4 * 500) * 0.5 = 1000.
line_form.quantity = 4
line_form.discount = 50
line_form.price_unit = 500
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 4,
'discount': 50.0,
'price_unit': 500.0,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
with move_form.line_ids.edit(2) as line_form:
# Reset field except the discount that becomes 100%.
# /!\ The modification is made on the accounting tab.
line_form.quantity = 1
line_form.discount = 100
line_form.price_unit = 1000
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'discount': 100.0,
'price_subtotal': 0.0,
'price_total': 0.0,
'debit': 0.0,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 30.0,
'price_subtotal': 30.0,
'price_total': 30.0,
'debit': 30.0,
},
self.tax_line_vals_2,
{
**self.term_line_vals_1,
'price_unit': -260.0,
'price_subtotal': -260.0,
'price_total': -260.0,
'credit': 260.0,
},
], {
**self.move_vals,
'amount_untaxed': 200.0,
'amount_tax': 60.0,
'amount_total': 260.0,
})
def test_out_refund_line_onchange_accounting_fields_1(self):
move_form = Form(self.invoice)
with move_form.line_ids.edit(2) as line_form:
# Custom debit on the first product line.
line_form.debit = 3000
with move_form.line_ids.edit(3) as line_form:
# Custom credit on the second product line. Credit should be reset by onchange.
# /!\ It's a negative line.
line_form.credit = 500
with move_form.line_ids.edit(0) as line_form:
# Custom debit on the first tax line.
line_form.debit = 800
with move_form.line_ids.edit(4) as line_form:
# Custom debit on the second tax line.
line_form.debit = 250
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 3000.0,
'price_subtotal': 3000.0,
'price_total': 3450.0,
'debit': 3000.0,
},
{
**self.product_line_vals_2,
'price_unit': -500.0,
'price_subtotal': -500.0,
'price_total': -650.0,
'debit': 0.0,
'credit': 500.0,
},
{
**self.tax_line_vals_1,
'price_unit': 800.0,
'price_subtotal': 800.0,
'price_total': 800.0,
'debit': 800.0,
},
{
**self.tax_line_vals_2,
'price_unit': 250.0,
'price_subtotal': 250.0,
'price_total': 250.0,
'debit': 250.0,
},
{
**self.term_line_vals_1,
'price_unit': -3550.0,
'price_subtotal': -3550.0,
'price_total': -3550.0,
'credit': 3550.0,
},
], {
**self.move_vals,
'amount_untaxed': 2500.0,
'amount_tax': 1050.0,
'amount_total': 3550.0,
})
def test_out_refund_line_onchange_partner_1(self):
move_form = Form(self.invoice)
move_form.partner_id = self.partner_b
move_form.invoice_payment_ref = 'turlututu'
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'partner_id': self.partner_b.id,
},
{
**self.product_line_vals_2,
'partner_id': self.partner_b.id,
},
{
**self.tax_line_vals_1,
'partner_id': self.partner_b.id,
},
{
**self.tax_line_vals_2,
'partner_id': self.partner_b.id,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'partner_id': self.partner_b.id,
'price_unit': -987.0,
'price_subtotal': -987.0,
'price_total': -987.0,
'credit': 987.0,
'date_maturity': fields.Date.from_string('2019-02-28'),
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'partner_id': self.partner_b.id,
'price_unit': -423.0,
'price_subtotal': -423.0,
'price_total': -423.0,
'credit': 423.0,
},
], {
**self.move_vals,
'partner_id': self.partner_b.id,
'invoice_payment_ref': 'turlututu',
'fiscal_position_id': self.fiscal_pos_a.id,
'invoice_payment_term_id': self.pay_terms_b.id,
'amount_untaxed': 1200.0,
'amount_tax': 210.0,
'amount_total': 1410.0,
})
# Remove lines and recreate them to apply the fiscal position.
move_form = Form(self.invoice)
move_form.invoice_line_ids.remove(0)
move_form.invoice_line_ids.remove(0)
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product_a
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'account_id': self.product_b.property_account_income_id.id,
'partner_id': self.partner_b.id,
'tax_ids': self.tax_sale_b.ids,
},
{
**self.product_line_vals_2,
'partner_id': self.partner_b.id,
'price_total': 230.0,
'tax_ids': self.tax_sale_b.ids,
},
{
**self.tax_line_vals_1,
'name': self.tax_sale_b.name,
'partner_id': self.partner_b.id,
'tax_line_id': self.tax_sale_b.id,
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'account_id': self.partner_b.property_account_receivable_id.id,
'partner_id': self.partner_b.id,
'price_unit': -966.0,
'price_subtotal': -966.0,
'price_total': -966.0,
'credit': 966.0,
'date_maturity': fields.Date.from_string('2019-02-28'),
},
{
**self.term_line_vals_1,
'name': 'turlututu',
'account_id': self.partner_b.property_account_receivable_id.id,
'partner_id': self.partner_b.id,
'price_unit': -414.0,
'price_subtotal': -414.0,
'price_total': -414.0,
'credit': 414.0,
},
], {
**self.move_vals,
'partner_id': self.partner_b.id,
'invoice_payment_ref': 'turlututu',
'fiscal_position_id': self.fiscal_pos_a.id,
'invoice_payment_term_id': self.pay_terms_b.id,
'amount_untaxed': 1200.0,
'amount_tax': 180.0,
'amount_total': 1380.0,
})
def test_out_refund_line_onchange_taxes_1(self):
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.price_unit = 1200
line_form.tax_ids.add(self.tax_armageddon)
move_form.save()
child_tax_1 = self.tax_armageddon.children_tax_ids[0]
child_tax_2 = self.tax_armageddon.children_tax_ids[1]
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 1200.0,
'price_subtotal': 1000.0,
'price_total': 1470.0,
'tax_ids': (self.tax_sale_a + self.tax_armageddon).ids,
'tax_exigible': False,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
{
'name': child_tax_1.name,
'product_id': False,
'account_id': self.company_data['default_account_tax_sale'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 80.0,
'price_subtotal': 80.0,
'price_total': 88.0,
'tax_ids': child_tax_2.ids,
'tax_line_id': child_tax_1.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 80.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
},
{
'name': child_tax_1.name,
'product_id': False,
'account_id': self.company_data['default_account_revenue'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 120.0,
'price_subtotal': 120.0,
'price_total': 132.0,
'tax_ids': child_tax_2.ids,
'tax_line_id': child_tax_1.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 120.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
},
{
'name': child_tax_2.name,
'product_id': False,
'account_id': child_tax_2.cash_basis_transition_account_id.id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 120.0,
'price_subtotal': 120.0,
'price_total': 120.0,
'tax_ids': [],
'tax_line_id': child_tax_2.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 120.0,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': False,
},
{
**self.term_line_vals_1,
'price_unit': -1730.0,
'price_subtotal': -1730.0,
'price_total': -1730.0,
'credit': 1730.0,
},
], {
**self.move_vals,
'amount_untaxed': 1200.0,
'amount_tax': 530.0,
'amount_total': 1730.0,
})
def test_out_refund_line_onchange_cash_rounding_1(self):
move_form = Form(self.invoice)
# Add a cash rounding having 'add_invoice_line'.
move_form.invoice_cash_rounding_id = self.cash_rounding_a
move_form.save()
# The cash rounding does nothing as the total is already rounded.
self.assertInvoiceValues(self.invoice, [
self.product_line_vals_1,
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
line_form.price_unit = 999.99
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
'name': 'add_invoice_line',
'product_id': False,
'account_id': self.cash_rounding_a.account_id.id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': 0.01,
'price_subtotal': 0.01,
'price_total': 0.01,
'tax_ids': [],
'tax_line_id': False,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.01,
'credit': 0.0,
'date_maturity': False,
'tax_exigible': True,
},
{
**self.product_line_vals_1,
'price_unit': 999.99,
'price_subtotal': 999.99,
'price_total': 1149.99,
'debit': 999.99,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
self.term_line_vals_1,
], self.move_vals)
move_form = Form(self.invoice)
# Change the cash rounding to one having 'biggest_tax'.
move_form.invoice_cash_rounding_id = self.cash_rounding_b
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'price_unit': 999.99,
'price_subtotal': 999.99,
'price_total': 1149.99,
'debit': 999.99,
},
self.product_line_vals_2,
self.tax_line_vals_1,
self.tax_line_vals_2,
{
'name': '%s (rounding)' % self.tax_sale_a.name,
'product_id': False,
'account_id': self.company_data['default_account_tax_sale'].id,
'partner_id': self.partner_a.id,
'product_uom_id': False,
'quantity': 1.0,
'discount': 0.0,
'price_unit': -0.04,
'price_subtotal': -0.04,
'price_total': -0.04,
'tax_ids': [],
'tax_line_id': self.tax_sale_a.id,
'currency_id': False,
'amount_currency': 0.0,
'debit': 0.0,
'credit': 0.04,
'date_maturity': False,
'tax_exigible': True,
},
{
**self.term_line_vals_1,
'price_unit': -1409.95,
'price_subtotal': -1409.95,
'price_total': -1409.95,
'credit': 1409.95,
},
], {
**self.move_vals,
'amount_untaxed': 1199.99,
'amount_tax': 209.96,
'amount_total': 1409.95,
})
def test_out_refund_line_onchange_currency_1(self):
# New journal having a foreign currency set.
journal = self.company_data['default_journal_sale'].copy()
journal.currency_id = self.currency_data['currency']
move_form = Form(self.invoice)
move_form.journal_id = journal
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 1000.0,
'debit': 500.0,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 200.0,
'debit': 100.0,
},
{
**self.tax_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 180.0,
'debit': 90.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 30.0,
'debit': 15.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -1410.0,
'credit': 705.0,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
})
move_form = Form(self.invoice)
# Change the date to get another rate: 1/3 instead of 1/2.
move_form.date = fields.Date.from_string('2016-01-01')
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 1000.0,
'debit': 333.33,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 200.0,
'debit': 66.67,
},
{
**self.tax_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': 180.0,
'debit': 60.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 30.0,
'debit': 10.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'amount_currency': -1410.0,
'credit': 470.0,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
})
move_form = Form(self.invoice)
with move_form.invoice_line_ids.edit(0) as line_form:
# 0.045 * 0.1 = 0.0045. As the foreign currency has a 0.001 rounding,
# the result should be 0.005 after rounding.
line_form.quantity = 0.1
line_form.price_unit = 0.045
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 0.1,
'price_unit': 0.05,
'price_subtotal': 0.005,
'price_total': 0.006,
'currency_id': journal.currency_id.id,
'amount_currency': 0.005,
'debit': 0.0,
},
{
**self.product_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 200.0,
'debit': 66.67,
},
{
**self.tax_line_vals_1,
'price_unit': 30.0,
'price_subtotal': 30.001,
'price_total': 30.001,
'currency_id': journal.currency_id.id,
'amount_currency': 30.001,
'debit': 10.0,
},
{
**self.tax_line_vals_2,
'currency_id': journal.currency_id.id,
'amount_currency': 30.0,
'debit': 10.0,
},
{
**self.term_line_vals_1,
'currency_id': journal.currency_id.id,
'price_unit': -260.01,
'price_subtotal': -260.006,
'price_total': -260.006,
'amount_currency': -260.006,
'credit': 86.67,
},
], {
**self.move_vals,
'currency_id': journal.currency_id.id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
'amount_untaxed': 200.005,
'amount_tax': 60.001,
'amount_total': 260.006,
})
move_form = Form(self.invoice)
move_form.currency_id = self.company_data['currency']
move_form.save()
self.assertInvoiceValues(self.invoice, [
{
**self.product_line_vals_1,
'quantity': 0.1,
'price_unit': 0.1,
'price_subtotal': 0.01,
'price_total': 0.01,
'debit': 0.01,
},
self.product_line_vals_2,
{
**self.tax_line_vals_1,
'price_unit': 30.0,
'price_subtotal': 30.0,
'price_total': 30.0,
'debit': 30.0,
},
self.tax_line_vals_2,
{
**self.term_line_vals_1,
'price_unit': -260.01,
'price_subtotal': -260.01,
'price_total': -260.01,
'credit': 260.01,
},
], {
**self.move_vals,
'currency_id': self.company_data['currency'].id,
'journal_id': journal.id,
'date': fields.Date.from_string('2016-01-01'),
'amount_untaxed': 200.01,
'amount_tax': 60.0,
'amount_total': 260.01,
})
def test_out_refund_line_onchange_sequence_number_1(self):
self.assertRecordValues(self.invoice, [{
'invoice_sequence_number_next': '0001',
'invoice_sequence_number_next_prefix': 'INV/2019/',
}])
move_form = Form(self.invoice)
move_form.invoice_sequence_number_next = '0042'
move_form.save()
self.assertRecordValues(self.invoice, [{
'invoice_sequence_number_next': '0042',
'invoice_sequence_number_next_prefix': 'INV/2019/',
}])
self.invoice.post()
self.assertRecordValues(self.invoice, [{'name': 'INV/2019/0042'}])
invoice_copy = self.invoice.copy()
invoice_copy.post()
self.assertRecordValues(invoice_copy, [{'name': 'INV/2019/0043'}])
def test_out_refund_create_1(self):
# Test creating an account_move with the least information.
move = self.env['account.move'].create({
'type': 'out_refund',
'partner_id': self.partner_a.id,
'invoice_date': fields.Date.from_string('2019-01-01'),
'currency_id': self.currency_data['currency'].id,
'invoice_payment_term_id': self.pay_terms_a.id,
'invoice_line_ids': [
(0, None, self.product_line_vals_1),
(0, None, self.product_line_vals_2),
]
})
self.assertInvoiceValues(move, [
{
**self.product_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 1000.0,
'debit': 500.0,
},
{
**self.product_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 200.0,
'debit': 100.0,
},
{
**self.tax_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 180.0,
'debit': 90.0,
},
{
**self.tax_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 30.0,
'debit': 15.0,
},
{
**self.term_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -1410.0,
'credit': 705.0,
},
], {
**self.move_vals,
'currency_id': self.currency_data['currency'].id,
})
def test_out_refund_write_1(self):
# Test creating an account_move with the least information.
move = self.env['account.move'].create({
'type': 'out_refund',
'partner_id': self.partner_a.id,
'invoice_date': fields.Date.from_string('2019-01-01'),
'currency_id': self.currency_data['currency'].id,
'invoice_payment_term_id': self.pay_terms_a.id,
'invoice_line_ids': [
(0, None, self.product_line_vals_1),
]
})
move.write({
'invoice_line_ids': [
(0, None, self.product_line_vals_2),
]
})
self.assertInvoiceValues(move, [
{
**self.product_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 1000.0,
'debit': 500.0,
},
{
**self.product_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 200.0,
'debit': 100.0,
},
{
**self.tax_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 180.0,
'debit': 90.0,
},
{
**self.tax_line_vals_2,
'currency_id': self.currency_data['currency'].id,
'amount_currency': 30.0,
'debit': 15.0,
},
{
**self.term_line_vals_1,
'currency_id': self.currency_data['currency'].id,
'amount_currency': -1410.0,
'credit': 705.0,
},
], {
**self.move_vals,
'currency_id': self.currency_data['currency'].id,
})
@@ -1,116 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.exceptions import ValidationError, UserError
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
from calendar import monthrange
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestTaxBlockDate(AccountingTestCase):
"""
Forbid creation, edition and deletion of Journal Items related to taxes with
a date prior to the Tax Block Date.
"""
def setUp(self):
super(TestTaxBlockDate, self).setUp()
self.user_id = self.env.user
company_id = self.user_id.company_id.id
last_day_month = datetime.now()
last_day_month = last_day_month.replace(day=monthrange(last_day_month.year, last_day_month.month)[1])
self.last_day_month_str = last_day_month.strftime(DEFAULT_SERVER_DATE_FORMAT)
first_day_month = datetime.now()
first_day_month = first_day_month.replace(day=1)
self.first_day_month_str = first_day_month.strftime(DEFAULT_SERVER_DATE_FORMAT)
middle_day_month = datetime.now()
middle_day_month = middle_day_month.replace(day=15)
self.middle_day_month_str = middle_day_month.strftime(DEFAULT_SERVER_DATE_FORMAT)
self.sale_journal_id = self.env['account.journal'].search([('type', '=', 'sale'), ('company_id', '=', company_id)], limit=1)[0]
self.account_id = self.env['account.account'].search([('internal_type', '=', 'receivable'), ('company_id', '=', company_id)], limit=1)[0]
self.other_account_id = self.env['account.account'].search([('internal_type', '!=', 'receivable'), ('company_id', '=', company_id)], limit=1)[0]
self.tax_id = self.env['account.tax'].search([('company_id', '=', company_id)], limit=1)[0]
self.move = {
'name': '/',
'journal_id': self.sale_journal_id.id,
'date': self.middle_day_month_str,
'line_ids': [(0, 0, {
'name': 'foo',
'debit': 10,
'account_id': self.account_id.id,
'tax_ids': [(6, False, [self.tax_id.id])]
}), (0, 0, {
'name': 'bar',
'credit': 10,
'account_id': self.account_id.id,
})]
}
def test_create_before_block_date(self):
"""
Checks that you cannot create an account.move with a date before the tax
lock date
"""
self.user_id.company_id.tax_lock_date = self.last_day_month_str
with self.assertRaises(ValidationError):
move = self.env['account.move'].create(self.move)
move.post()
def test_change_after_block_date(self):
"""
Checks that you can change an account.move with a date after the tax
lock date
"""
self.user_id.company_id.tax_lock_date = self.first_day_month_str
move = self.env['account.move'].create(self.move)
move.line_ids[0].write({'account_id': self.other_account_id.id})
move.line_ids[1].write({'account_id': self.other_account_id.id})
move.line_ids[1].write({'debit': 11})
move.line_ids[0].write({'credit': 11})
move.post()
move.line_ids[1].write({'tax_ids': [(5, False, False)]})
def test_change_before_block_date(self):
"""
Checks that you cannot change an account.move with a date before the tax
lock date
"""
self.user_id.company_id.tax_lock_date = self.first_day_month_str
move = self.env['account.move'].create(self.move)
self.user_id.company_id.tax_lock_date = self.last_day_month_str
move.line_ids[0].write({'account_id': self.other_account_id.id})
move.line_ids[1].write({'account_id': self.other_account_id.id})
with self.assertRaises(ValidationError):
with self.cr.savepoint():
move.line_ids[1].write({'debit': 11})
with self.assertRaises(ValidationError):
with self.cr.savepoint():
move.line_ids[1].write({'date': self.last_day_month_str, 'tax_ids': [(5, False, False)]})
move.line_ids[0].write({'credit': 10})
move.post()
def test_unlink_before_block_date(self):
"""
Checks that you cannot unlink an account.move with a date before the tax
lock date
"""
self.user_id.company_id.tax_lock_date = self.first_day_month_str
move = self.env['account.move'].create(self.move)
move.post()
self.user_id.company_id.tax_lock_date = self.last_day_month_str
with self.assertRaises(ValidationError):
move.unlink()
def test_unlink_after_block_date(self):
"""
Checks that you can unlink an account.move with a date after the lock
date
"""
self.user_id.company_id.tax_lock_date = self.first_day_month_str
move = self.env['account.move'].create(self.move)
move.post()
move.unlink()
@@ -1,194 +0,0 @@
# -*- coding: utf-8 -*-
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tests import tagged
from odoo.tests.common import Form
@tagged('post_install', '-at_install')
class TestAccountMoveTaxesEdition(AccountingTestCase):
def setUp(self):
super(AccountingTestCase, self).setUp()
self.percent_tax = self.env['account.tax'].create({
'name': 'tax_line',
'amount_type': 'percent',
'amount': 10,
})
self.journal = self.env['account.journal'].search([], limit=1)
self.account = self.env['account.account'].search([
('deprecated', '=', False), ('company_id', '=', self.journal.company_id.id)
], limit=1)
def test_onchange_taxes_1(self):
'''
Test an account.move.line is created automatically when adding a tax.
This test uses the following scenario:
- Create manually a debit line of 1000 having a tax.
- Assume a line containing the tax amount is created automatically.
- Create manually a credit line to balance the two previous lines.
- Save the move.
tax = 10%
Name | Debit | Credit | Tax_ids | Tax_line_id's name
----------------|-----------|-----------|---------------|-------------------
debit_line_1 | 1000 | | tax |
tax_line | 100 | | | tax_line
debit_line_1 | | 1100 | |
'''
move_form = Form(self.env['account.move'], view='account.view_move_form')
move_form.ref = 'azerty'
move_form.journal_id = self.journal
# Create a new account.move.line with debit amount.
with move_form.line_ids.new() as debit_line:
debit_line.name = 'debit_line_1'
debit_line.account_id = self.account
debit_line.debit = 1000
debit_line.tax_ids.clear()
debit_line.tax_ids.add(self.percent_tax)
self.assertTrue(debit_line.recompute_tax_line)
# Create a third account.move.line with credit amount.
with move_form.line_ids.new() as credit_line:
credit_line.name = 'credit_line_1'
credit_line.account_id = self.account
credit_line.credit = 1100
move = move_form.save()
self.assertRecordValues(move.line_ids, [
{'name': 'credit_line_1', 'debit': 0.0, 'credit': 1100.0, 'tax_ids': [], 'tax_line_id': False},
{'name': 'tax_line', 'debit': 100.0, 'credit': 0.0, 'tax_ids': [], 'tax_line_id': self.percent_tax.id},
{'name': 'debit_line_1', 'debit': 1000.0, 'credit': 0.0, 'tax_ids': [self.percent_tax.id], 'tax_line_id': False},
])
def test_onchange_taxes_2(self):
'''
Test the amount of tax account.move.line is adapted when editing the account.move.line amount.
This test uses the following scenario:
- Create manually a debit line of 1000 having a tax.
- Assume a line containing the tax amount is created automatically.
- Set the debit amount to 2000 in the first created line.
- Assume the line containing the tax amount has been updated automatically.
- Create manually a credit line to balance the two previous lines.
- Save the move.
tax = 10%
Name | Debit | Credit | Tax_ids | Tax_line_id's name
----------------|-----------|-----------|---------------|-------------------
debit_line_1 | 2000 | | tax |
tax_line | 200 | | | tax_line
debit_line_1 | | 2200 | |
'''
move_form = Form(self.env['account.move'], view='account.view_move_form')
move_form.ref = 'azerty'
move_form.journal_id = self.journal
# Create a new account.move.line with debit amount.
with move_form.line_ids.new() as debit_line:
debit_line.name = 'debit_line_1'
debit_line.account_id = self.account
debit_line.debit = 1000
debit_line.tax_ids.clear()
debit_line.tax_ids.add(self.percent_tax)
self.assertTrue(debit_line.recompute_tax_line)
debit_line.debit = 2000
self.assertTrue(debit_line.recompute_tax_line)
# Create a third account.move.line with credit amount.
with move_form.line_ids.new() as credit_line:
credit_line.name = 'credit_line_1'
credit_line.account_id = self.account
credit_line.credit = 2200
move = move_form.save()
self.assertRecordValues(move.line_ids, [
{'name': 'credit_line_1', 'debit': 0.0, 'credit': 2200.0, 'tax_ids': [], 'tax_line_id': False},
{'name': 'tax_line', 'debit': 200.0, 'credit': 0.0, 'tax_ids': [], 'tax_line_id': self.percent_tax.id},
{'name': 'debit_line_1', 'debit': 2000.0, 'credit': 0.0, 'tax_ids': [self.percent_tax.id], 'tax_line_id': False},
])
def test_onchange_taxes_3(self):
'''
Test the amount of tax account.move.line is still editable manually.
Test the amount of tax account.move.line is cumulative for the same tax.
This test uses the following scenario:
- Create manually a debit line of 1000 having a tax.
- Assume a line containing the tax amount is created automatically.
- Edit the tax line amount of the auto-generated line by adding 5.
- Create manually a credit line to balance the two previous lines.
- Save the move.
- Edit the move.
- Create manually a debit line of 2000 having the same tax.
- Assume the line containing the tax amount has been updated (no new line created).
- Create manually a credit line to balance the four previous lines.
- Save the move.
tax = 10%
Name | Debit | Credit | Tax_ids | Tax_line_id's name
----------------|-----------|-----------|---------------|-------------------
debit_line_1 | 1000 | | tax |
tax_line | 300 | | | tax_line
credit_line_1 | | 1105 | |
debit_line_2 | 2000 | | tax |
credit_line_2 | | 2195 | |
'''
move_form = Form(self.env['account.move'], view='account.view_move_form')
move_form.ref = 'azerty'
move_form.journal_id = self.journal
# Create a new account.move.line with debit amount.
with move_form.line_ids.new() as debit_line:
debit_line.name = 'debit_line_1'
debit_line.account_id = self.account
debit_line.debit = 1000
debit_line.tax_ids.clear()
debit_line.tax_ids.add(self.percent_tax)
self.assertTrue(debit_line.recompute_tax_line)
# Edit the tax account.move.line
with move_form.line_ids.edit(index=1) as tax_line:
tax_line.debit = 105 # Was 100
# Create a third account.move.line with credit amount.
with move_form.line_ids.new() as credit_line:
credit_line.name = 'credit_line_1'
credit_line.account_id = self.account
credit_line.credit = 1105
move = move_form.save()
move_form = Form(move, view='account.view_move_form')
# Create a new account.move.line with debit amount.
with move_form.line_ids.new() as debit_line2:
debit_line2.name = 'debit_line_2'
debit_line2.account_id = self.account
debit_line2.debit = 2000
debit_line2.tax_ids.clear()
debit_line2.tax_ids.add(self.percent_tax)
self.assertTrue(debit_line2.recompute_tax_line)
with move_form.line_ids.new() as credit_line2:
credit_line2.name = 'credit_line_2'
credit_line2.account_id = self.account
credit_line2.credit = 2195
move = move_form.save()
self.assertRecordValues(move.line_ids, [
{'name': 'credit_line_2', 'debit': 0.0, 'credit': 2195.0, 'tax_ids': [], 'tax_line_id': False},
{'name': 'debit_line_2', 'debit': 2000.0, 'credit': 0.0, 'tax_ids': [self.percent_tax.id], 'tax_line_id': False},
{'name': 'credit_line_1', 'debit': 0.0, 'credit': 1105.0, 'tax_ids': [], 'tax_line_id': False},
{'name': 'tax_line', 'debit': 300.0, 'credit': 0.0, 'tax_ids': [], 'tax_line_id': self.percent_tax.id},
{'name': 'debit_line_1', 'debit': 1000.0, 'credit': 0.0, 'tax_ids': [self.percent_tax.id], 'tax_line_id': False},
])
@@ -1,145 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tests import tagged
from odoo.exceptions import Warning
@tagged('post_install', '-at_install')
class TestAccountSupplierInvoice(AccountingTestCase):
def test_supplier_invoice(self):
tax = self.env['account.tax'].create({
'name': 'Tax 10.0',
'amount': 10.0,
'amount_type': 'fixed',
})
analytic_account = self.env['account.analytic.account'].create({
'name': 'test account',
})
# Should be changed by automatic on_change later
invoice_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1).id
invoice_line_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_expenses').id)], limit=1).id
invoice = self.env['account.invoice'].create({'partner_id': self.env.ref('base.res_partner_2').id,
'account_id': invoice_account,
'type': 'in_invoice',
})
self.assertEquals(invoice.journal_id.type, 'purchase')
self.env['account.invoice.line'].create({'product_id': self.env.ref('product.product_product_4').id,
'quantity': 1.0,
'price_unit': 100.0,
'invoice_id': invoice.id,
'name': 'product that cost 100',
'account_id': invoice_line_account,
'invoice_line_tax_ids': [(6, 0, [tax.id])],
'account_analytic_id': analytic_account.id,
})
# check that Initially supplier bill state is "Draft"
self.assertTrue((invoice.state == 'draft'), "Initially vendor bill state is Draft")
#change the state of invoice to open by clicking Validate button
invoice.action_invoice_open()
#I cancel the account move which is in posted state and verifies that it gives warning message
with self.assertRaises(Warning):
invoice.move_id.button_cancel()
def test_supplier_invoice2(self):
tax_fixed = self.env['account.tax'].create({
'sequence': 10,
'name': 'Tax 10.0 (Fixed)',
'amount': 10.0,
'amount_type': 'fixed',
'include_base_amount': True,
})
tax_percent_included_base_incl = self.env['account.tax'].create({
'sequence': 20,
'name': 'Tax 50.0% (Percentage of Price Tax Included)',
'amount': 50.0,
'amount_type': 'division',
'include_base_amount': True,
})
tax_percentage = self.env['account.tax'].create({
'sequence': 30,
'name': 'Tax 20.0% (Percentage of Price)',
'amount': 20.0,
'amount_type': 'percent',
'include_base_amount': False,
})
analytic_account = self.env['account.analytic.account'].create({
'name': 'test account',
})
# Should be changed by automatic on_change later
invoice_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1).id
invoice_line_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_expenses').id)], limit=1).id
invoice = self.env['account.invoice'].create({'partner_id': self.env.ref('base.res_partner_2').id,
'account_id': invoice_account,
'type': 'in_invoice',
})
self.assertEquals(invoice.journal_id.type, 'purchase')
invoice_line = self.env['account.invoice.line'].create({'product_id': self.env.ref('product.product_product_4').id,
'quantity': 5.0,
'price_unit': 100.0,
'invoice_id': invoice.id,
'name': 'product that cost 100',
'account_id': invoice_line_account,
'invoice_line_tax_ids': [(6, 0, [tax_fixed.id, tax_percent_included_base_incl.id, tax_percentage.id])],
'account_analytic_id': analytic_account.id,
})
invoice.compute_taxes()
# check that Initially supplier bill state is "Draft"
self.assertTrue((invoice.state == 'draft'), "Initially vendor bill state is Draft")
#change the state of invoice to open by clicking Validate button
invoice.action_invoice_open()
# Check if amount and corresponded base is correct for all tax scenarios given on a computational base
# Keep in mind that tax amount can be changed by the user at any time before validating (based on the invoice and tax laws applicable)
invoice_tax = invoice.tax_line_ids.sorted(key=lambda r: r.sequence)
self.assertEquals(invoice_tax.mapped('amount'), [50.0, 550.0, 220.0])
self.assertEquals(invoice_tax.mapped('base'), [500.0, 550.0, 1100.0])
#I cancel the account move which is in posted state and verifies that it gives warning message
with self.assertRaises(Warning):
invoice.move_id.button_cancel()
def test_vendor_bill_refund(self):
invoice_account = self.env['account.account'].search(
[('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1)
invoice_line_account = self.env['account.account'].search(
[('user_type_id', '=', self.env.ref('account.data_account_type_expenses').id)], limit=1)
if self.env.ref('base.main_partner').bank_account_count > 0:
bank = self.env['res.partner.bank'].search([('partner_id', '=', self.env.ref('base.main_partner').id)], limit=1)
else:
bank = self.env['res.partner.bank'].create({
'acc_number': '12345678910',
'partner_id': self.env.ref('base.main_partner').id,
})
invoice_id = self.env['account.invoice'].create({
'name': 'invoice test refund',
'partner_id': self.env.ref("base.res_partner_2").id,
'account_id': invoice_account.id,
'currency_id': self.env.ref('base.USD').id,
'type': 'in_invoice',
})
self.env['account.invoice.line'].create({
'product_id': self.env.ref("product.product_product_4").id,
'quantity': 1,
'price_unit': 15.0,
'invoice_id': invoice_id.id,
'name': 'something',
'account_id': invoice_line_account.id,
})
refund_invoices = invoice_id.refund()
self.assertEqual(refund_invoices.partner_bank_id, bank)
@@ -1,44 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestAccountValidateAccount(AccountingTestCase):
def test_account_validate_account(self):
account_move_line = self.env['account.move.line']
account_cash = self.env['account.account'].search([('user_type_id.type', '=', 'liquidity')], limit=1)
journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
company_id = self.env['res.users'].browse(self.env.uid).company_id.id
# create move
move = self.env['account.move'].create({'name': '/',
'ref':'2011010',
'journal_id': journal.id,
'state':'draft',
'company_id': company_id,
})
# create move line
account_move_line.create({'account_id': account_cash.id,
'name': 'Four Person Desk',
'move_id': move.id,
})
# create another move line
account_move_line.create({'account_id': account_cash.id,
'name': 'Four Person Desk',
'move_id': move.id,
})
# check that Initially account move state is "Draft"
self.assertTrue((move.state == 'draft'), "Initially account move state is Draft")
# validate this account move by using the 'Post Journal Entries' wizard
validate_account_move = self.env['validate.account.move'].with_context(active_ids=move.id).create({})
#click on validate Button
validate_account_move.with_context({'active_ids': [move.id]}).validate_move()
#check that the move state is now "Posted"
self.assertTrue((move.state == 'posted'), "Initially account move state is Posted")
@@ -7,8 +7,6 @@ class TestBankStatementReconciliation(AccountingTestCase):
def setUp(self):
super(TestBankStatementReconciliation, self).setUp()
self.i_model = self.env['account.invoice']
self.il_model = self.env['account.invoice.line']
self.bs_model = self.env['account.bank.statement']
self.bsl_model = self.env['account.bank.statement.line']
self.reconciliation_widget = self.env['account.reconciliation.widget']
@@ -62,40 +60,24 @@ class TestBankStatementReconciliation(AccountingTestCase):
self.assertTrue(rcv_mv_line.reconciled)
self.assertTrue(counterpart_mv_line.reconciled)
self.assertEqual(counterpart_mv_line.matched_credit_ids, rcv_mv_line.matched_debit_ids)
self.assertEqual(rcv_mv_line.invoice_id.state, 'paid', "The related invoice's state should now be 'paid'")
self.assertEqual(rcv_mv_line.move_id.invoice_payment_state, 'paid', "The related invoice's state should now be 'paid'")
def test_reconcile_with_write_off(self):
pass
def create_invoice(self, amount):
""" Return the move line that gets to be reconciled (the one in the receivable account) """
vals = {'partner_id': self.partner.id,
'type': 'out_invoice',
'name': '-',
'currency_id': self.env.company.currency_id.id,
}
# new creates a temporary record to apply the on_change afterwards
invoice = self.i_model.new(vals)
invoice._onchange_partner_id()
vals.update({'account_id': invoice.account_id.id})
invoice = self.i_model.create(vals)
self.il_model.create({
'quantity': 1,
'price_unit': amount,
'invoice_id': invoice.id,
'name': '.',
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
move = self.env['account.move'].create({
'type': 'out_invoice',
'partner_id': self.partner.id,
'invoice_line_ids': [(0, 0, {
'quantity': 1,
'price_unit': amount,
'name': 'test invoice',
})],
})
invoice.action_invoice_open()
mv_line = None
for l in invoice.move_id.line_ids:
if l.account_id.id == vals['account_id']:
mv_line = l
self.assertIsNotNone(mv_line)
return mv_line
move.post()
return move.line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable'))
def create_statement_line(self, st_line_amount):
journal = self.bs_model.with_context(journal_type='bank')._default_journal()
@@ -1,33 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tests import tagged
from odoo.tests.common import Form
@tagged('post_install', '-at_install')
class TestInvoiceOnchange(AccountingTestCase):
def setUp(self):
super(TestInvoiceOnchange, self).setUp()
self.invoice_line_onchange = self.env['account.invoice.line']._onchange_spec()
self.half_currency = self.env['res.currency'].create({
'name': 'HALF', 'symbol': '$HALF',
'rate_ids': [(0, 0, {'name': '1980-01-01', 'rate': 2})],
})
self.apples_product = self.env['product.product'].create(dict(
self.env['product.product'].default_get(self.env['product.product']._fields),
lst_price=10, name='apples',
))
def test_invoice_currency_onchange(self):
self_ctx = self.env['account.invoice'].with_context(type='out_invoice')
with Form(self_ctx, view='account.invoice_form') as invoice_form:
invoice_form.partner_id = self.env.user.partner_id
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.product_id = self.apples_product
# Check onchange keep price_unit if currency not changed
self.assertEqual(invoice_line_form.price_unit, 10)
invoice_form.currency_id = self.half_currency
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.product_id = self.apples_product
# Check onchange gives converted price with custom currency
self.assertEqual(invoice_line_form.price_unit, 20)
+32 -37
View File
@@ -46,21 +46,18 @@ class TestInvoiceTaxes(AccountingTestCase):
:param taxes_per_line: A list of tuple (price_unit, account.tax recordset)
'''
self_ctx = self.env['account.invoice'].with_context(type=inv_type)
journal_id = self_ctx._default_journal().id
self_ctx = self_ctx.with_context(journal_id=journal_id)
self_ctx = self.env['account.move'].with_context(default_type=inv_type)
invoice_form = Form(self_ctx)
invoice_form.partner_id = self.env.ref('base.partner_demo')
with Form(self_ctx, view=(inv_type in ('out_invoice', 'out_refund') and 'account.invoice_form' or 'invoice_supplier_form')) as invoice_form:
invoice_form.partner_id = self.env.ref('base.partner_demo')
for amount, taxes in taxes_per_line:
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.name = 'xxxx'
invoice_line_form.quantity = 1
invoice_line_form.price_unit = amount
invoice_line_form.invoice_line_tax_ids.clear()
for tax in taxes:
invoice_line_form.invoice_line_tax_ids.add(tax)
for amount, taxes in taxes_per_line:
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.name = 'xxxx'
invoice_line_form.quantity = 1
invoice_line_form.price_unit = amount
invoice_line_form.tax_ids.clear()
for tax in taxes:
invoice_line_form.tax_ids.add(tax)
return invoice_form.save()
def test_one_tax_per_line(self):
@@ -83,11 +80,11 @@ class TestInvoiceTaxes(AccountingTestCase):
(121, self.percent_tax_1_incl),
(100, self.percent_tax_2),
])
invoice.action_invoice_open()
self.assertRecordValues(invoice.tax_line_ids, [
{'name': self.percent_tax_1.name, 'base': 100, 'amount': 21, 'tax_ids': []},
{'name': self.percent_tax_1_incl.name, 'base': 100, 'amount': 21, 'tax_ids': []},
{'name': self.percent_tax_2.name, 'base': 100, 'amount': 12, 'tax_ids': []},
invoice.post()
self.assertRecordValues(invoice.line_ids.filtered('tax_line_id'), [
{'name': self.percent_tax_1.name, 'tax_base_amount': 100, 'price_unit': 21, 'tax_ids': []},
{'name': self.percent_tax_1_incl.name, 'tax_base_amount': 100, 'price_unit': 21, 'tax_ids': []},
{'name': self.percent_tax_2.name, 'tax_base_amount': 100, 'price_unit': 12, 'tax_ids': []},
])
def test_affecting_base_amount(self):
@@ -108,10 +105,10 @@ class TestInvoiceTaxes(AccountingTestCase):
(121, self.percent_tax_1_incl + self.percent_tax_2),
(100, self.percent_tax_2),
])
invoice.action_invoice_open()
self.assertRecordValues(invoice.tax_line_ids.sorted(lambda x: x.amount), [
{'name': self.percent_tax_1_incl.name, 'base': 100, 'amount': 21, 'tax_ids': [self.percent_tax_2.id]},
{'name': self.percent_tax_2.name, 'base': 221, 'amount': 26.52, 'tax_ids': []},
invoice.post()
self.assertRecordValues(invoice.line_ids.filtered('tax_line_id').sorted(lambda x: x.price_unit), [
{'name': self.percent_tax_1_incl.name, 'tax_base_amount': 100, 'price_unit': 21, 'tax_ids': [self.percent_tax_2.id]},
{'name': self.percent_tax_2.name, 'tax_base_amount': 221, 'price_unit': 26.52, 'tax_ids': []},
])
def test_group_of_taxes(self):
@@ -132,10 +129,10 @@ class TestInvoiceTaxes(AccountingTestCase):
(121, self.group_tax),
(100, self.percent_tax_2),
])
invoice.action_invoice_open()
self.assertRecordValues(invoice.tax_line_ids.sorted(lambda x: x.amount), [
{'name': self.percent_tax_1_incl.name, 'base': 100, 'amount': 21, 'tax_ids': [self.percent_tax_2.id]},
{'name': self.percent_tax_2.name, 'base': 221, 'amount': 26.52, 'tax_ids': []},
invoice.post()
self.assertRecordValues(invoice.line_ids.filtered('tax_line_id').sorted(lambda x: x.price_unit), [
{'name': self.percent_tax_1_incl.name, 'tax_base_amount': 100, 'price_unit': 21, 'tax_ids': [self.percent_tax_2.id]},
{'name': self.percent_tax_2.name, 'tax_base_amount': 221, 'price_unit': 26.52, 'tax_ids': []},
])
def _create_tax_tag(self, tag_name):
@@ -205,15 +202,14 @@ class TestInvoiceTaxes(AccountingTestCase):
# Test invoice repartition
invoice = self._create_invoice([(100, tax)], inv_type='out_invoice')
invoice.action_invoice_open()
invoice_move = invoice.move_id
invoice.post()
self.assertEqual(len(invoice_move.line_ids), 4, "There should be 4 account move lines created for the invoice: payable, base and 2 tax lines")
inv_base_line = invoice_move.line_ids.filtered(lambda x: not x.tax_repartition_line_id and x.account_id.user_type_id.type != 'receivable')
self.assertEqual(len(invoice.line_ids), 4, "There should be 4 account move lines created for the invoice: payable, base and 2 tax lines")
inv_base_line = invoice.line_ids.filtered(lambda x: not x.tax_repartition_line_id and x.account_id.user_type_id.type != 'receivable')
self.assertEqual(len(inv_base_line), 1, "There should be only one base line generated")
self.assertEqual(abs(inv_base_line.balance), 100, "Base amount should be 100")
self.assertEqual(inv_base_line.tag_ids, inv_base_tag, "Base line should have received base tag")
inv_tax_lines = invoice_move.line_ids.filtered(lambda x: x.tax_repartition_line_id.repartition_type == 'tax')
inv_tax_lines = invoice.line_ids.filtered(lambda x: x.tax_repartition_line_id.repartition_type == 'tax')
self.assertEqual(len(inv_tax_lines), 2, "There should be two tax lines, one for each repartition line.")
self.assertEqual(abs(inv_tax_lines.filtered(lambda x: x.account_id == account_1).balance), 4.2, "Tax line on account 1 should amount to 4.2 (10% of 42)")
self.assertEqual(inv_tax_lines.filtered(lambda x: x.account_id == account_1).tag_ids, inv_tax_tag_10, "Tax line on account 1 should have 10% tag")
@@ -222,15 +218,14 @@ class TestInvoiceTaxes(AccountingTestCase):
# Test refund repartition
refund = self._create_invoice([(100, tax)], inv_type='out_refund')
refund.action_invoice_open()
refund_move = refund.move_id
refund.post()
self.assertEqual(len(refund_move.line_ids), 4, "There should be 4 account move lines created for the refund: payable, base and 2 tax lines")
ref_base_line = refund_move.line_ids.filtered(lambda x: not x.tax_repartition_line_id and x.account_id.user_type_id.type != 'receivable')
self.assertEqual(len(refund.line_ids), 4, "There should be 4 account move lines created for the refund: payable, base and 2 tax lines")
ref_base_line = refund.line_ids.filtered(lambda x: not x.tax_repartition_line_id and x.account_id.user_type_id.type != 'receivable')
self.assertEqual(len(ref_base_line), 1, "There should be only one base line generated")
self.assertEqual(abs(ref_base_line.balance), 100, "Base amount should be 100")
self.assertEqual(ref_base_line.tag_ids, ref_base_tag, "Base line should have received base tag")
ref_tax_lines = refund_move.line_ids.filtered(lambda x: x.tax_repartition_line_id.repartition_type == 'tax')
ref_tax_lines = refund.line_ids.filtered(lambda x: x.tax_repartition_line_id.repartition_type == 'tax')
self.assertEqual(len(ref_tax_lines), 2, "There should be two refund tax lines")
self.assertEqual(abs(ref_tax_lines.filtered(lambda x: x.account_id == ref_base_line.account_id).balance), 4.2, "Refund tax line on base account should amount to 4.2 (10% of 42)")
self.assertEqual(abs(ref_tax_lines.filtered(lambda x: x.account_id == account_1).balance), 37.8, "Refund tax line on account 1 should amount to 37.8 (90% of 42)")
+73 -153
View File
@@ -9,10 +9,8 @@ class TestPayment(AccountingTestCase):
def setUp(self):
super(TestPayment, self).setUp()
self.register_payments_model = self.env['account.payment.register'].with_context(active_model='account.invoice')
self.register_payments_model = self.env['account.payment.register'].with_context(active_model='account.move')
self.payment_model = self.env['account.payment']
self.invoice_model = self.env['account.invoice']
self.invoice_line_model = self.env['account.invoice.line']
self.acc_bank_stmt_model = self.env['account.bank.statement']
self.acc_bank_stmt_line_model = self.env['account.bank.statement.line']
@@ -46,23 +44,17 @@ class TestPayment(AccountingTestCase):
def create_invoice(self, amount=100, type='out_invoice', currency_id=None, partner=None, account_id=None):
""" Returns an open invoice """
invoice = self.invoice_model.create({
invoice = self.env['account.move'].create({
'type': type,
'partner_id': partner or self.partner_agrolait.id,
'currency_id': currency_id or self.currency_eur_id,
'name': type,
'account_id': account_id or self.account_receivable.id,
'type': type,
'date_invoice': time.strftime('%Y') + '-06-26',
'invoice_date': time.strftime('%Y') + '-06-26',
'date': time.strftime('%Y') + '-06-26',
'invoice_line_ids': [
(0, 0, {'product_id': self.product.id, 'quantity': 1, 'price_unit': amount})
],
})
self.invoice_line_model.create({
'product_id': self.product.id,
'quantity': 1,
'price_unit': amount,
'invoice_id': invoice.id,
'name': 'something',
'account_id': self.account_revenue.id,
})
invoice.action_invoice_open()
invoice.post()
return invoice
def reconcile(self, liquidity_aml, amount=0.0, amount_currency=0.0, currency_id=None):
@@ -94,21 +86,21 @@ class TestPayment(AccountingTestCase):
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
})
register_payments.create_payments()
payment = self.payment_model.search([], order="id desc", limit=1)
payment = self.payment_model.browse(register_payments.create_payments()['res_id'])
self.assertAlmostEquals(payment.amount, 300)
self.assertEqual(payment.state, 'posted')
self.assertEqual(payment.state, 'posted')
self.assertEqual(inv_1.state, 'paid')
self.assertEqual(inv_1.invoice_payment_state, 'paid')
self.assertRecordValues(payment.move_line_ids, [
rec_line = payment.move_line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable'))
self.assertRecordValues(payment.move_line_ids.sorted('credit'), [
{'account_id': self.account_eur.id, 'debit': 300.0, 'credit': 0.0, 'amount_currency': 0, 'currency_id': False},
{'account_id': inv_1.account_id.id, 'debit': 0.0, 'credit': 300.0, 'amount_currency': 0, 'currency_id': False},
{'account_id': rec_line.account_id.id, 'debit': 0.0, 'credit': 300.0, 'amount_currency': 0, 'currency_id': False},
])
self.assertTrue(payment.move_line_ids.filtered(lambda l: l.account_id == inv_1.account_id)[0].full_reconcile_id)
self.assertTrue(rec_line.full_reconcile_id.exists())
liquidity_aml = payment.move_line_ids.filtered(lambda r: r.account_id == self.account_eur)
liquidity_aml = payment.move_line_ids - rec_line
bank_statement = self.reconcile(liquidity_aml, 300, 0, False)
self.assertEqual(liquidity_aml.statement_id, bank_statement)
@@ -129,8 +121,8 @@ class TestPayment(AccountingTestCase):
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': self.account_usd.id, 'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id},
{'account_id': self.transfer_account.id, 'debit': 32.70, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id},
{'account_id': self.account_usd.id, 'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id},
{'account_id': self.transfer_account.id, 'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id},
{'account_id': self.account_eur.id, 'debit': 32.70, 'credit': 0.0, 'amount_currency': 0, 'currency_id': False},
])
@@ -149,118 +141,49 @@ class TestPayment(AccountingTestCase):
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': self.account_usd.id, 'debit': 0.0, 'credit': 38.21, 'amount_currency': -58.42, 'currency_id': self.currency_usd_id},
{'account_id': self.partner_china_exp.property_account_payable_id.id, 'debit': 38.21, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_chf_id},
{'account_id': self.account_usd.id, 'debit': 0.0, 'credit': 38.21, 'amount_currency': -58.42, 'currency_id': self.currency_usd_id},
])
def test_multiple_payments_00(self):
""" Create test to pay several vendor bills/invoices at once """
# One payment for inv_1 and inv_2 (same partner)
inv_1 = self.create_invoice(amount=100, partner=self.partner_agrolait.id)
inv_2 = self.create_invoice(amount=500, partner=self.partner_agrolait.id)
# One payment for inv_3 (different partner)
inv_3 = self.create_invoice(amount=200, partner=self.partner_china_exp.id)
# One payment for inv_4 (Vendor Bill)
inv_4 = self.create_invoice(amount=50, partner=self.partner_agrolait.id, type='in_invoice')
ids_out = [inv_1.id, inv_2.id, inv_3.id]
ids_in = [inv_4.id]
for ids in [ids_out, ids_in]:
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
})
register_payments.create_payments()
payment_ids = self.payment_model.search([('invoice_ids', 'in', ids_out + ids_in)], order="id desc")
self.assertEqual(len(payment_ids), 4)
self.assertAlmostEquals(sum(payment_ids.filtered(lambda r: r.payment_type == 'inbound').mapped('amount')) - sum(payment_ids.filtered(lambda r: r.payment_type == 'outbound').mapped('amount')), 750)
inv_1_2_pay = self.env['account.payment']
inv_3_pay = None
inv_4_pay = None
for payment_id in payment_ids:
self.assertEqual('posted', payment_id.state)
if payment_id.partner_id == self.partner_agrolait:
if payment_id.partner_type == 'supplier':
self.assertEqual(payment_id.amount, 50)
inv_4_pay = payment_id
else:
self.assertTrue(payment_id.amount in (100, 500))
inv_1_2_pay |= payment_id
else:
self.assertEqual(payment_id.amount, 200)
inv_3_pay = payment_id
self.assertTrue(len(inv_1_2_pay) == 2)
self.assertEqual(inv_1.state, 'paid')
self.assertEqual(inv_2.state, 'paid')
self.assertIsNotNone(inv_3_pay)
self.assertRecordValues(inv_3_pay.move_line_ids, [
{'account_id': self.account_eur.id, 'debit': 200.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': inv_1.account_id.id, 'debit': 0.0, 'credit': 200.0, 'amount_currency': 0.0, 'currency_id': False},
])
self.assertEqual(inv_3.state, 'paid')
self.assertIsNotNone(inv_4_pay)
self.assertRecordValues(inv_4_pay.move_line_ids, [
{'account_id': self.account_eur.id, 'debit': 0.0, 'credit': 50.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': inv_1.account_id.id, 'debit': 50.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False},
])
self.assertEqual(inv_4.state, 'paid')
def test_partial_payment(self):
""" Create test to pay invoices (cust. inv + vendor bill) with partial payment """
# Test Customer Invoice
inv_1 = self.create_invoice(amount=600)
ids = [inv_1.id]
payment_register = Form(self.env['account.payment'].with_context(active_model='account.invoice', active_ids=ids))
with payment_register as pr:
pr.payment_date = time.strftime('%Y') + '-07-15'
pr.journal_id = self.bank_journal_euro
pr.payment_method_id = self.payment_method_manual_in
payment_register = Form(self.env['account.payment'].with_context(active_model='account.move', active_ids=inv_1.ids))
payment_register.payment_date = time.strftime('%Y') + '-07-15'
payment_register.journal_id = self.bank_journal_euro
payment_register.payment_method_id = self.payment_method_manual_in
# Perform the partial payment by setting the amount at 550 instead of 600
pr.amount = 550
# Perform the partial payment by setting the amount at 550 instead of 600
payment_register.amount = 550
payment_ids = self.payment_model.search([('invoice_ids', 'in', ids)], order="id desc")
payment = payment_register.save()
self.assertEqual(len(payment_ids), 1)
payment_id = payment_ids[0]
self.assertEqual(payment_id.invoice_ids[0].id, inv_1.id)
self.assertAlmostEquals(payment_id.amount, 550)
self.assertEqual(payment_id.payment_type, 'inbound')
self.assertEqual(payment_id.partner_id, self.partner_agrolait)
self.assertEqual(payment_id.partner_type, 'customer')
self.assertEqual(len(payment), 1)
self.assertEqual(payment.invoice_ids[0].id, inv_1.id)
self.assertAlmostEquals(payment.amount, 550)
self.assertEqual(payment.payment_type, 'inbound')
self.assertEqual(payment.partner_id, self.partner_agrolait)
self.assertEqual(payment.partner_type, 'customer')
# Test Vendor Bill
inv_2 = self.create_invoice(amount=500, type='in_invoice', partner=self.partner_china_exp.id)
ids = [inv_2.id]
payment_register = Form(self.env['account.payment'].with_context(active_model='account.invoice', active_ids=ids))
with payment_register as pr:
pr.payment_date = time.strftime('%Y') + '-07-15'
pr.journal_id = self.bank_journal_euro
pr.payment_method_id = self.payment_method_manual_in
payment_register = Form(self.env['account.payment'].with_context(active_model='account.move', active_ids=inv_2.ids))
payment_register.payment_date = time.strftime('%Y') + '-07-15'
payment_register.journal_id = self.bank_journal_euro
payment_register.payment_method_id = self.payment_method_manual_in
# Perform the partial payment by setting the amount at 300 instead of 500
pr.amount = 300
# Perform the partial payment by setting the amount at 300 instead of 500
payment_register.amount = 300
payment_register.save()
payment_ids = self.payment_model.search([('invoice_ids', 'in', ids)], order="id desc")
payment = payment_register.save()
self.assertEqual(len(payment_ids), 1)
payment_id = payment_ids[0]
self.assertEqual(payment_id.invoice_ids[0].id, inv_2.id)
self.assertAlmostEquals(payment_id.amount, 300)
self.assertEqual(payment_id.payment_type, 'outbound')
self.assertEqual(payment_id.partner_id, self.partner_china_exp)
self.assertEqual(payment_id.partner_type, 'supplier')
self.assertEqual(len(payment), 1)
self.assertEqual(payment.invoice_ids[0].id, inv_2.id)
self.assertAlmostEquals(payment.amount, 300)
self.assertEqual(payment.payment_type, 'outbound')
self.assertEqual(payment.partner_id, self.partner_china_exp)
self.assertEqual(payment.partner_type, 'supplier')
def test_payment_and_writeoff_in_other_currency_1(self):
# Use case:
@@ -268,6 +191,7 @@ class TestPayment(AccountingTestCase):
# Mark invoice as fully paid with a write_off
# Check that all the aml are correctly created.
invoice = self.create_invoice(amount=25, type='out_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
receivable_line = invoice.line_ids.filtered(lambda l: l.account_id.user_type_id.type == 'receivable')
# register payment on invoice
payment = self.payment_model.create({'payment_type': 'inbound',
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
@@ -283,18 +207,19 @@ class TestPayment(AccountingTestCase):
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': receivable_line.account_id.id, 'debit': 0.0, 'credit': 25.0, 'amount_currency': -38.22, 'currency_id': self.currency_usd_id},
{'account_id': self.account_eur.id, 'debit': 16.35, 'credit': 0.0, 'amount_currency': 25.0, 'currency_id': self.currency_usd_id},
{'account_id': self.account_payable.id, 'debit': 8.65, 'credit': 0.0, 'amount_currency': 13.22, 'currency_id': self.currency_usd_id},
{'account_id': self.account_receivable.id, 'debit': 0.0, 'credit': 25.0, 'amount_currency': -38.22, 'currency_id': self.currency_usd_id},
])
self.assertTrue(payment.move_line_ids.filtered(lambda l: l.account_id == invoice.account_id)[0].full_reconcile_id)
self.assertEqual(invoice.state, 'paid')
self.assertTrue(receivable_line.full_reconcile_id)
self.assertEqual(invoice.invoice_payment_state, 'paid')
# Use case:
# Company is in EUR, create a vendor bill for 25 EUR and register payment of 25 USD.
# Mark invoice as fully paid with a write_off
# Check that all the aml are correctly created.
invoice = self.create_invoice(amount=25, type='in_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
payable_line = invoice.line_ids.filtered(lambda l: l.account_id.user_type_id.type == 'payable')
# register payment on invoice
payment = self.payment_model.create({'payment_type': 'outbound',
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
@@ -304,18 +229,18 @@ class TestPayment(AccountingTestCase):
'currency_id': self.currency_usd_id,
'payment_date': time.strftime('%Y') + '-07-15',
'payment_difference_handling': 'reconcile',
'writeoff_account_id': self.account_payable.id,
'writeoff_account_id': self.account_receivable.id,
'journal_id': self.bank_journal_euro.id,
'invoice_ids': [(4, invoice.id, None)]
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': payable_line.account_id.id, 'debit': 25.0, 'credit': 0.0, 'amount_currency': 38.22, 'currency_id': self.currency_usd_id},
{'account_id': self.account_eur.id, 'debit': 0.0, 'credit': 16.35, 'amount_currency': -25.0, 'currency_id': self.currency_usd_id},
{'account_id': self.account_payable.id, 'debit': 0.0, 'credit': 8.65, 'amount_currency': -13.22, 'currency_id': self.currency_usd_id},
{'account_id': self.account_receivable.id, 'debit': 25.0, 'credit': 0.0, 'amount_currency': 38.22, 'currency_id': self.currency_usd_id},
{'account_id': self.account_receivable.id, 'debit': 0.0, 'credit': 8.65, 'amount_currency': -13.22, 'currency_id': self.currency_usd_id},
])
self.assertTrue(payment.move_line_ids.filtered(lambda l: l.account_id == invoice.account_id)[0].full_reconcile_id)
self.assertEqual(invoice.state, 'paid')
self.assertTrue(payable_line.full_reconcile_id)
self.assertEqual(invoice.invoice_payment_state, 'paid')
def test_payment_and_writeoff_out_refund(self):
# Use case:
@@ -323,6 +248,7 @@ class TestPayment(AccountingTestCase):
# Mark invoice as fully paid with a write_off
# Check that all the aml are correctly created.
invoice = self.create_invoice(amount=100, type='out_refund', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
receivable_line = invoice.line_ids.filtered(lambda l: l.account_id.user_type_id.type == 'receivable')
# register payment on invoice
payment = self.payment_model.create({'payment_type': 'outbound',
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
@@ -337,11 +263,11 @@ class TestPayment(AccountingTestCase):
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': receivable_line.account_id.id, 'debit': 100.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': self.account_eur.id, 'debit': 0.0, 'credit': 90.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': self.account_payable.id, 'debit': 0.0, 'credit': 10.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': self.account_receivable.id, 'debit': 100.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False},
])
self.assertEqual(invoice.state, 'paid')
self.assertEqual(invoice.invoice_payment_state, 'paid')
def test_payment_and_writeoff_in_other_currency_2(self):
# Use case:
@@ -360,10 +286,8 @@ class TestPayment(AccountingTestCase):
'name': time.strftime('%Y') + '-07-15'})
invoice = self.create_invoice(amount=5325.6, type='in_invoice', currency_id=self.currency_usd_id, partner=self.partner_agrolait.id)
self.assertRecordValues(invoice.move_id.line_ids, [
{'account_id': self.account_receivable.id, 'debit': 0.0, 'credit': 5950.39, 'amount_currency': -5325.6, 'currency_id': self.currency_usd_id},
{'account_id': self.account_revenue.id, 'debit': 5950.39, 'credit': 0.0, 'amount_currency': 5325.6, 'currency_id': self.currency_usd_id},
])
payable_line = invoice.line_ids.filtered(lambda l: l.account_id.user_type_id.type == 'payable')
# register payment on invoice
payment = self.payment_model.create({'payment_type': 'outbound',
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
@@ -379,19 +303,18 @@ class TestPayment(AccountingTestCase):
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'debit': 6051.82, 'credit': 0.0, 'amount_currency': 5325.6, 'currency_id': self.currency_usd_id},
{'debit': 0.0, 'credit': 6051.14, 'amount_currency': -5325.0, 'currency_id': self.currency_usd_id},
{'debit': 0.0, 'credit': 0.68, 'amount_currency': -0.6, 'currency_id': self.currency_usd_id},
{'debit': 6051.82, 'credit': 0.0, 'amount_currency': 5325.6, 'currency_id': self.currency_usd_id},
])
exchange_lines = payment.move_line_ids[-1].full_reconcile_id.exchange_move_id.line_ids
exchange_lines = payable_line.full_reconcile_id.exchange_move_id.line_ids
self.assertRecordValues(exchange_lines, [
{'debit': 0.0, 'credit': 101.43, 'account_id': payable_line.account_id.id},
{'debit': 101.43, 'credit': 0.0, 'account_id': self.diff_expense_account.id},
{'debit': 0.0, 'credit': 101.43, 'account_id': self.account_receivable.id},
])
#check the invoice status
self.assertEqual(invoice.state, 'paid')
self.assertEqual(invoice.invoice_payment_state, 'paid')
def test_payment_and_writeoff_in_other_currency_3(self):
# Use case related in revision 20935462a0cabeb45480ce70114ff2f4e91eaf79
@@ -412,10 +335,8 @@ class TestPayment(AccountingTestCase):
'name': time.strftime('%Y') + '-06-26'})
invoice = self.create_invoice(amount=247590.4, type='out_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
self.assertRecordValues(invoice.move_id.line_ids, [
{'account_id': self.account_receivable.id, 'debit': 247590.4, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False},
{'account_id': self.account_revenue.id, 'debit': 0.0, 'credit': 247590.4, 'amount_currency': 0.0, 'currency_id': False},
])
receivable_line = invoice.line_ids.filtered(lambda l: l.account_id.user_type_id.type == 'receivable')
# register payment on invoice
payment = self.payment_model.create({'payment_type': 'inbound',
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
@@ -432,19 +353,19 @@ class TestPayment(AccountingTestCase):
})
payment.post()
self.assertRecordValues(payment.move_line_ids, [
{'account_id': receivable_line.account_id.id, 'debit': 0.0, 'credit': 247589.16, 'amount_currency': -261.17, 'currency_id': self.currency_usd_id},
{'account_id': self.account_eur.id, 'debit': 253116.0, 'credit': 0.0, 'amount_currency': 267.0, 'currency_id': self.currency_usd_id},
{'account_id': self.account_revenue.id, 'debit': 0.0, 'credit': 5526.84, 'amount_currency': -5.83, 'currency_id': self.currency_usd_id},
{'account_id': self.account_receivable.id, 'debit': 0.0, 'credit': 247589.16, 'amount_currency': -261.17, 'currency_id': self.currency_usd_id},
])
# Check the invoice status and the full reconciliation: the difference on the receivable account
# should have been completed by an exchange rate difference entry
self.assertEqual(invoice.state, 'paid')
self.assertTrue(invoice.move_id.line_ids.filtered(lambda l: l.account_id == self.account_receivable)[0].full_reconcile_id)
self.assertEqual(invoice.invoice_payment_state, 'paid')
self.assertTrue(receivable_line.full_reconcile_id)
def test_post_at_bank_reconciliation_payment(self):
# Create two new payments in a journal requiring the journal entries to be posted at bank reconciliation
post_at_bank_rec_journal = bank_journal_euro = self.env['account.journal'].create({
post_at_bank_rec_journal = self.env['account.journal'].create({
'name': 'Bank',
'type': 'bank',
'code': 'COUCOU',
@@ -481,10 +402,9 @@ class TestPayment(AccountingTestCase):
# Reconcile the two payments with an invoice, whose full amount is equal to their sum
invoice = self.create_invoice(amount=53, partner=self.partner_agrolait.id)
(payment_one.move_line_ids + payment_two.move_line_ids + invoice.move_id.line_ids).filtered(lambda x: x.account_id.user_type_id.type == 'receivable').reconcile()
(payment_one.move_line_ids + payment_two.move_line_ids + invoice.line_ids).filtered(lambda x: x.account_id.user_type_id.type == 'receivable').reconcile()
self.assertTrue(invoice.reconciled, "Invoice should have been reconciled with the payments")
self.assertEqual(invoice.state, 'in_payment', "Invoice should be in 'in payment' state")
self.assertEqual(invoice.invoice_payment_state, 'in_payment', "Invoice should be in 'in payment' state")
# Match the first payment with a bank statement line
bank_statement_one = self.reconcile(payment_one.move_line_ids.filtered(lambda x: x.account_id.user_type_id.type == 'liquidity'), 42)
@@ -493,7 +413,7 @@ class TestPayment(AccountingTestCase):
self.assertEqual(payment_one.mapped('move_line_ids.move_id.state'), ['posted'], "After bank reconciliation, payment one's account.move should be posted.")
self.assertEqual(payment_one.mapped('move_line_ids.move_id.date'), stmt_line_date_one, "After bank reconciliation, payment one's account.move should share the same date as the bank statement.")
self.assertEqual([payment_one.payment_date], stmt_line_date_one, "After bank reconciliation, payment one should share the same date as the bank statement.")
self.assertEqual(invoice.state, 'in_payment', "The invoice should still be 'in payment', not all its payments are reconciled with a statement")
self.assertEqual(invoice.invoice_payment_state, 'in_payment', "The invoice should still be 'in payment', not all its payments are reconciled with a statement")
# Match the second payment with a bank statement line
bank_statement_two = self.reconcile(payment_two.move_line_ids.filtered(lambda x: x.account_id.user_type_id.type == 'liquidity'), 42)
@@ -504,4 +424,4 @@ class TestPayment(AccountingTestCase):
self.assertEqual([payment_two.payment_date], stmt_line_date_two, "After bank reconciliation, payment two should share the same date as the bank statement.")
# The invoice should now be paid
self.assertEqual(invoice.state, 'paid', "Invoice should be in 'paid' state after having reconciled the two payments with a bank statement")
self.assertEqual(invoice.invoice_payment_state, 'paid', "Invoice should be in 'paid' state after having reconciled the two payments with a bank statement")
@@ -1,92 +0,0 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tests import tagged
import time
@tagged('post_install', '-at_install')
class TestProductIdChange(AccountingTestCase):
"""Test that when an included tax is mapped by a fiscal position, the included tax must be
subtracted to the price of the product.
"""
def setUp(self):
super(TestProductIdChange, self).setUp()
self.invoice_model = self.env['account.invoice']
self.fiscal_position_model = self.env['account.fiscal.position']
self.fiscal_position_tax_model = self.env['account.fiscal.position.tax']
self.tax_model = self.env['account.tax']
self.pricelist_model = self.env['product.pricelist']
self.res_partner_model = self.env['res.partner']
self.product_tmpl_model = self.env['product.template']
self.product_model = self.env['product.product']
self.invoice_line_model = self.env['account.invoice.line']
self.account_receivable = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1)
self.account_revenue = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1)
def test_product_id_change(self):
partner = self.res_partner_model.create(dict(name="George"))
tax_include_sale = self.tax_model.create(dict(name="Include tax",
type_tax_use='sale',
amount='21.00',
price_include=True))
tax_include_purchase = self.tax_model.create(dict(name="Include tax",
type_tax_use='purchase',
amount='21.00',
price_include=True))
tax_exclude_sale = self.tax_model.create(dict(name="Exclude tax",
type_tax_use='sale',
amount='0.00'))
tax_exclude_purchase = self.tax_model.create(dict(name="Exclude tax",
type_tax_use='purchase',
amount='0.00'))
product_tmpl = self.product_tmpl_model.create(dict(name="Voiture",
list_price='121',
taxes_id=[(6, 0, [tax_include_sale.id])],
supplier_taxes_id=[(6, 0, [tax_include_purchase.id])]))
product = product_tmpl.product_variant_id
product.standard_price = '242'
fp = self.fiscal_position_model.create(dict(name="fiscal position", sequence=1))
fp_tax_sale = self.fiscal_position_tax_model.create(dict(position_id=fp.id,
tax_src_id=tax_include_sale.id,
tax_dest_id=tax_exclude_sale.id))
fp_tax_purchase = self.fiscal_position_tax_model.create(dict(position_id=fp.id,
tax_src_id=tax_include_purchase.id,
tax_dest_id=tax_exclude_purchase.id))
out_invoice = self.invoice_model.create({
'partner_id': partner.id,
'name': 'invoice to client',
'account_id': self.account_receivable.id,
'type': 'out_invoice',
'date_invoice': time.strftime('%Y') + '-06-26',
'fiscal_position_id': fp.id,
})
out_line = self.invoice_line_model.create({
'product_id': product.id,
'quantity': 1,
'price_unit': 121.0,
'invoice_id': out_invoice.id,
'name': 'something out',
'account_id': self.account_revenue.id,
})
in_invoice = self.invoice_model.create({
'partner_id': partner.id,
'name': 'invoice to supplier',
'account_id': self.account_receivable.id,
'type': 'in_invoice',
'date_invoice': time.strftime('%Y') + '-06-26',
'fiscal_position_id': fp.id,
})
in_line = self.invoice_line_model.create({
'product_id': product.id,
'quantity': 1,
'price_unit': 242.0,
'invoice_id': in_invoice.id,
'name': 'something in',
'account_id': self.account_revenue.id,
})
out_line._onchange_product_id()
self.assertEquals(100, out_line.price_unit, "The included tax must be subtracted to the price")
in_line._onchange_product_id()
self.assertEquals(200, in_line.price_unit, "The included tax must be subtracted to the price")
File diff suppressed because it is too large Load Diff
@@ -8,21 +8,17 @@ from odoo.tests import tagged
class TestReconciliationMatchingRules(AccountingTestCase):
def _create_invoice_line(self, amount, partner, type):
''' Create an invoice on the fly.'''
self_ctx = self.env['account.invoice'].with_context(type=type)
journal_id = self_ctx._default_journal().id
self_ctx = self_ctx.with_context(journal_id=journal_id)
view = type in ('in_invoice', 'in_refund') and 'account.invoice_supplier_form' or 'account.invoice_form'
with Form(self_ctx, view=view) as invoice_form:
invoice_form.partner_id = partner
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.name = 'xxxx'
invoice_line_form.quantity = 1
invoice_line_form.price_unit = amount
invoice_line_form.invoice_line_tax_ids.clear()
invoice_form = Form(self.env['account.move'].with_context(default_type=type))
invoice_form.partner_id = partner
with invoice_form.invoice_line_ids.new() as invoice_line_form:
invoice_line_form.name = 'xxxx'
invoice_line_form.quantity = 1
invoice_line_form.price_unit = amount
invoice_line_form.tax_ids.clear()
invoice = invoice_form.save()
invoice.action_invoice_open()
lines = invoice.move_id.line_ids
return lines.filtered(lambda l: l.account_id == invoice.account_id)
invoice.post()
lines = invoice.line_ids
return lines.filtered(lambda l: l.account_id.user_type_id.type in ('receivable', 'payable'))
def _check_statement_matching(self, rules, expected_values, statements=None):
if statements is None:
@@ -293,15 +289,15 @@ class TestReconciliationMatchingRules(AccountingTestCase):
# Check first line has been well reconciled.
self.assertRecordValues(self.bank_line_1.journal_entry_ids, [
{'partner_id': self.partner_1.id, 'debit': 105.0, 'credit': 0.0},
{'partner_id': self.partner_1.id, 'debit': 0.0, 'credit': 100.0},
{'partner_id': self.partner_1.id, 'debit': 0.0, 'credit': 5.0},
{'partner_id': self.partner_1.id, 'debit': 0.0, 'credit': 100.0},
{'partner_id': self.partner_1.id, 'debit': 105.0, 'credit': 0.0},
])
# Check second line has been well reconciled.
self.assertRecordValues(self.cash_line_1.journal_entry_ids, [
{'partner_id': self.partner_2.id, 'debit': 0.0, 'credit': 1000.0},
{'partner_id': self.partner_2.id, 'debit': 1000.0, 'credit': 0.0},
{'partner_id': self.partner_2.id, 'debit': 0.0, 'credit': 1000.0},
])
def test_reverted_move_matching(self):
@@ -329,7 +325,7 @@ class TestReconciliationMatchingRules(AccountingTestCase):
})
move.post()
move_reversed = AccountMove.browse(move.reverse_moves())
move_reversed = move._reverse_moves()
self.assertTrue(move_reversed.exists())
bank_st = self.env['account.bank.statement'].create({
@@ -41,7 +41,7 @@ class TestReconciliationWidget(TestReconciliation):
bank_stmt = self.acc_bank_stmt_model.create({
'journal_id': self.bank_journal_usd.id,
'date': time.strftime('%Y-07-15'),
'name': 'payment %s' % invoice.number,
'name': 'payment %s' % invoice.name,
})
bank_stmt_line = self.acc_bank_stmt_line_model.create({'name': 'payment',
@@ -52,4 +52,4 @@ class TestReconciliationWidget(TestReconciliation):
})
result = self.env['account.reconciliation.widget'].get_bank_statement_line_data(bank_stmt_line.ids)
self.assertEqual(result['lines'][0]['reconciliation_proposition'][0]['amount_str'], '$ 50.00')
self.assertEqual(result['lines'][0]['reconciliation_proposition'][0]['amount_str'], '$ 50.00')
@@ -1,946 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Invoices -->
<record id="view_invoice_line_calendar" model="ir.ui.view">
<field name="name">account.invoice.calendar</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<calendar string="Invoices" date_start="date_invoice" color="journal_id">
<field name="partner_id"/>
<field name="amount_total_signed"/>
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_invoice_pivot">
<field name="name">account.invoice.pivot</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<pivot string="Invoices" display_quantity="true">
<field name="partner_id"/>
<field name="amount_total_company_signed" type="measure"/>
<field name="amount_total_signed" invisible="1"/>
<field name="amount_total" invisible="1"/>
<field name="residual_signed" invisible="1"/>
<field name="residual" invisible="1"/>
</pivot>
</field>
</record>
<record model="ir.ui.view" id="view_invoice_graph">
<field name="name">account.invoice.graph</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<graph string="Invoices">
<field name="partner_id"/>
<field name="amount_total_signed" type="measure"/>
</graph>
</field>
</record>
<record id="account_invoice_view_activity" model="ir.ui.view">
<field name="name">account.invoice.activity</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<activity string="Invoices">
<templates>
<div t-name="activity-box">
<div>
<field name="reference" display="full"/>
<field name="partner_id" muted="1" display="full"/>
</div>
</div>
</templates>
</activity>
</field>
</record>
<record id="view_invoice_line_tree" model="ir.ui.view">
<field name="name">account.invoice.line.tree</field>
<field name="model">account.invoice.line</field>
<field name="arch" type="xml">
<tree string="Invoice Line">
<field name="name"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="quantity"/>
<field name="uom_id" groups="uom.group_uom"/>
<field name="price_unit"/>
<field name="discount" groups="base.group_no_one"/>
<field name="price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<field name="price_total" groups="account.group_show_line_subtotals_tax_included"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
</record>
<!--
TODO: This view uses "parent" and will not work standalone.
But for now we don't need it standalone.
The view will only work if it's called as the default view to display a one2many
(showing invoice lines from inside the invoice form, where the invoice is the "parent").
If there is an action using this view directly (eg. showing all the invoice lines independently of their invoices) it will not work,
because there is the use of parent. inside the view, which will not exist in that case.
-->
<record id="view_invoice_line_form" model="ir.ui.view">
<field name="name">account.invoice.line.form</field>
<field name="model">account.invoice.line</field>
<field name="arch" type="xml">
<form>
<field name="display_type" invisible="1"/>
<!--
We need the sequence field to be here for new lines to be added at the correct position.
TODO: at some point we want to fix this in the framework so that an invisible field is not required.
-->
<field name="sequence" invisible="1"/>
<group attrs="{'invisible': [('display_type', '!=', False)]}">
<group>
<field name="partner_id" invisible="1"/>
<field name="invoice_type" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="product_id"
context="{'partner_id': partner_id}"
widget="many2one_barcode"
/>
<label for="quantity"/>
<div class="o_row">
<field name="quantity"/>
<field name="uom_id" groups="uom.group_uom"/>
</div>
<field name="price_unit"/>
<field name="discount" groups="base.group_no_one"/>
<field name="invoice_line_tax_ids" context="{'type': invoice_type}" domain="[('type_tax_use','!=','none'),('company_id', '=', company_id)]" widget="many2many_tags" options="{'no_create': True}"/>
<field name="currency_id" invisible="1"/>
</group>
<group name="account_details">
<field domain="[('company_id', '=', company_id)]" name="account_id" options="{'no_create': True}" groups="account.group_account_user"/>
<field domain="[('company_id', '=', company_id)]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
</group>
</group>
<label for="name" string="Description" attrs="{'invisible': [('display_type', '!=', False)]}"/>
<label for="name" string="Section" attrs="{'invisible': [('display_type', '!=', 'line_section')]}"/>
<label for="name" string="Note" attrs="{'invisible': [('display_type', '!=', 'line_note')]}"/>
<field name="name"/>
</form>
</field>
</record>
<record id="view_invoice_tax_tree" model="ir.ui.view">
<field name="name">account.invoice.tax.tree</field>
<field name="model">account.invoice.tax</field>
<field name="arch" type="xml">
<tree string="Manual Invoice Taxes">
<field name="sequence"/>
<field name="manual"/>
<field name="name"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="base"/>
<field name="tax_ids"/>
<field name="amount_total" string="Amount"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
</record>
<record id="view_invoice_tax_form" model="ir.ui.view">
<field name="name">account.invoice.tax.form</field>
<field name="model">account.invoice.tax</field>
<field name="arch" type="xml">
<form string="Manual Invoice Taxes">
<group col="4">
<field name="name"/>
<field name="sequence"/>
<field name="account_id" options="{'no_create': True}" groups="account.group_account_user"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="manual"/>
<field name="amount_total" string="Amount"/>
<field name="base"/>
<field name="tax_ids"/>
<field name="currency_id" invisible="1"/>
</group>
</form>
</field>
</record>
<record id="invoice_tree" model="ir.ui.view">
<field name="name">account.invoice.tree</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<tree decoration-info="state == 'draft'" decoration-muted="state == 'cancel'" string="Invoice" js_class="account_tree">
<field name="partner_id" groups="base.group_user" string="Customer"/>
<field name="date_invoice"/>
<field name="number"/>
<field name="commercial_partner_id" invisible="1"/>
<field name="reference" invisible="1"/>
<field name="name" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="user_id"/>
<field name="date_due"/>
<field name="origin"/>
<field name="amount_untaxed_invoice_signed" string="Tax Excluded" sum="Total"/>
<field name="amount_tax_signed" string="Tax" sum="Total"/>
<field name="amount_total_signed" string="Total" sum="Total"/>
<field name="residual_signed" string="Amount Due" sum="Amount Due"/>
<field name="currency_id" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="state"/>
<field name="type" invisible="context.get('type',True)"/>
</tree>
</field>
</record>
<record id="invoice_tree_with_onboarding" model="ir.ui.view">
<field name="name">account.invoice.tree.with.onboarding</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="invoice_tree"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="banner_route">/account/account_invoice_onboarding</attribute>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="invoice_kanban">
<field name="name">account.invoice.kanban</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="number"/>
<field name="partner_id"/>
<field name="amount_total_signed"/>
<field name="date_invoice"/>
<field name="state"/>
<field name="currency_id"/>
<field name="activity_state"/>
<progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><span><t t-esc="record.partner_id.value"/></span></strong>
</div>
<strong><field name="amount_total_signed" widget="monetary"/></strong>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left text-muted">
<span><t t-esc="record.number.value"/> <t t-esc="record.date_invoice.value"/></span>
</div>
<div class="oe_kanban_bottom_right">
<span class="float-right text-right">
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'cancel': 'default', 'none': 'danger', 'open': 'warning',
'paid': 'success'}}"/>
</span>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="invoice_supplier_tree" model="ir.ui.view">
<field name="name">account.invoice.supplier.tree</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<tree decoration-info="state == 'draft'" decoration-muted="state == 'cancel'" decoration-bf="not partner_id" string="Vendor Bill" js_class="account_tree">
<field name="partner_id" invisible="1"/>
<field name="source_email" invisible="1"/>
<field name="invoice_icon" string=" "/>
<field name="vendor_display_name" groups="base.group_user" string="Vendor"/>
<field name="date_invoice" string="Bill Date"/>
<field name="number"/>
<field name="reference"/>
<field name="commercial_partner_id" invisible="1"/>
<field name="name" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="date_due"/>
<field name="origin"/>
<field name="amount_untaxed_invoice_signed" string="Tax Excluded" sum="Total"/>
<field name="amount_tax_signed" sum="Total"/>
<field name="amount_total_signed" string="Total" sum="Total"/>
<field name="residual_signed" string="To Pay" sum="To pay"/>
<field name="currency_id" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="state"/>
<field name="type" invisible="context.get('type',True)"/>
</tree>
</field>
</record>
<record id="invoice_supplier_form" model="ir.ui.view">
<field name="name">account.invoice.supplier.form</field>
<field name="model">account.invoice</field>
<field name="priority">2</field>
<field name="arch" type="xml">
<form string="Vendor Bill">
<header>
<button name="action_invoice_open" type="object" states="draft" string="Validate" class="oe_highlight" groups="account.group_account_invoice"/>
<button name="action_register_payment" type="object" states="open" string="Register Payment" groups="account.group_account_invoice" class="oe_highlight"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Ask for a Credit Note' groups="account.group_account_invoice" attrs="{'invisible': ['|',('type', 'in', ['in_refund','out_refund']),('state','not in',('open','in_payment','paid'))]}"/>
<button name="action_invoice_draft" states="cancel" string="Set to Draft" type="object" groups="account.group_account_invoice"/>
<field name="state" widget="statusbar" statusbar_visible="draft,open,paid" />
</header>
<div groups="account.group_account_invoice" class="alert alert-info" role="alert" style="margin-bottom:0px;" attrs="{'invisible': [('has_outstanding','=',False)]}">
You have <bold><a class="alert-link" href="#outstanding" role="button">outstanding debits</a></bold> for this supplier. You can allocate them to mark this bill as paid.
</div>
<div groups="account.group_account_invoice" class="alert alert-info" role="alert" style="margin-bottom:0px;" attrs="{'invisible': [('edition_mode_available','=',False)]}">
You have suspense account moves that match this invoice. <bold><button class="alert-link" type="object" name="action_reconcile_to_check" role="button" string="Check them" style="padding: 0;vertical-align: baseline;"/></bold> to mark this invoice as paid.
</div>
<field name="has_outstanding" invisible="1"/>
<field name="edition_mode_available" invisible="1"/>
<sheet string="Vendor Bill">
<div>
<span class="o_form_label" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_invoice')]}">Draft Bill</span>
<span class="o_form_label" attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">- First Number:</span>
<span class="o_form_label" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_refund')]}">Draft Credit Note</span>
<span class="o_form_label" attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_invoice')]}">Bill </span>
<span class="o_form_label" attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_refund')]}">Credit Note </span>
<h1 class="mt0">
<field name="number" class="oe_inline" attrs="{'invisible': [('state', '=', 'draft')]}"/>
<div attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">
<field name="sequence_number_next_prefix" class="oe_inline"/>
<field name="sequence_number_next" class="oe_inline"/>
</div>
</h1>
</div>
<field name="type" invisible="1"/>
<group>
<group>
<field string="Vendor" name="partner_id"
widget="res_partner_many2one"
context="{'default_customer': 0, 'search_default_supplier': 1, 'default_supplier': 1, 'default_is_company': True, 'show_vat': True}"
domain="[('supplier', '=', True)]"/>
<field name="reference" string="Vendor Reference"/>
<field name="vendor_bill_id" attrs="{'invisible': [('state','not in',['draft'])]}"
domain="[('partner_id','child_of', [partner_id]), ('state','in',('open','in_payment','paid')), ('type','=','in_invoice')]"
string="Auto-Complete" placeholder="Select an old vendor bill"
options="{'no_create': True}" context="{'show_total_amount': True}"/>
</group>
<group>
<field name="origin" attrs="{'invisible': [('origin', '=', False)]}"/>
<field name="source_email" widget="email" groups="base.group_no_one" attrs="{'invisible': [('source_email', '=', False)]}"/>
<field name="date_invoice" string="Bill Date" options="{'datepicker': {'warn_future': true}}"/>
<field name="date_due" attrs="{'readonly': ['|',('payment_term_id','!=',False), ('state', 'in', ['open', 'in_payment', 'paid'])]}" force_save="1"/>
<field name="move_name" invisible="1"/>
<field name="currency_id" options="{'no_create': True, 'no_open': True}" groups="base.group_multi_currency"/>
<field name="company_currency_id" invisible="1"/>
<field name="commercial_partner_id" invisible="1"/>
<field domain="[('partner_id', '=', commercial_partner_id)]" name="partner_bank_id" string="Bank Account" context="{'default_partner_id': commercial_partner_id}" attrs="{'invisible': [('type', '!=', 'in_invoice')]}"/>
</group>
</group>
<notebook>
<page string="Bill">
<field context="{'type': type, 'journal_id': journal_id}" name="invoice_line_ids">
<tree string="Bill lines" editable="bottom">
<field name="sequence" widget="handle" />
<field name="product_id"
context="{'partner_id': parent.partner_id}" domain="[('purchase_ok','=',True)]"
optional="show"/>
<field name="name"/>
<field name="company_id" invisible="1"/>
<field name="account_id" options="{'no_create': True}" groups="account.group_account_user"
domain="[('company_id', '=', parent.company_id), ('internal_type', '=', 'other'), ('deprecated', '=', False)]"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('company_id', '=', parent.company_id)]"
context="{'default_partner_id': parent.partner_id}"
optional="show"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags" options="{'color_field': 'color'}" optional="show"/>
<field name="quantity"/>
<field name="uom_id" string="UoM" groups="uom.group_uom" optional="show"/>
<field name="price_unit"/>
<field name="discount" string="Disc.%" optional="hide"/>
<field name="invoice_line_tax_ids" widget="many2many_tags" options="{'no_create': True}" context="{'type':parent.type, 'tree_view_ref': 'account.account_tax_view_tree', 'search_view_ref': 'account.account_tax_view_search'}"
domain="[('type_tax_use','=','purchase'),('company_id', '=', parent.company_id)]"/>
<field name="price_subtotal" string="Amount"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
<group>
<group>
<div class="oe_inline">
<field name="tax_line_ids">
<tree editable="bottom" string="Taxes" create="0" delete="0">
<field name="name"/>
<!--Need invisible fields for on_change to create all necessary info -->
<field name="tax_id" invisible="1"/>
<field name="tax_ids" invisible="1"/>
<field name="sequence" invisible="1"/>
<field name="manual" invisible="1"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="amount"/>
<field name="amount_rounding" invisible="1"/>
<field name="amount_total" invisible="1"/>
<field name="currency_id" invisible="1" force_save="1"/>
<field name="tax_repartition_line_id" invisible="1"/> <!--Needed in order for the onchange computing the taxes to keep the repartition lines-->
<field name="tag_ids" invisible="1"/> <!--Needed in order for the onchange computing the taxes to keep the tags-->
<field name="base" invisible="1"/>
</tree>
</field>
</div>
</group>
<group class="oe_subtotal_footer oe_right">
<field name="amount_untaxed"/>
<field name="amount_tax"/>
<field name="amount_total" class="oe_subtotal_footer_separator"/>
<field name="payments_widget" colspan="2" nolabel="1" widget="payment"/>
<field name="residual" class="oe_subtotal_footer_separator" attrs="{'invisible': [('state', '=', 'draft')]}"/>
<field name="reconciled" invisible="1"/>
<field name="outstanding_credits_debits_widget" colspan="2" nolabel="1" widget="payment" attrs="{'invisible': [('state', 'not in', 'open')]}"/>
</group>
</group>
<div>
<field name="comment" placeholder="Additional notes..."/>
</div>
</page>
<page string="Other Info" name="other_info">
<group>
<group>
<field name="user_id" string="Purchase Representative"/>
<field name="journal_id" groups="account.group_account_user" options="{'no_create': True}"
attrs="{'readonly':[('move_name','!=',False)]}"/>
<field domain="[('company_id', '=', company_id), ('internal_type', '=', 'payable'), ('deprecated', '=', False)]"
name="account_id" groups="account.group_account_user"/>
<field name="date" groups="account.group_account_user"/>
<field name="name"/>
</group>
<group>
<field name="incoterm_id" options="{'no_create': True}"/>
<field name="fiscal_position_id" options="{'no_create': True}" placeholder="Auto-detect"/>
<field name="payment_term_id" options="{'no_create': True}"/>
<field name="move_id" groups="account.group_account_user" attrs="{'invisible': [('move_id', '=', False)]}"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="o_attachment_preview"/>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="invoice_form" model="ir.ui.view">
<field name="name">account.invoice.form</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<form string="Invoice" class="o_invoice_form">
<header>
<button name="action_invoice_sent" string="Send &amp; Print" type="object" attrs="{'invisible':['|',('sent','=',True), ('state', 'not in', ('open','in_payment','paid'))]}" class="oe_highlight" groups="base.group_user"/>
<button name="action_invoice_sent" string="Send &amp; Print" type="object" attrs="{'invisible':['|',('sent','=',False), ('state', 'not in', ('open','in_payment','paid'))]}" groups="base.group_user"/>
<button name="action_register_payment" id="account_invoice_payment_btn" type="object"
attrs="{'invisible': [('state', '!=', 'open')]}"
string="Register Payment" groups="account.group_account_invoice" class="oe_highlight"/>
<button name="action_invoice_open" type="object" states="draft" string="Validate" class="oe_highlight o_invoice_validate" groups="account.group_account_invoice"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Add Credit Note' groups="account.group_account_invoice" attrs="{'invisible': ['|',('type', '=', 'out_refund'), ('state', 'not in', ('open','in_payment','paid'))]}"/>
<button name="preview_invoice" type="object" string="Preview"/>
<button name="action_invoice_draft" states="cancel" string="Reset to Draft" type="object" groups="account.group_account_invoice"/>
<field name="state" widget="statusbar" nolabel="1" statusbar_visible="draft,open,paid"/>
</header>
<div groups="account.group_account_invoice" class="alert alert-info" role="alert" style="margin-bottom:0px;" attrs="{'invisible': [('has_outstanding','=',False)]}">
You have <bold><a class="alert-link" href="#outstanding" role="button">outstanding payments</a></bold> for this customer. You can allocate them to mark this invoice as paid.
</div>
<div groups="account.group_account_invoice" class="alert alert-info" role="alert" style="margin-bottom:0px;" attrs="{'invisible': [('edition_mode_available','=',False)]}">
You have suspense account moves that match this invoice. <bold><button class="alert-link" type="object" name="action_reconcile_to_check" role="button" string="Check them" style="padding: 0;vertical-align: baseline;"/></bold> to mark this invoice as paid.
</div>
<field name="has_outstanding" invisible="1"/>
<field name="edition_mode_available" invisible="1"/>
<sheet string="Invoice">
<div class="oe_button_box" name="button_box">
</div>
<span class="o_form_label" attrs="{'invisible': ['|',('state','=','draft'), ('type','!=','out_refund')]}">Credit Note</span>
<h1 class="mt0">
<div attrs="{'invisible': [('sequence_number_next_prefix','!=',False)]}">
<label for="number" string="Draft Invoice" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_invoice')]}"/>
<label for="number" string="Draft Credit Note" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_refund')]}"/>
<field name="number" readonly="1" class="oe_inline" attrs="{'invisible': [('state','in',('draft',))]}"/>
</div>
<div attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">
<label for="sequence_number_next_prefix" string="Invoice Number:"/><br/>
<field name="sequence_number_next_prefix" class="oe_inline"/>
<field name="sequence_number_next" class="oe_inline"/>
</div>
</h1>
<field name="type" invisible="1"/>
<group>
<group>
<field string="Customer" name="partner_id"
widget="res_partner_many2one"
context="{'search_default_customer':1, 'show_address': 1, 'default_is_company': True, 'show_vat': True}"
options='{"always_reload": True, "no_quick_create": True}'
domain="[('customer', '=', True)]"/>
<field name="payment_term_id"/>
<field name="cash_rounding_id" groups="account.group_cash_rounding"/>
</group>
<group>
<field name="date_invoice" options="{'datepicker': {'warn_future': true}}"/>
<field name="date_due" attrs="{'readonly': ['|',('payment_term_id','!=',False), ('state', 'in', ['open', 'in_payment', 'paid'])]}" force_save="1"/>
<field name="move_name" invisible="1"/>
<label for="currency_id" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="currency_id" options="{'no_create': True, 'no_open': True}" class="oe_inline"/>
<field name="company_currency_id" invisible="1"/>
</div>
</group>
</group>
<field name="sent" invisible="1"/>
<notebook colspan="4">
<page string="Invoice Lines">
<field
name="invoice_line_ids"
nolabel="1"
widget="section_and_note_one2many"
mode="tree,kanban"
context="{'type': type, 'journal_id': journal_id, 'default_invoice_id': id}"
>
<tree string="Invoice Lines" editable="bottom">
<control>
<create name="add_line_control" string="Add a line"/>
<create name="add_section_control" string="Add a section" context="{'default_display_type': 'line_section'}"/>
<create name="add_note_control" string="Add a note" context="{'default_display_type': 'line_note'}"/>
</control>
<field name="sequence" widget="handle"/>
<field name="product_id" domain="[('sale_ok','=',True)]" optional="show"/>
<field name="origin" invisible="1"/>
<field name="is_rounding_line" invisible="1"/>
<field name="name" widget="section_and_note_text"/>
<field name="display_type" invisible="1"/>
<field name="company_id" invisible="1"/>
<field
name="account_id"
options="{'no_create': True}"
groups="account.group_account_user"
domain="[('company_id', '=', parent.company_id), ('internal_type', '=', 'other'), ('deprecated', '=', False)]"
attrs="{'required': [('display_type', '=', False)]}"
/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('company_id', '=', parent.company_id)]"
context="{'default_partner_id': parent.partner_id}"
optional="show"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags" options="{'color_field': 'color'}"
optional="show"/>
<field name="quantity"/>
<field name="uom_id" string="UoM" groups="uom.group_uom" optional="show"/>
<field name="price_unit" string="Price"/>
<field name="discount" string="Disc.%" optional="hide"/>
<field name="invoice_line_tax_ids" widget="many2many_tags" options="{'no_create': True}" context="{'type':parent.type, 'tree_view_ref': 'account.account_tax_view_tree', 'search_view_ref': 'account.account_tax_view_search'}"
domain="[('type_tax_use','=','sale'),('company_id', '=', parent.company_id)]"/>
<field name="price_subtotal" string="Subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<field name="price_total" string="Total" groups="account.group_show_line_subtotals_tax_included"/>
<field name="currency_id" invisible="1"/>
</tree>
<kanban class="o_kanban_mobile">
<field name="name"/>
<field name="product_id"/>
<field name="price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<field name="price_total" groups="account.group_show_line_subtotals_tax_included"/>
<field name="quantity"/>
<field name="uom_id" groups="uom.group_uom"/>
<field name="price_unit"/>
<field name="display_type"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click {{ record.display_type.raw_value ? 'o_is_' + record.display_type.raw_value : '' }}">
<t t-if="!record.display_type.raw_value">
<div class="row">
<div class="col-8">
<strong>
<span>
<t t-esc="record.product_id.value"/>
</span>
</strong>
</div>
<div class="col-4">
<strong>
<span class="float-right text-right">
<t t-esc="record.price_subtotal.value" groups="account.group_show_line_subtotals_tax_excluded"/>
<t t-esc="record.price_total.value" groups="account.group_show_line_subtotals_tax_included"/>
</span>
</strong>
</div>
</div>
<div class="row">
<div class="col-12 text-muted">
<span>
Quantity:
<t t-esc="record.quantity.value"/>
<t t-esc="record.uom_id.value"/>
</span>
</div>
</div>
<div class="row">
<div class="col-12 text-muted">
<span>
Unit Price:
<t t-esc="record.price_unit.value"/>
</span>
</div>
</div>
</t>
<t t-if="record.display_type.raw_value === 'line_section' || record.display_type.raw_value === 'line_note'">
<div class="row">
<div class="col-12">
<span>
<t t-esc="record.name.value"/>
</span>
</div>
</div>
</t>
</div>
</t>
</templates>
</kanban>
</field>
<group class="oe_subtotal_footer oe_right">
<field name="amount_untaxed"/>
<field name="amount_tax"/>
<field name="amount_total" class="oe_subtotal_footer_separator"/>
<field name="payments_widget" colspan="2" nolabel="1" widget="payment"/>
<field name="residual" class="oe_subtotal_footer_separator" attrs="{'invisible': [('state', '=', 'draft')]}"/>
<field name="reconciled" invisible="1"/>
<field name="outstanding_credits_debits_widget" colspan="2" nolabel="1" widget="payment" attrs="{'invisible': [('state', 'not in', 'open')]}"/>
</group>
<field name="comment" placeholder="Terms and conditions..."/>
</page>
<page string="Other Info" name="other_info">
<group>
<group>
<field name="user_id"/>
<field name="journal_id" groups="account.group_account_user"
options="{'no_create': True}" attrs="{'readonly':[('move_name','!=',False)]}"/>
<field domain="[('company_id', '=', company_id),('internal_type','=', 'receivable'), ('deprecated', '=', False)]"
name="account_id" groups="account.group_account_user"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="move_id" groups="account.group_account_user" attrs="{'invisible': [('move_id', '=', False)]}"/>
</group>
<group>
<field name="incoterm_id" options="{'no_create': True}"/>
<field name="fiscal_position_id" options="{'no_create': True}" />
<field name="name"/>
<field name="origin" groups="base.group_user" attrs="{'invisible': [('origin', '=', False)]}"/>
<field name="reference" attrs="{'readonly':[('state','!=','draft')]}"/>
<!-- Since the same form view is used for customer invoices and credit notes,
we can't set a domain or a default value context on partner_bank_id. We must
rely on the onchange -->
<field name="partner_bank_id"/>
</group>
</group>
<field name="tax_line_ids">
<tree editable="bottom" string="Taxes" create="0">
<field name="name"/>
<!--Need invisible fields for on_change to create all necessary info -->
<field name="tax_id" invisible="1"/>
<field name="tax_ids" invisible="1"/>
<field name="sequence" invisible="1"/>
<field name="manual" invisible="1"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="amount" invisible="1"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="amount_rounding" invisible="1"/>
<field name="amount_total"/>
<field name="currency_id" invisible="1" force_save="1"/>
<field name="tax_repartition_line_id" invisible="1"/> <!--Needed in order for the onchange computing the taxes to keep the repartition lines-->
<field name="tag_ids" invisible="1"/> <!--Needed in order for the onchange computing the taxes to keep the tags-->
<field name="base" invisible="1"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="o_attachment_preview"/>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Custom reports (aka filters) -->
<record id="filter_invoice_salespersons" model="ir.filters">
<field name="name">By Salespersons</field>
<field name="model_id">account.invoice</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['date_invoice:month', 'user_id']}</field>
</record>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account.invoice.select</field>
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<search string="Search Invoice">
<field name="number" string="Invoice" filter_domain="['|','|','|', ('number','ilike',self), ('origin','ilike',self), ('reference', 'ilike', self), ('partner_id', 'child_of', self)]"/>
<filter domain="[('user_id','=',uid)]" name="myinvoices" help="My Invoices"/>
<field name="journal_id"/>
<separator/>
<filter name="draft" string="Draft" domain="[('state','=','draft')]"/>
<filter name="unpaid" string="Open" domain="[('state', '=', 'open')]"/>
<filter name="in_payment" string="In Payment" domain="[('state', '=', 'in_payment')]"/>
<filter name="paid" string="Paid" domain="[('state', '=', 'paid')]"/>
<filter name="late" string="Overdue" domain="['&amp;', ('date_due', '&lt;', time.strftime('%%Y-%%m-%%d')), ('state', '=', 'open')]" help="Overdue invoices, maturity date passed"/>
<separator/>
<field name="partner_id" operator="child_of"/>
<field name="user_id" string="Salesperson" domain="[('share','=', False)]"/>
<field name="date" string="Period"/>
<separator/>
<filter string="My Activities" name="activities_my"
domain="[('activity_ids.user_id', '=', uid)]"/>
<separator/>
<filter string="Late Activities" name="activities_overdue"
domain="[('activity_ids.date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records which has next action date is before today"/>
<filter string="Today Activities" name="activities_today"
domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="Future Activities" name="activities_upcoming_all"
domain="[('activity_ids.date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))
]"/>
<group expand="0" string="Group By">
<filter name="group_by_partner_id" string="Partner" context="{'group_by':'commercial_partner_id'}"/>
<filter string="Salesperson" name="salesperson" context="{'group_by':'user_id'}"/>
<filter name="status" string="Status" context="{'group_by':'state'}"/>
<separator/>
<filter string="Invoice Date" name="invoicedate" context="{'group_by':'date_invoice'}"/>
<filter string="Due Date" name="duedate" context="{'group_by':'date_due'}"/>
</group>
</search>
</field>
</record>
<record id="action_invoice_tree" model="ir.actions.act_window">
<field name="name">Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="view_id" ref="invoice_tree"/>
<field name="context">{'type':'out_invoice'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
</record>
<record id="action_invoice_refund_out_tree" model="ir.actions.act_window">
<field name="name">Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,form,kanban,calendar,graph,pivot</field>
<field name="view_id" ref="invoice_tree"/>
<field name="domain">[('type','in', ['out_invoice', 'out_refund']), ('state', 'not in', ['draft', 'cancel'])]</field>
<field name="context">{'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
</record>
<record id="action_invoice_refund_out_tree_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="invoice_tree"/>
<field name="act_window_id" ref="action_invoice_refund_out_tree"/>
</record>
<record id="action_invoice_refund_out_tree_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_form"/>
<field name="act_window_id" ref="action_invoice_refund_out_tree"/>
</record>
<record id="action_invoice_tree_pending_invoice" model="ir.actions.act_window">
<field name="name">Pending Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="view_id" ref="invoice_tree"/>
<field name="context">{'type':'out_invoice'}</field>
<field name="domain">[('state','=','draft')]</field>
<!-- <field name="search_view_id" ref="view_account_invoice_filter"/>-->
</record>
<record id="action_invoice_tree_view1" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="act_window_id" ref="action_invoice_tree"/>
</record>
<record id="action_invoice_tree_view2" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_form"/>
<field name="act_window_id" ref="action_invoice_tree"/>
</record>
<record id="action_invoice_tree1" model="ir.actions.act_window">
<field name="name">Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','out_invoice')]</field>
<field name="context">{'type':'out_invoice', 'journal_type': 'sale'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a customer invoice
</p><p>
Create invoices, register payments and keep track of the discussions with your customers.
</p>
</field>
</record>
<record id="action_invoice_tree1_view1" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="invoice_tree_with_onboarding"/>
<field name="act_window_id" ref="action_invoice_tree1"/>
</record>
<record id="action_invoice_tree1_view2" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_form"/>
<field name="act_window_id" ref="action_invoice_tree1"/>
</record>
<menuitem action="action_invoice_tree1" id="menu_action_invoice_tree1" parent="account.menu_finance_receivables" sequence="1"/>
<record id="action_invoice_out_refund" model="ir.actions.act_window">
<field name="name">Credit Notes</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','out_refund')]</field>
<field name="context">{'default_type': 'out_refund', 'type': 'out_refund', 'journal_type': 'sale'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a credit note
</p><p>
Note that the easiest way to create a credit note is to do it directly
from the customer invoice.
</p>
</field>
</record>
<record id="action_invoice_out_refund_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="invoice_tree"/>
<field name="act_window_id" ref="action_invoice_out_refund"/>
</record>
<record id="action_invoice_out_refund_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_form"/>
<field name="act_window_id" ref="action_invoice_out_refund"/>
</record>
<menuitem action="action_invoice_out_refund"
id="menu_action_invoice_out_refund"
parent="account.menu_finance_receivables"
sequence="1"/>
<record id="action_vendor_bill_template" model="ir.actions.act_window">
<field name="name">Vendor Bills</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','in_invoice')]</field>
<field name="context">{'default_type': 'in_invoice', 'type': 'in_invoice', 'journal_type': 'purchase'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Record a new vendor bill
</p>
</field>
</record>
<!--
server action opening the vendor bills and returning the right help tooltip
-->
<record id="action_invoice_tree2" model="ir.actions.server">
<field name="name">Bills</field>
<field name="model_id" ref="model_account_invoice"/>
<field name="state">code</field>
<field name="code">
action_values = env.ref('account.action_vendor_bill_template').read()[0]
new_help = model.complete_empty_list_help()
action_values.update({'help': action_values.get('help', '') + new_help})
action = action_values
</field>
</record>
<record id="action_invoice_supplier_tree1_view1" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="invoice_supplier_tree"/>
<field name="act_window_id" ref="action_vendor_bill_template"/>
</record>
<record id="action_invoice__supplier_tree1_view2" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_supplier_form"/>
<field name="act_window_id" ref="action_vendor_bill_template"/>
</record>
<menuitem action="action_invoice_tree2" id="menu_action_invoice_tree2" parent="account.menu_finance_payables" sequence="1"/>
<record id="action_invoice_in_refund" model="ir.actions.act_window">
<field name="name">Refund</field>
<field name="res_model">account.invoice</field>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','in_refund')]</field>
<field name="context">{'default_type': 'in_refund', 'type': 'in_refund', 'journal_type': 'purchase'}</field>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a vendor credit note
</p><p>
Note that the easiest way to create a vendor credit note it to do it directly from the vendor bill.
</p>
</field>
</record>
<record id="action_invoice_in_refund_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="invoice_supplier_tree"/>
<field name="act_window_id" ref="action_invoice_in_refund"/>
</record>
<record id="action_invoice_in_refund_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_supplier_form"/>
<field name="act_window_id" ref="action_invoice_in_refund"/>
</record>
<menuitem action="action_invoice_in_refund"
id="menu_action_invoice_in_refund"
parent="account.menu_finance_payables"
sequence="5"/>
<act_window
id="act_account_journal_2_account_invoice_opened"
name="Unpaid Invoices"
context="{'search_default_journal_id': [active_id], 'search_default_unpaid':1, 'default_journal_id': active_id}"
domain="[('journal_id','=', active_id)]"
res_model="account.invoice"
binding_model="account.journal"
binding_views="form"/>
</data>
</odoo>
@@ -124,12 +124,12 @@
<span>View</span>
</div>
<div>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'use_domain': [('type', '=', 'out_invoice')]}">Invoices</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'use_domain': [('type', '=', 'in_invoice')]}">Bills</a>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_invoice_type'}">Invoices</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_invoice_type'}">Bills</a>
</div>
<div>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'use_domain': [('type', '=', 'out_refund')], 'invoice_type': 'refund'}">Credit Notes</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'use_domain': [('type', '=', 'in_refund')], 'invoice_type': 'refund'}">Credit Notes</a>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_refund_type'}">Credit Notes</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_refund_type'}">Credit Notes</a>
</div>
<div>
<a type="object" name="action_open_reconcile">Payments Matching</a>
@@ -175,10 +175,10 @@
<span>View</span>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line', 'view_no_maturity': 1}">Journal Entries</a>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line'}">Journal Entries</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line', 'search_default_unposted': 1, 'view_no_maturity': 1}">Entries to Review</a>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line', 'search_default_unposted': 1}">Entries to Review</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
+647 -88
View File
@@ -5,7 +5,6 @@
<!-- VIEWS -->
<!-- account.move.line (Journal items) -->
<record id="view_move_line_form" model="ir.ui.view">
<field name="name">account.move.line.form</field>
<field name="model">account.move.line</field>
@@ -33,10 +32,9 @@
<group string="Accounting Documents">
<field name="move_id" attrs="{'readonly':[('parent_state','=','posted')]}"/>
<field name="statement_id" readonly="True" attrs="{'invisible': [('statement_id','=',False)]}"/>
<field name="invoice_id" attrs="{'invisible': [('invoice_id','=',False)]}"/>
</group>
<group string="Dates">
<field name="date"/>
<field name="date" groups="account.group_account_user"/>
<field name="date_maturity"/>
</group>
@@ -71,7 +69,6 @@
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags"/>
</group>
</group>
<field name="narration" colspan="4" nolabel="1" placeholder="Add an internal note..."/>
</page>
<page string="Analytic Lines" groups="analytic.group_analytic_accounting">
<field name="date" invisible="1"/>
@@ -153,8 +150,8 @@
<field name="currency_id" readonly="True" invisible="1" />
<field name="date_maturity"/>
<field name="company_currency_id" invisible="1"/>
<field name="parent_state" invisible="1"/>
</tree>
<field name="company_id" invisible="1"/>
<field name="parent_state" invisible="1"/></tree>
</field>
</record>
@@ -337,20 +334,48 @@
<field name="name">account.move.tree</field>
<field name="model">account.move</field>
<field name="arch" type="xml">
<tree decoration-info="state == 'draft'" string="Journal Entries">
<tree decoration-info="state == 'draft'" string="Journal Entries" decoration-muted="state == 'cancel'">
<field name="date"/>
<field name="name"/>
<field name="partner_id"/>
<field name="ref"/>
<field name="journal_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="amount" sum="Total Amount"/>
<field name="amount_total_signed" sum="Total Amount"/>
<field name="state"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
</record>
<record id="view_invoice_tree" model="ir.ui.view">
<field name="name">account.invoice.tree</field>
<field name="model">account.move</field>
<field name="arch" type="xml">
<tree decoration-info="state == 'draft'" string="Invoices" decoration-muted="state == 'cancel'" js_class="account_tree">
<field name="partner_id" invisible="1"/>
<field name="invoice_source_email" invisible="1"/>
<field name="invoice_vendor_icon" string=" "/>
<field name="invoice_vendor_display_name" groups="base.group_user" string="Vendor"/>
<field name="invoice_date"/>
<field name="name"/>
<field name="invoice_payment_ref"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="invoice_date_due"/>
<field name="invoice_origin"/>
<field name="amount_untaxed_signed" string="Tax Excluded" sum="Total"/>
<field name="amount_tax_signed" string="Tax" sum="Total"/>
<field name="amount_total_signed" string="Total" sum="Total"/>
<field name="amount_residual_signed" string="Amount Due" sum="Amount Due"/>
<field name="currency_id" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="state"/>
<field name="invoice_payment_state"/>
<field name="type" invisible="context.get('default_type', True)"/>
</tree>
</field>
</record>
<record id="view_account_move_kanban" model="ir.ui.view">
<field name="name">account.move.kanban</field>
<field name="model">account.move</field>
@@ -364,7 +389,7 @@
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div class="row mb4">
<div class="col-6">
<div class="col-6 o_kanban_record_headings">
<strong><span><field name="journal_id"/></span></strong>
</div>
<div class="col-6 text-right">
@@ -378,7 +403,7 @@
</div>
<div class="row">
<div class="col-6">
<span><field name="amount" widget='monetary'/></span>
<span><field name="amount_total" widget='monetary'/></span>
<span><field name="currency_id" invisible="1"/></span>
</div>
<div class="col-6">
@@ -398,89 +423,396 @@
<field name="name">account.move.form</field>
<field name="model">account.move</field>
<field name="arch" type="xml">
<form string="Account Entry" duplicate="false">
<form string="Account Entry">
<header>
<button name="action_post" states="draft" string="Post" type="object" class="oe_highlight" groups="account.group_account_invoice"/>
<button name="%(action_view_account_move_reversal)d" states="posted" string="Reverse Entry" type="action" groups="account.group_account_invoice"/>
<button name="action_duplicate" string="Duplicate" type="object" groups="account.group_account_invoice"/>
<field name="state" widget="statusbar"/>
<!-- Post -->
<button name="action_post" string="Post" class="oe_highlight"
type="object" groups="account.group_account_invoice"
attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
<button name="action_post" string="Validate" class="oe_highlight"
type="object" groups="account.group_account_invoice"
attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
<!-- Send (only invoices) -->
<button name="action_invoice_sent"
type="object"
string="Send &amp; Print"
attrs="{'invisible':['|', '|', '|', ('state', '!=', 'posted'), ('invoice_sent', '=', True), ('invoice_payment_state', '!=', 'not_paid'), ('type', 'not in', ('out_invoice', 'out_refund'))]}"
class="oe_highlight"
groups="base.group_user"/>
<button name="action_invoice_sent"
type="object"
string="Send &amp; Print"
attrs="{'invisible':['|', '|', '|', ('state', '!=', 'posted'), ('invoice_sent', '=', False), ('invoice_payment_state', '!=', 'not_paid'), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}"
groups="base.group_user"/>
<!-- Register Payment (only invoices / receipts) -->
<button name="action_invoice_register_payment" id="account_invoice_payment_btn"
type="object" class="oe_highlight"
attrs="{'invisible': ['|', '|', ('state', '!=', 'posted'), ('invoice_payment_state', '!=', 'not_paid'), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"
string="Register Payment"
groups="account.group_account_invoice"/>
<!-- Preview (only invoices) -->
<button name="preview_invoice" type="object" string="Preview"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}"/>
<!-- Reverse -->
<button name="%(action_view_account_move_reversal)d" string="Reverse Entry"
type="action" groups="account.group_account_invoice"
attrs="{'invisible': ['|', ('type', '!=', 'entry'), ('state', '!=', 'posted')]}"/>
<button name="action_reverse" string='Add Credit Note'
type='object' groups="account.group_account_invoice"
attrs="{'invisible': ['|', ('type', 'not in', ('out_invoice', 'in_invoice')), ('state', '!=', 'posted')]}"/>
<!-- Duplicate -->
<button name="action_duplicate" string="Duplicate" type="object" groups="account.group_account_invoice"
attrs="{'invisible': [('type', '!=', 'entry')]}"/>
<!-- Cancel -->
<field name="state" widget="statusbar" statusbar_visible="draft,posted"/>
</header>
<!-- Invoice outstanding credits -->
<div groups="account.group_account_invoice"
class="alert alert-info" role="alert" style="margin-bottom:0px;"
attrs="{'invisible': ['|', '|', ('type', 'not in', ('out_invoice', 'out_refund')), ('invoice_has_outstanding', '=', False), ('invoice_payment_state', '!=', 'not_paid')]}">
You have <bold><a class="alert-link" href="#outstanding" role="button">outstanding payments</a></bold> for this customer. You can allocate them to mark this invoice as paid.
</div>
<div groups="account.group_account_invoice"
class="alert alert-info" role="alert" style="margin-bottom:0px;"
attrs="{'invisible': ['|', '|', ('type', 'not in', ('in_invoice', 'in_refund')), ('invoice_has_outstanding', '=', False), ('invoice_payment_state', '!=', 'not_paid')]}">
You have <bold><a class="alert-link" href="#outstanding" role="button">outstanding debits</a></bold> for this supplier. You can allocate them to mark this bill as paid.
</div>
<!-- Invoice suspense accounts -->
<div groups="account.group_account_invoice" class="alert alert-info" role="alert" style="margin-bottom:0px;"
attrs="{'invisible': ['|', ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')), ('invoice_has_matching_supsense_amount','=',False)]}">
You have suspense account moves that match this invoice. <bold><button class="alert-link" type="object" name="action_open_matching_suspense_moves" role="button" string="Check them" style="padding: 0;vertical-align: baseline;"/></bold> to mark this invoice as paid.
</div>
<sheet>
<field name="tax_type_domain" invisible="1"/>
<field name="id" invisible="1"/>
<div class="oe_button_box">
<button name="action_view_reverse_entry"
type="object"
class="oe_stat_button"
icon="fa-refresh"
attrs="{'invisible': [('reverse_entry_id', '=', False)]}"
string="Reversed entry">
</button>
<div name="button_box" class="oe_button_box">
<button name="open_reconcile_view"
class="oe_stat_button"
icon="fa-bars"
type="object"
string="Reconciled entries">
class="oe_stat_button"
icon="fa-bars"
type="object"
attrs="{'invisible': ['|', ('type', '!=', 'entry'), ('id', '=', False)]}"
string="Reconciled entries">
</button>
</div>
<h1>
<field name="name" readonly="True" attrs="{'invisible':[('name','=','/')]}"/>
</h1>
<group>
<!-- Payment status for invoices / receipts -->
<div>
<span class="pull-right badge badge-success"
attrs="{'invisible': ['|', ('invoice_payment_state', '!=', 'paid'), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}">Paid</span>
<span class="pull-right badge badge-success"
attrs="{'invisible': ['|', ('invoice_payment_state', '!=', 'in_payment'), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}">In Payment</span>
</div>
<!-- Invisible fields -->
<field name="id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="invoice_payment_state" invisible="1" force_save="1"/>
<field name="invoice_filter_type_domain" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="commercial_partner_id" invisible="1"/>
<field name="bank_partner_id" invisible="1"/>
<field name="invoice_has_outstanding" invisible="1"/>
<field name="invoice_sent" invisible="1"/>
<field name="invoice_sequence_number_next_prefix" invisible="1"/>
<field name="invoice_sequence_number_next" invisible="1"/>
<field name="invoice_has_matching_supsense_amount" invisible="1"/>
<div>
<!-- Invoice draft header -->
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'out_invoice'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Invoice</span>
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'out_refund'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Credit Note</span>
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'in_invoice'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Bill</span>
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'in_refund'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Refund</span>
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'out_receipt'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Sales Receipt</span>
<span class="o_form_label" attrs="{'invisible': ['|', '|', ('type', '!=', 'in_receipt'), ('state', '!=', 'draft'), ('name', '!=', '/')]}">Draft Purchase Receipt</span>
<!-- Select next number header (only invoices) -->
<span class="o_form_label" attrs="{'invisible': [('invoice_sequence_number_next_prefix', '=', False)]}">- First Number:</span>
<!-- Number -->
<h1 class="mt0">
<field name="name" readonly="True" attrs="{'invisible':[('name', '=', '/')]}"/>
<!-- Select next number header (only invoices) -->
<div attrs="{'invisible': [('invoice_sequence_number_next_prefix', '=', False)]}">
<field name="invoice_sequence_number_next_prefix" class="oe_inline"/>
<field name="invoice_sequence_number_next" class="oe_inline"/>
</div>
</h1>
</div>
<group>
<field name="date"/>
<field name="ref" attrs="{'required': [('id', '==', False)]}"/>
</group>
<group>
<field name="journal_id" options="{'no_open': True, 'no_create': True}"/>
<field name="company_id" required="1" groups="base.group_multi_company"/>
<field name="amount" invisible="1" readonly="1"/>
<field name="currency_id" invisible="1"/>
</group>
</group>
<notebook>
<page string="Journal Items">
<field name="line_ids" widget="one2many"
context="{'line_ids': line_ids, 'journal_id': journal_id }">
<tree editable="bottom" string="Journal Items">
<field name="tax_line_id" invisible="1"/>
<field name="account_id" options="{'no_create': True}" domain="[('company_id', '=', parent.company_id), ('deprecated', '=', False)]"/>
<field name="partner_id"
domain="['|', ('parent_id', '=', False), ('is_company', '=', True)]"/>
<field name="name"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_tags" widget="many2many_tags"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="company_currency_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="currency_id" options="{'no_create': True}" groups="base.group_multi_currency"/>
<field name="debit" sum="Total Debit"/>
<field name="credit" sum="Total Credit"/>
<field name="tax_ids" string="Taxes Applied" widget="many2many_tags"
domain="[('type_tax_use', '=?', parent.tax_type_domain)]"
context="{'append_type_to_tax_name': not parent.tax_type_domain}"
options="{'no_create': True}"/>
<field name="date_maturity" required="0" invisible="context.get('view_no_maturity', False)"/>
<field name="recompute_tax_line" invisible="1" readonly="1"/>
<field name="tax_line_grouping_key" invisible="1" readonly="1"/>
<field name="tax_repartition_line_id" invisible="1"/> <!--Not to be removed, we need it so that the call to new() takes it into account when autocompleting the lines of a tax-->
<field name="tax_base_amount" invisible="1"/> <!--Not to be removed, we need it so that the call to new() takes it into account when autocompleting the lines of a tax-->
<field name="tag_ids" invisible="1"/>
</tree>
</field>
<field name="narration" colspan="4" placeholder="Add an internal note..." nolabel="1" height="50"/>
</page>
<page string="Other Info">
<group>
<field name="auto_post" attrs="{'readonly':[('reverse_entry_id', '!=', False)]}"/>
<field name="reverse_entry_id" attrs="{'invisible':True}"/>
<field name="to_check"/>
<group id="header_left_group">
<div class="o_td_label">
<label for="partner_id" string="Customer" style="font-weight:bold;"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'out_receipt'))]}"/>
<label for="partner_id" string="Vendor" style="font-weight:bold;"
attrs="{'invisible': [('type', 'not in', ('in_invoice', 'in_refund', 'in_receipt'))]}"/>
</div>
<field name="partner_id" widget="res_partner_many2one" nolabel="1"
context="{
'search_default_customer': context.get('type', 'entry') in ('out_invoice', 'out_refund', 'out_receipt'),
'search_default_supplier': context.get('type', 'entry') in ('in_invoice', 'in_refund', 'in_receipt'),
'default_customer': context.get('type', 'entry') in ('out_invoice', 'out_refund', 'out_receipt'),
'default_supplier': context.get('type', 'entry') in ('in_invoice', 'in_refund', 'in_receipt'),
'show_address': 1, 'default_is_company': True, 'show_vat': True}"
options='{"always_reload": True, "no_quick_create": True}'
attrs="{
'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]
}"/>
<!-- Invoice payment terms (only invoices) + due date (only invoices / receipts) -->
<label for="invoice_payment_term_id"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
<div attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}">
<field name="invoice_payment_term_id"
class="oe_inline"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
<span class="o_form_label oe_edit_only"
attrs="{'invisible': ['|', ('invoice_payment_term_id', '!=', False), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"> or </span>
<field name="invoice_date_due" force_save="1"
class="oe_inline"
attrs="{'invisible': ['|', ('invoice_payment_term_id', '!=', False), ('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
</div>
<field name="ref"
attrs="{'invisible': [('type', '=', 'out_invoice')]}"/>
<field name="invoice_vendor_bill_id"
attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('type', '!=', 'in_invoice')]}"
domain="[('company_id', '=', company_id), ('partner_id','child_of', [partner_id]), ('type','=','in_invoice')]"
string="Auto-Complete" placeholder="Select an old vendor bill"
options="{'no_create': True}" context="{'show_total_amount': True}"/>
</group>
</page>
</notebook>
<group id="header_right_group">
<field name="journal_id"
invisible="context.get('default_journal_id') and context.get('type', 'entry') != 'entry'"
groups="account.group_account_user"
options="{'no_create': True}"
domain="[('type', '=?', invoice_filter_type_domain)]"/>
<field name="date" string="Accounting Date"
attrs="{'invisible': [('type', 'in', ('out_invoice', 'out_refund', 'out_receipt')), ('state', '=', 'draft')]}"/>
<!-- Invoice date (only invoices / receipts) -->
<div class="o_td_label">
<label for="invoice_date" string="Invoice Date" style="font-weight:bold;"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'out_receipt'))]}"/>
<label for="invoice_date" string="Bill Date" style="font-weight:bold;"
attrs="{'invisible': [('type', 'not in', ('in_invoice', 'in_refund', 'in_receipt'))]}"/>
</div>
<field name="invoice_date" nolabel="1"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}"/>
<field name="currency_id"
groups="base.group_multi_currency"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}"/>
</group>
</group>
<notebook>
<page id="invoice_tab"
string="Invoice Lines"
attrs="{'invisible': [('type', '=', 'entry')]}">
<field name="invoice_line_ids"
widget="section_and_note_one2many"
mode="tree,kanban"
context="{'journal_id': journal_id, 'default_partner_id': commercial_partner_id, 'default_currency_id': currency_id != company_currency_id and currency_id or False}">
<tree editable="bottom" string="Journal Items">
<control>
<create name="add_line_control" string="Add a line"/>
<create name="add_section_control" string="Add a section" context="{'default_display_type': 'line_section'}"/>
<create name="add_note_control" string="Add a note" context="{'default_display_type': 'line_note'}"/>
</control>
<!-- Displayed fields -->
<field name="sequence" widget="handle"/>
<field name="product_id"/>
<field name="name" widget="section_and_note_text"/>
<field name="account_id"
groups="account.group_account_user"
domain="[('deprecated', '=', False), ('user_type_id.type', 'not in', ('receivable', 'payable'))]"
attrs="{'required': [('display_type', '=', False)]}"/>
<field name="analytic_account_id"
groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids"
groups="analytic.group_analytic_tags"
widget="many2many_tags"/>
<field name="quantity"/>
<field name="product_uom_id" string="UoM" groups="uom.group_uom"/>
<field name="price_unit" string="Price"/>
<field name="discount" string="Disc.%" groups="base.group_no_one"/>
<field name="tax_ids" widget="many2many_tags"
domain="[('type_tax_use', '=?', parent.invoice_filter_type_domain)]"
context="{'append_type_to_tax_name': not parent.invoice_filter_type_domain}"
options="{'no_create': True}"/>
<field name="price_subtotal"
string="Subtotal"
groups="account.group_show_line_subtotals_tax_excluded"/>
<field name="price_total"
string="Total"
groups="account.group_show_line_subtotals_tax_included"/>
<!-- Others fields -->
<field name="partner_id" invisible="1"/>
<field name="amount_currency" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="debit" invisible="1"/>
<field name="credit" invisible="1"/>
<field name="date_maturity" invisible="1"/>
<field name="tax_line_id" invisible="1"/>
<field name="tax_repartition_line_id" invisible="1"/>
<field name="tag_ids" invisible="1"/>
<field name="tax_base_amount" invisible="1"/>
<field name="tax_exigible" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="recompute_tax_line" invisible="1" force_save="1"/>
<field name="display_type" force_save="1" invisible="1"/>
<field name="is_rounding_line" invisible="1"/>
<field name="exclude_from_invoice_tab" invisible="1"/>
<field name="account_internal_type" invisible="1"/>
</tree>
</field>
<!-- Totals (only invoices / receipts) -->
<group class="oe_subtotal_footer oe_right"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt'))]}">
<field name="amount_untaxed"/>
<field name="amount_tax"/>
<field name="amount_total" class="oe_subtotal_footer_separator"/>
<field name="invoice_payments_widget" colspan="2" nolabel="1" widget="payment"/>
<field name="amount_residual" class="oe_subtotal_footer_separator"
attrs="{'invisible': [('state', '=', 'draft')]}"/>
<field name="invoice_outstanding_credits_debits_widget"
colspan="2" nolabel="1" widget="payment"
attrs="{'invisible': ['|', ('state', '!=', 'posted'), ('type', 'in', ('out_receipt', 'in_receipt'))]}"/>
</group>
<!-- Internal note -->
<field name="narration" placeholder="Add an internal note..." nolabel="1" height="50"/>
</page>
<page id="aml_tab" string="Journal Items" groups="account.group_account_user">
<field name="line_ids" widget="one2many_list"
context="{'line_ids': line_ids, 'journal_id': journal_id, 'default_partner_id': commercial_partner_id, 'default_currency_id': currency_id != company_currency_id and currency_id or False}">
<tree editable="bottom" string="Journal Items" decoration-muted="display_type in ('line_section', 'line_note')">
<!-- Displayed fields -->
<field name="account_id"
attrs="{
'required': [('display_type', 'not in', ('line_section', 'line_note'))],
'invisible': [('display_type', 'in', ('line_section', 'line_note'))],
}"/>
<field name="partner_id"
domain="['|', ('parent_id', '=', False), ('is_company', '=', True)]"
attrs="{'column_invisible': [('parent.type', '!=', 'entry')]}"/>
<field name="name" widget="section_and_note_text"/>
<field name="analytic_account_id"
groups="analytic.group_analytic_accounting"
attrs="{'invisible': [('display_type', 'in', ('line_section', 'line_note'))]}"/>
<field name="analytic_tag_ids"
groups="analytic.group_analytic_tags"
widget="many2many_tags"
attrs="{'invisible': [('display_type', 'in', ('line_section', 'line_note'))]}"/>
<field name="amount_currency"
groups="base.group_multi_currency"/>
<field name="currency_id" options="{'no_create': True}"
groups="base.group_multi_currency"
attrs="{'column_invisible': [('parent.type', '!=', 'entry')]}"/>
<field name="debit"
sum="Total Debit"
attrs="{'invisible': [('display_type', 'in', ('line_section', 'line_note'))]}"/>
<field name="credit"
sum="Total Credit"
attrs="{'invisible': [('display_type', 'in', ('line_section', 'line_note'))]}"/>
<field name="tax_ids" string="Taxes Applied" widget="many2many_tags"
domain="[('type_tax_use', '=?', parent.invoice_filter_type_domain)]"
context="{'append_type_to_tax_name': not parent.invoice_filter_type_domain}"
options="{'no_create': True}"
force_save="1"
attrs="{'readonly': [
'|', '|',
('display_type', 'in', ('line_section', 'line_note')),
('tax_line_id', '!=', False),
'&amp;',
('parent.type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')),
('account_internal_type', 'in', ('receivable', 'payable')),
]}"/>
<field name="date_maturity"
invisible="context.get('view_no_maturity')"
attrs="{'invisible': [('display_type', 'in', ('line_section', 'line_note'))]}"/>
<!-- Others fields -->
<field name="payment_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="quantity" invisible="1"/>
<field name="product_uom_id" invisible="1"/>
<field name="price_unit" invisible="1"/>
<field name="discount" invisible="1"/>
<field name="price_subtotal" invisible="1"/>
<field name="price_total" invisible="1"/>
<field name="sequence" invisible="1"/>
<field name="tax_line_id" invisible="1"/>
<field name="tax_repartition_line_id" invisible="1"/>
<field name="tag_ids" invisible="1"/>
<field name="tax_base_amount" invisible="1"/>
<field name="tax_exigible" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="company_currency_id" invisible="1"/>
<field name="recompute_tax_line" invisible="1" force_save="1"/>
<field name="display_type" force_save="1" invisible="1"/>
<field name="is_rounding_line" invisible="1"/>
<field name="exclude_from_invoice_tab" invisible="1"/>
<field name="account_internal_type" invisible="1"/>
</tree>
</field>
</page>
<page id="other_tab" string="Other Info" name="other_info"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}">
<group id="other_tab_group">
<group string="Sales Information"
name="sale_info_group"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund'))]}">
<field name="company_id" groups="base.group_multi_company"/>
<field name="invoice_user_id"/>
</group>
<group string="Accounting Information"
name="accounting_info_group"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}">
<field name="invoice_incoterm_id"/>
<field name="fiscal_position_id"/>
<field name="invoice_cash_rounding_id" groups="account.group_cash_rounding"/>
<field name="invoice_source_email"
widget="email"
attrs="{'invisible': ['|', ('type', 'not in', ('in_invoice', 'in_refund')), ('invoice_source_email', '=', False)]}"/>
</group>
<group string="Payments Information"
name="payments_info_group"
attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}">
<field name="invoice_payment_ref"/>
<field name="invoice_partner_bank_id"
domain="[('partner_id', '=', bank_partner_id)]"/>
</group>
</group>
</page>
<page id="other_tab_entry" string="Other Info" name="other_info"
attrs="{'invisible': [('type', '!=', 'entry')]}">
<group id="other_tab_entry_group">
<group name="misc_group">
<field name="auto_post"
attrs="{'invisible': [('type', '!=', 'entry')], 'readonly': [('reversed_entry_id', '!=', False)]}"/>
<field name="reversed_entry_id"
attrs="{'invisible': [('type', '!=', 'entry')]}"/>
</group>
</group>
</page>
</notebook>
</sheet>
<!-- Attachment preview -->
<div class="o_attachment_preview"
attrs="{'invisible': ['|', '|',
('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund')),
('state', '!=', 'draft')]}" />
<!-- Chatter -->
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
@@ -507,8 +839,6 @@
<separator/>
<field name="partner_id"/>
<field name="journal_id"/>
<field name="dummy_account_id"/>
<field name="reconcile_model_id"/>
<group expand="0" string="Group By">
<filter string="Partner" name="partner" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Journal" name="journal" domain="[]" context="{'group_by':'journal_id'}"/>
@@ -519,6 +849,49 @@
</field>
</record>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account.invoice.select</field>
<field name="model">account.move</field>
<field name="arch" type="xml">
<search string="Search Invoice">
<field name="name" string="Invoice"
filter_domain="['|','|','|', '|', ('name','ilike',self), ('invoice_origin','ilike',self), ('ref', 'ilike', self), ('invoice_payment_ref', 'ilike', self), ('partner_id', 'child_of', self)]"/>
<filter domain="[('invoice_user_id','=',uid)]" name="myinvoices" help="My Invoices"/>
<field name="journal_id"/>
<separator/>
<filter name="draft" string="Draft" domain="[('state','=','draft')]"/>
<filter name="unpaid" string="Open" domain="[('state', '=', 'posted'), ('invoice_payment_state', '=', 'not_paid')]"/>
<filter name="in_payment" string="In Payment" domain="[('invoice_payment_state', '=', 'in_payment')]"/>
<filter name="paid" string="Paid" domain="[('invoice_payment_state', '=', 'paid')]"/>
<filter name="late" string="Overdue" domain="['&amp;', ('invoice_date_due', '&lt;', time.strftime('%%Y-%%m-%%d')), ('state', '=', 'posted'), ('invoice_payment_state', '=', 'not_paid')]" help="Overdue invoices, maturity date passed"/>
<separator/>
<field name="partner_id" operator="child_of"/>
<field name="invoice_user_id" string="Salesperson" domain="[('share','=', False)]"/>
<field name="date" string="Period"/>
<separator/>
<filter string="My Activities" name="activities_my"
domain="[('activity_ids.user_id', '=', uid)]"/>
<separator/>
<filter string="Late Activities" name="activities_overdue"
domain="[('activity_ids.date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records which has next action date is before today"/>
<filter string="Today Activities" name="activities_today"
domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="Future Activities" name="activities_upcoming_all"
domain="[('activity_ids.date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))
]"/>
<group expand="0" string="Group By">
<filter name="group_by_partner_id" string="Partner" context="{'group_by':'commercial_partner_id'}"/>
<filter string="Salesperson" name="salesperson" context="{'group_by':'invoice_user_id'}"/>
<filter name="status" string="Status" context="{'group_by':'state'}"/>
<separator/>
<filter string="Invoice Date" name="invoicedate" context="{'group_by':'invoice_date'}"/>
<filter string="Due Date" name="duedate" context="{'group_by':'invoice_date_due'}"/>
</group>
</search>
</field>
</record>
<!-- ACTIONS -->
<!-- account.move.line (Journal Items) -->
@@ -558,9 +931,9 @@
view_id="account.view_move_line_tax_audit_tree"/>
<record id="action_account_moves_all_a" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_sales':1, 'name_groupby':1}</field>
<field name="name">Journal Items</field>
<field name="context">{'journal_type':'general', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_sales':1, 'name_groupby':1}</field> <field name="name">Journal Items</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -569,6 +942,7 @@
<field name="context">{'journal_type':'sales', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_sales':1, 'name_groupby':1}</field>
<field name="name">Sales</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_sales_purchases"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -577,6 +951,7 @@
<field name="context">{'journal_type':'purchase', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_purchases':1, 'name_groupby':1}</field>
<field name="name">Purchase</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_sales_purchases"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -585,6 +960,7 @@
<field name="context">{'journal_type':'bank', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_bank':1, 'search_default_cash':1, 'name_groupby':1}</field>
<field name="name">Bank and Cash</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_bank_cash"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -593,6 +969,7 @@
<field name="context">{'journal_type':'general', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_misc_filter':1, 'name_groupby':1}</field>
<field name="name">Miscellaneous</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_misc"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -601,6 +978,7 @@
<field name="context">{'journal_type':'general', 'search_default_group_by_account': 1, 'group_by':'account_id', 'search_default_posted':1}</field>
<field name="name">General Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_general"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -609,13 +987,50 @@
<field name="context">{'journal_type':'general', 'search_default_group_by_partner': 1, 'group_by':'partner_id', 'search_default_posted':1, 'search_default_payable':1, 'search_default_receivable':1, 'search_default_unreconciled':1}</field>
<field name="name">Partner Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_partner"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
<record id="action_account_moves_journal_bank_cash" model="ir.actions.act_window">
<field name="context">{'journal_type':'bank', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_bank':1, 'search_default_cash':1, 'name_groupby':1}</field>
<field name="name">Bank and Cash</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_bank_cash"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
<record id="action_account_moves_journal_misc" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_move': 1, 'group_by':'move_id', 'search_default_posted':1, 'search_default_misc_filter':1, 'name_groupby':1}</field>
<field name="name">Miscellaneous</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_misc"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
<record id="action_account_moves_ledger_general" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_account': 1, 'group_by':'account_id', 'search_default_posted':1}</field>
<field name="name">General Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_general"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
<record id="action_account_moves_ledger_partner" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_partner': 1, 'group_by':'partner_id', 'search_default_posted':1, 'search_default_payable':1, 'search_default_receivable':1, 'search_default_unreconciled':1}</field>
<field name="name">Partner Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree_grouped_partner"/>
</record>
<record id="action_account_moves_all_tree" model="ir.actions.act_window">
<field name="name">Journal Items</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="context">{'search_default_partner_id': [active_id], 'default_partner_id': active_id, 'search_default_posted':1}</field>
<field name="view_id" ref="view_move_line_tree"/>
</record>
@@ -624,6 +1039,7 @@
<field name="context">{'journal_type':'general', 'search_default_posted':1}</field>
<field name="name">Journal Items</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="view_move_line_tree"/>
<field name="view_mode">tree,pivot,graph,form,kanban</field>
</record>
@@ -632,6 +1048,7 @@
<field name="name">Journal Items</field>
<field name="view_mode">graph,pivot</field>
<field name="view_id" ref="account_move_line_graph_date"/>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="context">{'search_default_account_id': [active_id]}</field>
<field name="res_model">account.move.line</field>
</record>
@@ -640,6 +1057,7 @@
<field name="name">Journal Items</field>
<field name="view_mode">graph,pivot</field>
<field name="view_id" ref="account_move_line_graph_date"/>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="context">{'search_default_account_id': [active_id], 'search_default_posted': 1}</field>
<field name="res_model">account.move.line</field>
</record>
@@ -652,7 +1070,7 @@
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_move_tree"/>
<field name="search_view_id" ref="view_account_move_filter"/>
<field name="context">{'type': 'misc', 'search_default_misc_filter':1, 'view_no_maturity': True}</field>
<field name="context">{'default_type': 'entry', 'search_default_misc_filter':1, 'view_no_maturity': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a journal entry
@@ -663,6 +1081,111 @@
</field>
</record>
<record id="action_move_out_invoice_type" model="ir.actions.act_window">
<field name="name">Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'out_invoice')]</field>
<field name="context">{'default_type': 'out_invoice'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a customer invoice
</p><p>
Create invoices, register payments and keep track of the discussions with your customers.
</p>
</field>
</record>
<record id="action_move_out_refund_type" model="ir.actions.act_window">
<field name="name">Credit Notes</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'out_refund')]</field>
<field name="context">{'default_type': 'out_refund'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a credit note
</p><p>
Note that the easiest way to create a credit note is to do it directly
from the customer invoice.
</p>
</field>
</record>
<record id="action_move_in_invoice_type" model="ir.actions.act_window">
<field name="name">Bills</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'in_invoice')]</field>
<field name="context">{'default_type': 'in_invoice'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a vendor bill
</p><p>
Create invoices, register payments and keep track of the discussions with your vendors.
</p>
</field>
</record>
<record id="action_move_in_refund_type" model="ir.actions.act_window">
<field name="name">Refund</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'in_refund')]</field>
<field name="context">{'default_type': 'in_refund'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a vendor credit note
</p><p>
Note that the easiest way to create a vendor credit note it to do it directly from the vendor bill.
</p>
</field>
</record>
<record id="action_move_out_receipt_type" model="ir.actions.act_window">
<field name="name">Receipts</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'out_receipt')]</field>
<field name="context">{'default_type': 'out_receipt'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new sales receipt
</p><p>
When the sale receipt is confirmed, you can record the customer
payment related to this sales receipt.
</p>
</field>
</record>
<record id="action_move_in_receipt_type" model="ir.actions.act_window">
<field name="name">Receipts</field>
<field name="res_model">account.move</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="view_invoice_tree"/>
<field name="search_view_id" ref="view_account_invoice_filter"/>
<field name="domain">[('type', '=', 'in_receipt')]</field>
<field name="context">{'default_type': 'in_receipt'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Register a new purchase receipt
</p><p>
When the purchase receipt is confirmed, you can record the
vendor payment related to this purchase receipt.
</p>
</field>
</record>
<record id="action_move_line_form" model="ir.actions.act_window">
<field name="name">Entries</field>
<field name="type">ir.actions.act_window</field>
@@ -681,6 +1204,42 @@
<!-- MENUS -->
<menuitem
id="menu_action_move_out_invoice_type"
action="action_move_out_invoice_type"
parent="account.menu_finance_receivables"
sequence="1"/>
<menuitem
id="menu_action_move_out_refund_type"
action="action_move_out_refund_type"
parent="account.menu_finance_receivables"
sequence="1"/>
<menuitem
id="menu_action_move_out_receipt_type"
action="action_move_out_receipt_type"
parent="account.menu_finance_receivables"
sequence="1"/>
<menuitem
id="menu_action_move_in_invoice_type"
action="action_move_in_invoice_type"
parent="account.menu_finance_payables"
sequence="1"/>
<menuitem
id="menu_action_move_in_refund_type"
action="action_move_in_refund_type"
parent="account.menu_finance_payables"
sequence="1"/>
<menuitem
id="menu_action_move_in_receipt_type"
action="action_move_in_receipt_type"
parent="account.menu_finance_payables"
sequence="1"/>
<menuitem
id="menu_action_account_moves_all"
action="action_account_moves_all"
@@ -135,6 +135,7 @@
attrs="{'invisible':[('has_invoices','=',False)]}" icon="fa-bars"/>
<button class="oe_stat_button" name="open_payment_matching_screen"
string="Payment Matching" type="object"
groups="account.group_account_user"
attrs="{'invisible':[('move_reconciled','=',True)]}" icon="fa-university"/>
<field name="has_invoices" invisible="1"/>
<field name="move_reconciled" invisible="1"/>
@@ -145,7 +146,7 @@
</div>
<group>
<field name="invoice_ids" invisible="1"/>
<group name="partner_group" invisible="context.get('active_model') == 'account.invoice'">
<group name="partner_group" invisible="context.get('active_model') == 'account.move'">
<field name="payment_type" widget="radio"/>
<field name="partner_type" widget="selection" attrs="{'required': [('state', '=', 'draft'), ('payment_type', 'in', ('inbound', 'outbound'))], 'invisible': [('payment_type', 'not in', ('inbound', 'outbound'))]}"/>
<field name="partner_id" attrs="{'required': [('state', '=', 'draft'), ('payment_type', 'in', ('inbound', 'outbound'))], 'invisible': [('payment_type', 'not in', ('inbound', 'outbound'))]}" context="{'default_is_company': True, 'default_supplier': payment_type == 'outbound', 'default_customer': payment_type == 'inbound'}"/>
@@ -298,7 +299,7 @@
<record id="action_account_invoice_from_list" model="ir.actions.server">
<field name="name">Register Payment</field>
<field name="model_id" ref="account.model_account_payment"/>
<field name="binding_model_id" ref="account.model_account_invoice"/>
<field name="binding_model_id" ref="account.model_account_move"/>
<field name="state">code</field>
<field name="code">
action = model.action_register_payment()
@@ -6,7 +6,7 @@
<t t-else="">Invoices &amp; Bills</t>
</li>
<li t-if="invoice" class="breadcrumb-item active">
<t t-esc="invoice.number" t-if="invoice.number"/>
<t t-esc="invoice.name" t-if="invoice.name"/>
<t t-else=""><em>Draft Invoice</em></t>
</li>
</xpath>
@@ -46,13 +46,13 @@
<t t-foreach="invoices" t-as="invoice">
<tr>
<td>
<a t-att-href="invoice.get_portal_url()" t-att-title="invoice.number">
<t t-esc="invoice.number" t-if="invoice.number"/>
<a t-att-href="invoice.get_portal_url()" t-att-title="invoice.name">
<t t-esc="invoice.name" t-if="invoice.name"/>
<em t-else="">Draft Invoice</em>
</a>
</td>
<td><span t-field="invoice.date_invoice"/></td>
<td class='d-none d-md-table-cell'><span t-field="invoice.date_due"/></td>
<td><span t-field="invoice.invoice_date"/></td>
<td class='d-none d-md-table-cell'><span t-field="invoice.invoice_date_due"/></td>
<td class="tx_status">
<t t-if="invoice.state == 'open'">
<span class="badge badge-pill badge-info"><i class="fa fa-fw fa-clock-o" aria-label="Opened" title="Opened" role="img"></i><span class="d-none d-md-inline"> Waiting for Payment</span></span>
@@ -64,7 +64,7 @@
<span class="badge badge-pill badge-warning"><i class="fa fa-fw fa-remove" aria-label="Cancelled" title="Cancelled" role="img"></i><span class="d-none d-md-inline"> Cancelled</span></span>
</t>
</td>
<td class="text-right"><span t-esc="-invoice.residual if invoice.type == 'out_refund' else invoice.residual" t-options='{"widget": "monetary", "display_currency": invoice.currency_id}'/></td>
<td class="text-right"><span t-esc="-invoice.amount_residual if invoice.type == 'out_refund' else invoice.amount_residual" t-options='{"widget": "monetary", "display_currency": invoice.currency_id}'/></td>
</tr>
</t>
</tbody>
@@ -76,7 +76,7 @@
<xpath expr="//div[hasclass('o_portal_sidebar')]" position="inside">
<t t-set="o_portal_fullwidth_alert" groups="sales_team.group_sale_salesman">
<t t-call="portal.portal_back_in_edit_mode">
<t t-set="backend_url" t-value="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (invoice._name, invoice.id, invoice.env.ref('account.action_invoice_tree1').id)"/>
<t t-set="backend_url" t-value="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (invoice._name, invoice.id, invoice.env.ref('account.action_move_out_invoice_type').id)"/>
</t>
</t>
@@ -86,10 +86,10 @@
<t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
<t t-set="title">
<h2 class="mb-0">
<b t-if="invoice.residual > 0" t-field="invoice.residual"/>
<b t-if="invoice.amount_residual > 0" t-field="invoice.amount_residual"/>
<b t-else="1" t-field="invoice.amount_total"/>
</h2>
<div class="small" t-if="invoice.state != 'paid' and invoice.type == 'out_invoice'"><i class="fa fa-clock-o"/><span class="o_portal_sidebar_timeago ml4" t-att-datetime="invoice.date_due"/></div>
<div class="small" t-if="invoice.state != 'paid' and invoice.type == 'out_invoice'"><i class="fa fa-clock-o"/><span class="o_portal_sidebar_timeago ml4" t-att-datetime="invoice.invoice_date_due"/></div>
</t>
<t t-set="entries">
@@ -104,15 +104,15 @@
</div>
</div>
</li>
<li t-if="invoice.user_id" class="list-group-item flex-grow-1">
<li t-if="invoice.invoice_user_id" class="list-group-item flex-grow-1">
<div class="small mb-1"><strong class="text-muted">Salesperson</strong></div>
<div class="row">
<div class="col flex-grow-0 pr-2">
<img t-if="invoice.user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.user_id.image)" alt="Contact"/>
<img t-if="invoice.invoice_user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.invoice_user_id.image)" alt="Contact"/>
<img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
</div>
<div class="col pl-0">
<span t-field="invoice.user_id" t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
<span t-field="invoice.invoice_user_id" t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
<a data-toggle="modal" href="#" data-target="#invoice_chatter" class="small"><i class="fa fa-fw fa-comments"/><b>Send message</b></a>
</div>
</div>
+4 -4
View File
@@ -4,24 +4,24 @@
<!-- QWeb Reports -->
<report
id="account_invoices"
model="account.invoice"
model="account.move"
string="Invoices"
report_type="qweb-pdf"
name="account.report_invoice_with_payments"
file="account.report_invoice_with_payments"
attachment="(object.state in ('open','in_payment','paid')) and ('INV'+(object.number or '').replace('/','')+'.pdf')"
attachment="(object.state == 'posted') and ('INV'+(object.name or '').replace('/','')+'.pdf')"
print_report_name="(object._get_report_base_filename())"
groups="account.group_account_invoice"
/>
<report
id="account_invoices_without_payment"
model="account.invoice"
model="account.move"
string="Invoices without Payment"
report_type="qweb-pdf"
name="account.report_invoice"
file="account.report_invoice"
attachment="(object.state in ('open','in_payment','paid')) and ('INV'+(object.number or '').replace('/','')+'.pdf')"
attachment="(object.state == 'posted') and ('INV'+(object.name or '').replace('/','')+'.pdf')"
print_report_name="(object._get_report_base_filename())"
/>
+2 -6
View File
@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Accounts -->
<record id="view_account_form" model="ir.ui.view">
<field name="name">account.account.form</field>
<field name="model">account.account</field>
@@ -34,6 +30,7 @@
</form>
</field>
</record>
<record id="view_account_list" model="ir.ui.view">
<field name="name">account.account.list</field>
<field name="model">account.account</field>
@@ -97,6 +94,7 @@
</search>
</field>
</record>
<record id="action_account_form" model="ir.actions.act_window">
<field name="name">Chart of Accounts</field>
<field name="res_model">account.account</field>
@@ -225,7 +223,6 @@
</group>
<group>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="company_partner_id" invisible="1"/>
</group>
</group>
<notebook>
@@ -287,7 +284,6 @@
<group string="Accounting App Options" attrs="{'invisible': [('type', 'not in', ['bank', 'cash', 'sale', 'purchase'])]}">
<field name="profit_account_id" options="{'no_create': True}" attrs="{'invisible': [('type', '!=', 'cash')]}"/>
<field name="loss_account_id" options="{'no_create': True}" attrs="{'invisible': [('type', '!=', 'cash')]}"/>
<field name="group_invoice_lines" attrs="{'invisible': [('type', 'not in', ['sale', 'purchase'])]}"/>
<field name="post_at_bank_rec" attrs="{'invisible': [('type', 'not in', ['bank', 'cash'])]}"/>
</group>
<group name="group_alias" string="Email your Invoices/Bills" attrs="{'invisible': [('type', 'not in', ('sale' ,'purchase'))]}">
+25 -26
View File
@@ -10,13 +10,13 @@
</t>
<div class="page">
<h2>
<span t-if="o.type == 'out_invoice' and o.state in ('open', 'in_payment', 'paid')">Invoice</span>
<span t-if="o.type == 'out_invoice' and o.state == 'posted'">Invoice</span>
<span t-if="o.type == 'out_invoice' and o.state == 'draft'">Draft Invoice</span>
<span t-if="o.type == 'out_invoice' and o.state == 'cancel'">Cancelled Invoice</span>
<span t-if="o.type == 'out_refund'">Credit Note</span>
<span t-if="o.type == 'in_refund'">Vendor Credit Note</span>
<span t-if="o.type == 'in_invoice'">Vendor Bill</span>
<span t-field="o.number"/>
<span t-field="o.name"/>
</h2>
<div id="informations" class="row mt32 mb32">
@@ -24,17 +24,17 @@
<strong>Description:</strong>
<p class="m-0" t-field="o.name"/>
</div>
<div class="col-auto mw-100 mb-2" t-if="o.date_invoice" name="invoice_date">
<div class="col-auto mw-100 mb-2" t-if="o.invoice_date" name="invoice_date">
<strong>Invoice Date:</strong>
<p class="m-0" t-field="o.date_invoice"/>
<p class="m-0" t-field="o.invoice_date"/>
</div>
<div class="col-auto mw-100 mb-2" t-if="o.date_due and o.type == 'out_invoice' and o.state in ('open', 'in_payment', 'paid')" name="due_date">
<div class="col-auto mw-100 mb-2" t-if="o.invoice_date_due and o.type == 'out_invoice' and o.state in ('open', 'in_payment', 'paid')" name="due_date">
<strong>Due Date:</strong>
<p class="m-0" t-field="o.date_due"/>
<p class="m-0" t-field="o.invoice_date_due"/>
</div>
<div class="col-auto mw-100 mb-2" t-if="o.origin" name="origin">
<div class="col-auto mw-100 mb-2" t-if="o.invoice_origin" name="origin">
<strong>Source:</strong>
<p class="m-0" t-field="o.origin"/>
<p class="m-0" t-field="o.invoice_origin"/>
</div>
<div class="col-auto mw-100 mb-2" t-if="o.partner_id.ref" name="customer_code">
<strong>Customer Code:</strong>
@@ -76,10 +76,9 @@
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type" name="account_invoice_line_accountable">
<td name="account_invoice_line_name"><span t-field="line.name"/></td>
<td class="d-none"><span t-field="line.origin"/></td>
<td class="text-right">
<span t-field="line.quantity"/>
<span t-field="line.uom_id" groups="uom.group_uom"/>
<span t-field="line.product_uom_id" groups="uom.group_uom"/>
</td>
<td t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span t-field="line.price_unit"/>
@@ -88,7 +87,7 @@
<span t-field="line.discount"/>
</td>
<td t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.invoice_line_tax_ids))"/>
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_ids))"/>
</td>
<td class="text-right o_price_total">
<span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
@@ -136,7 +135,7 @@
</tr>
<t t-foreach="o.amount_by_group" t-as="amount_by_group">
<tr style="">
<t t-if="len(o.tax_line_ids) == 1 and o.amount_untaxed == amount_by_group[2]">
<t t-if="len(o.line_ids.filtered(lambda line: line.tax_line_id)) == 1 and o.amount_untaxed == amount_by_group[2]">
<td><span t-esc="amount_by_group[0]"/></td>
<td class="text-right o_price_total">
<span t-esc="amount_by_group[3]" />
@@ -165,24 +164,24 @@
</div>
</div>
</div>
<p t-if="o.reference">
Please use the following communication for your payment : <b><span t-field="o.reference"/></b>
<p>
Please use the following communication for your payment : <b><span t-field="o.invoice_payment_ref"/></b>
</p>
<p t-if="o.comment" name="comment">
<span t-field="o.comment"/>
<p t-if="o.narration" name="comment">
<span t-field="o.narration"/>
</p>
<p t-if="o.payment_term_id" name="payment_term">
<span t-field="o.payment_term_id.note"/>
<p t-if="o.invoice_payment_term_id" name="payment_term">
<span t-field="o.invoice_payment_term_id.note"/>
</p>
<p t-if="o.fiscal_position_id.note" name="note">
<span t-field="o.fiscal_position_id.note"/>
</p>
<div id="qrcode" t-if="(o.partner_id.country_id.code in ['BE', 'AT', 'DE', 'FI', 'NL']) and (o.company_id.qr_code) and (o.currency_id.name == 'EUR') and (o.partner_bank_id.acc_number != False)">
<p t-if="(o.partner_bank_id.qr_code_valid)">
<div id="qrcode" t-if="(o.partner_id.country_id.code in ['BE', 'AT', 'DE', 'FI', 'NL']) and (o.company_id.qr_code) and (o.currency_id.name == 'EUR') and (o.invoice_partner_bank_id.acc_number != False)">
<p t-if="(o.invoice_partner_bank_id.qr_code_valid)">
<strong class="text-center">Scan me with your banking app.</strong><br /><br />
<img class="border border-dark rounded" t-att-src="o.partner_bank_id.build_qr_code_url(o.residual,(o.reference) if (o.reference) else o.number)"/>
<img class="border border-dark rounded" t-att-src="o.invoice_partner_bank_id.build_qr_code_url(o.amount_residual,(o.ref) if (o.ref) else o.name)"/>
</p>
<p t-if="(o.partner_bank_id.qr_code_valid == False)">
<p t-if="(o.invoice_partner_bank_id.qr_code_valid == False)">
<strong class="text-center">The SEPA QR Code informations are not set correctly.</strong><br />
</p>
</div>
@@ -192,7 +191,7 @@
<template id="report_invoice_document_with_payments" inherit_id="account.report_invoice_document" primary="True">
<xpath expr="//div[@id='total']/div/table" position="inside">
<t t-set="payments_vals" t-value="o._get_payments_vals()"/>
<t t-set="payments_vals" t-value="o._get_reconciled_info_JSON_values()"/>
<t t-foreach="payments_vals" t-as="payment_vals">
<tr>
<td>
@@ -207,7 +206,7 @@
<tr class="border-black">
<td><strong>Amount Due</strong></td>
<td class="text-right">
<span t-field="o.residual"/>
<span t-field="o.amount_residual"/>
</td>
</tr>
</t>
@@ -217,7 +216,7 @@
<template id="report_invoice">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="lang" t-value="o.user_id.lang if o.type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
<t t-set="lang" t-value="o.invoice_user_id.lang if o.type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
<t t-call="account.report_invoice_document" t-lang="lang"/>
</t>
</t>
@@ -226,7 +225,7 @@
<template id="report_invoice_with_payments">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="lang" t-value="o.user_id.lang if o.type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
<t t-set="lang" t-value="o.invoice_user_id.lang if o.type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
<t t-call="account.report_invoice_document_with_payments" t-lang="lang"/>
</t>
</t>
@@ -43,7 +43,7 @@
</thead>
<tbody>
<tr t-foreach="o.reconciled_invoice_ids" t-as="inv">
<td><span t-field="inv.date_invoice"/></td>
<td><span t-field="inv.invoice_date"/></td>
<td><span t-field="inv.number"/></td>
<td class="text-right"><span t-field="inv.amount_total"/></td>
<td class="text-right"><span t-esc="o._get_invoice_payment_amount(inv)" t-options="{'widget': 'monetary', 'display_currency': inv.currency_id}"/></td>
-2
View File
@@ -4,8 +4,6 @@
from . import account_unreconcile
from . import account_invoice_import
from . import account_invoice_refund
from . import account_invoice_state
from . import account_validate_account_move
from . import pos_box
from . import account_move_reversal
@@ -8,18 +8,12 @@ class ImportInvoiceImportWizard(models.TransientModel):
_name = 'account.invoice.import.wizard'
_description = 'Import Your Vendor Bills from Files.'
def _get_default_journal_id(self):
return self.env['account.journal'].search([('type', '=', self.env.context.get('journal_type'))], limit=1)
attachment_ids = fields.Many2many('ir.attachment', string='Files')
journal_id = fields.Many2one(string="Journal", comodel_name="account.journal", required=True, domain="[('type', 'in', ('sale', 'purchase'))]", default=_get_default_journal_id, help="Journal where to generate the bills")
@api.multi
def _create_invoice_from_file(self, attachment):
self = self.with_context(default_journal_id=self.journal_id.id)
invoice_form = Form(self.env['account.invoice'], view='account.invoice_supplier_form')
invoice = invoice_form.save()
attachment.write({'res_model': 'account.invoice', 'res_id': invoice.id})
invoice = self.env['account.move'].create({})
attachment.write({'res_model': 'account.move', 'res_id': invoice.id})
invoice.message_post(attachment_ids=[attachment.id])
return invoice
@@ -35,18 +29,18 @@ class ImportInvoiceImportWizard(models.TransientModel):
if not self.attachment_ids:
raise UserError(_("No attachment was provided"))
invoices = self.env['account.invoice']
invoices = self.env['account.move']
for attachment in self.attachment_ids:
invoices += self._create_invoice(attachment)
form_view = self.env.context.get('journal_type') == 'purchase' and self.env.ref('account.invoice_supplier_form').id or self.env.ref('account.invoice_form').id
tree_view = self.env.context.get('journal_type') == 'purchase' and self.env.ref('account.invoice_supplier_tree').id or self.env.ref('account.invoice_tree').id
action_vals = {
'name': _('Generated Documents'),
'domain': [('id', 'in', invoices.ids)],
'res_model': 'account.invoice',
'views': [[tree_view, "tree"], [form_view, "form"]],
'view_type': 'form',
'res_model': 'account.move',
'views': [[False, "tree"], [False, "form"]],
'type': 'ir.actions.act_window',
'context': self.env.context,
}
if len(invoices) == 1:
action_vals.update({'res_id': invoices[0].id, 'view_mode': 'form'})
@@ -23,7 +23,7 @@
<field name="res_model">account.invoice.import.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{'type': 'in_invoice', 'default_journal_id': active_id}</field>
<field name="context">{'default_type': 'in_invoice', 'default_journal_id': active_id}</field>
</record>
</data>
</odoo>
@@ -1,132 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.tools.safe_eval import safe_eval
from odoo.exceptions import UserError
class AccountInvoiceRefund(models.TransientModel):
"""Credit Notes"""
_name = "account.invoice.refund"
_description = "Credit Note"
@api.model
def _get_reason(self):
context = dict(self._context or {})
active_id = context.get('active_id', False)
if active_id:
inv = self.env['account.invoice'].browse(active_id)
return inv.name
return ''
date_invoice = fields.Date(string='Credit Note Date', default=fields.Date.context_today, required=True)
date = fields.Date(string='Accounting Date')
description = fields.Char(string='Reason', required=True, default=lambda self: self._get_reason())
refund_only = fields.Boolean(string='Technical field to hide filter_refund in case invoice is partially paid', compute='_get_refund_only')
filter_refund = fields.Selection([('refund', 'Create a draft credit note (partial refunding)'), ('cancel', 'Cancel: create credit note and reconcile (full refunding)'), ('modify', 'Modify: create credit note, reconcile and create a new draft invoice')],
default='refund', string='Credit Method', required=True, help='Choose how you want to credit this invoice. You cannot Modify and Cancel if the invoice is already reconciled')
@api.depends('date_invoice')
@api.one
def _get_refund_only(self):
invoice_id = self.env['account.invoice'].browse(self._context.get('active_id',False))
if len(invoice_id.payment_move_line_ids) != 0 and invoice_id.state != 'paid':
self.refund_only = True
else:
self.refund_only = False
@api.multi
def compute_refund(self, mode='refund'):
inv_obj = self.env['account.invoice']
inv_tax_obj = self.env['account.invoice.tax']
inv_line_obj = self.env['account.invoice.line']
context = dict(self._context or {})
xml_id = False
for form in self:
created_inv = []
date = False
description = False
for inv in inv_obj.browse(context.get('active_ids')):
if inv.state in ['draft', 'cancel']:
raise UserError(_('Cannot create credit note for the draft/cancelled invoice.'))
if inv.reconciled and mode in ('cancel', 'modify'):
raise UserError(_('The invoice is already paid or reconciled with a credit note so you cannot reconcile it with a new credit note. You should rather unreconcile the current invoice or create a draft credit note.'))
date = form.date or False
description = form.description or inv.name
refund = inv.refund(form.date_invoice, date, description, inv.journal_id.id)
created_inv.append(refund.id)
if mode in ('cancel', 'modify'):
movelines = inv.move_id.line_ids
to_reconcile_ids = {}
to_reconcile_lines = self.env['account.move.line']
for line in movelines:
if line.account_id.id == inv.account_id.id:
to_reconcile_lines += line
to_reconcile_ids.setdefault(line.account_id.id, []).append(line.id)
if line.reconciled:
line.remove_move_reconcile()
refund.action_invoice_open()
for tmpline in refund.move_id.line_ids:
if tmpline.account_id.id == inv.account_id.id:
to_reconcile_lines += tmpline
to_reconcile_lines.filtered(lambda l: l.reconciled == False).reconcile()
if mode == 'modify':
invoice = inv.read(inv_obj._get_refund_modify_read_fields())
invoice = invoice[0]
del invoice['id']
invoice_lines = inv_line_obj.browse(invoice['invoice_line_ids'])
invoice_lines = inv_obj._refund_cleanup_lines(invoice_lines)
tax_lines = inv_tax_obj.browse(invoice['tax_line_ids'])
tax_lines = inv_obj._refund_cleanup_lines(tax_lines)
invoice.update({
'type': inv.type,
'date_invoice': form.date_invoice,
'state': 'draft',
'number': False,
'invoice_line_ids': invoice_lines,
'tax_line_ids': tax_lines,
'date': date,
'origin': inv.origin,
'fiscal_position_id': inv.fiscal_position_id.id,
})
for field in inv_obj._get_refund_common_fields():
if inv_obj._fields[field].type == 'many2one':
invoice[field] = invoice[field] and invoice[field][0]
else:
invoice[field] = invoice[field] or False
inv_refund = inv_obj.create(invoice)
body = _('Correction of <a href=# data-oe-model=account.invoice data-oe-id=%d>%s</a><br>Reason: %s') % (inv.id, inv.number, description)
inv_refund.message_post(body=body)
if inv_refund.payment_term_id.id:
inv_refund._onchange_payment_term_date_invoice()
created_inv.append(inv_refund.id)
xml_id = inv.type == 'out_invoice' and 'action_invoice_out_refund' or \
inv.type == 'out_refund' and 'action_invoice_tree1' or \
inv.type == 'in_invoice' and 'action_invoice_in_refund' or \
inv.type == 'in_refund' and 'action_invoice_tree2'
if xml_id:
result = self.env.ref('account.%s' % (xml_id)).read()[0]
if mode == 'modify':
# When refund method is `modify` then it will directly open the new draft bill/invoice in form view
if inv_refund.type == 'in_invoice':
view_ref = self.env.ref('account.invoice_supplier_form')
else:
view_ref = self.env.ref('account.invoice_form')
result['views'] = [(view_ref.id, 'form')]
result['res_id'] = inv_refund.id
else:
invoice_domain = safe_eval(result['domain'])
invoice_domain.append(('id', 'in', created_inv))
result['domain'] = invoice_domain
return result
return True
@api.multi
def invoice_refund(self):
data_refund = self.read(['filter_refund'])[0]['filter_refund']
return self.compute_refund(data_refund)
@@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_account_invoice_refund" model="ir.ui.view">
<field name="name">account.invoice.refund.form</field>
<field name="model">account.invoice.refund</field>
<field name="arch" type="xml">
<form string="Credit Note">
<group>
<group>
<field name="refund_only" invisible="1"/>
<field name="filter_refund" attrs="{'invisible': [('refund_only','=',True)]}" widget="radio"/>
</group>
<group>
<div attrs="{'invisible':['|',('refund_only','=',True),('filter_refund','!=','refund')]}" class="oe_grey" colspan="4">
You will be able to edit and validate this
credit note directly or keep it draft,
waiting for the document to be issued by
your supplier/customer.
</div>
<div attrs="{'invisible':['|',('refund_only','=',True),('filter_refund','!=','cancel')]}" class="oe_grey" colspan="4">
Use this option if you want to cancel an invoice you should not
have issued. The credit note will be created, validated and reconciled
with the invoice. You will not be able to modify the credit note.
</div>
<div attrs="{'invisible':['|',('refund_only','=',True),('filter_refund','!=','modify')]}" class="oe_grey" colspan="4">
Use this option if you want to cancel an invoice and create a new
one. The credit note will be created, validated and reconciled
with the current invoice. A new draft invoice will be created
so that you can edit it.
</div>
</group>
<group>
<field name="description"/>
</group>
<group>
<field name="date_invoice"/>
<field name="date" groups="base.group_no_one"/>
</group>
</group>
<footer>
<button string='Add Credit Note' name="invoice_refund" type="object" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_account_invoice_refund" model="ir.actions.act_window">
<field name="name">Credit Note</field>
<field name="res_model">account.invoice.refund</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_account_invoice_refund"/>
<field name="target">new</field>
</record>
</data>
</odoo>
+12 -6
View File
@@ -3,6 +3,7 @@
from odoo import api, fields, models, _
from odoo.addons.mail.wizard.mail_compose_message import _reopen
from odoo.exceptions import UserError
class AccountInvoiceSend(models.TransientModel):
@@ -14,17 +15,22 @@ class AccountInvoiceSend(models.TransientModel):
invoice_without_email = fields.Text(compute='_compute_invoice_without_email', string='invoice(s) that will not be sent')
is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print)
printed = fields.Boolean('Is Printed', default=False)
invoice_ids = fields.Many2many('account.invoice', 'account_invoice_account_invoice_send_rel', string='Invoices')
invoice_ids = fields.Many2many('account.move', 'account_move_account_invoice_send_rel', string='Invoices')
composer_id = fields.Many2one('mail.compose.message', string='Composer', required=True, ondelete='cascade')
template_id = fields.Many2one(
'mail.template', 'Use template', index=True,
domain="[('model', '=', 'account.invoice')]"
domain="[('model', '=', 'account.move')]"
)
@api.model
def default_get(self, fields):
res = super(AccountInvoiceSend, self).default_get(fields)
res_ids = self._context.get('active_ids')
invoices = self.env['account.move'].browse(res_ids).filtered(lambda move: move.is_invoice(include_receipts=True))
if not invoices:
raise UserError(_("You can only send invoices."))
composer = self.env['mail.compose.message'].create({
'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail',
})
@@ -38,7 +44,7 @@ class AccountInvoiceSend(models.TransientModel):
@api.onchange('invoice_ids')
def _compute_composition_mode(self):
for wizard in self:
wizard.composition_mode = 'comment' if len(wizard.invoice_ids) == 1 else 'mass_mail'
wizard.composition_mode = 'comment' if len(wizard.invoice_ids) == 1 else 'mass_mail'
@api.onchange('template_id')
def onchange_template_id(self):
@@ -50,7 +56,7 @@ class AccountInvoiceSend(models.TransientModel):
def _compute_invoice_without_email(self):
for wizard in self:
if wizard.is_email and len(wizard.invoice_ids) > 1:
invoices = self.env['account.invoice'].search([
invoices = self.env['account.move'].search([
('id', 'in', self.env.context.get('active_ids')),
('partner_id.email', '=', False)
])
@@ -67,13 +73,13 @@ class AccountInvoiceSend(models.TransientModel):
if self.is_email:
self.composer_id.send_mail()
if self.env.context.get('mark_invoice_as_sent'):
self.mapped('invoice_ids').write({'sent': True})
self.mapped('invoice_ids').write({'invoice_sent': True})
@api.multi
def _print_document(self):
""" to override for each type of models that will use this composer."""
self.ensure_one()
action = self.invoice_ids.invoice_print()
action = self.invoice_ids.action_invoice_print()
action.update({'close_on_report_download': True})
return action
@@ -2,7 +2,7 @@
<odoo>
<data>
<record model="ir.ui.view" id="account_invoice_send_wizard_form">
<record id="account_invoice_send_wizard_form" model="ir.ui.view">
<field name="name">account.invoice.send.form</field>
<field name="model">account.invoice.send</field>
<field name="groups_id" eval="[(4,ref('base.group_user'))]"/>
@@ -51,7 +51,7 @@
</group>
<group>
<field name="template_id" options="{'no_create': True, 'no_edit': True}"
context="{'default_model': 'account.invoice'}"/>
context="{'default_model': 'account.move'}"/>
</group>
</group>
</div>
@@ -79,7 +79,7 @@
name="Send"
id="invoice_send"
res_model="account.invoice.send"
binding_model="account.invoice"
binding_model="account.move"
binding_views="list"
view_mode="form"
target="new"
@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, api, _
from odoo.exceptions import UserError
class AccountInvoiceConfirm(models.TransientModel):
"""
This wizard will confirm the all the selected draft invoices
"""
_name = "account.invoice.confirm"
_description = "Confirm the selected invoices"
@api.multi
def invoice_confirm(self):
context = dict(self._context or {})
active_ids = context.get('active_ids', []) or []
for record in self.env['account.invoice'].browse(active_ids):
if record.state != 'draft':
raise UserError(_("Selected invoice(s) cannot be confirmed as they are not in 'Draft' state."))
record.action_invoice_open()
return {'type': 'ir.actions.act_window_close'}
@@ -1,30 +0,0 @@
<odoo>
<data>
<record id="account_invoice_confirm_view" model="ir.ui.view">
<field name="name">account.invoice.confirm.form</field>
<field name="model">account.invoice.confirm</field>
<field name="arch" type="xml">
<form string="Confirm Draft Invoices">
<p class="oe_grey">
Once draft invoices are confirmed, you will not be able
to modify them. The invoices will receive a unique
number and journal items will be created in your chart
of accounts.
</p>
<footer>
<button string="Confirm Invoices" name="invoice_confirm" type="object" default_focus="1" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<act_window id="action_account_invoice_confirm"
name="Confirm Draft Invoices"
res_model="account.invoice.confirm"
binding_model="account.invoice" binding_views="list"
view_mode="form" target="new"/>
</data>
</odoo>
+78 -10
View File
@@ -1,6 +1,9 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError
from odoo.tools.translate import _
class AccountMoveReversal(models.TransientModel):
"""
Account move reversal wizard, it cancel an account move by reversing it.
@@ -8,19 +11,84 @@ class AccountMoveReversal(models.TransientModel):
_name = 'account.move.reversal'
_description = 'Account Move Reversal'
@api.model
def _get_default_move(self):
if self._context.get('active_id'):
move = self.env['account.move'].browse(self._context['active_id'])
if move.state != 'posted' or move.type in ('out_refund', 'in_refund'):
raise UserError(_('Only posted journal entries being not already a refund can be reversed.'))
return move
return self.env['account.move']
@api.model
def _get_default_reason(self):
move = self._get_default_move()
return move and move.invoice_payment_ref or False
move_id = fields.Many2one('account.move', string='Journal Entry',
default=_get_default_move,
domain=[('state', '=', 'posted'), ('type', 'not in', ('out_refund', 'in_refund'))])
date = fields.Date(string='Reversal date', default=fields.Date.context_today, required=True)
reason = fields.Char(string='Reason', default=_get_default_reason)
refund_method = fields.Selection(selection=[
('refund', 'Create a draft credit note (partial refunding)'),
('cancel', 'Cancel: create credit note and reconcile (full refunding)'),
('modify', 'Create credit note, reconcile and create a new draft invoice (cancel)')
], default='refund', string='Credit Method', required=True,
help='Choose how you want to credit this invoice. You cannot "modify" nor "cancel" if the invoice is already reconciled.')
journal_id = fields.Many2one('account.journal', string='Use Specific Journal', help='If empty, uses the journal of the journal entry to be reversed.')
# related fields
residual = fields.Monetary(related='move_id.amount_residual')
currency_id = fields.Many2one(related='move_id.currency_id')
move_type = fields.Selection(related='move_id.type')
@api.multi
def reverse_moves(self):
ac_move_ids = self._context.get('active_ids', False)
res = self.env['account.move'].browse(ac_move_ids).reverse_moves(self.date, self.journal_id or False)
if res:
return {
'name': _('Reverse Moves'),
'type': 'ir.actions.act_window',
moves = self.move_id or self.env['account.move'].browse(self._context['active_ids'])
# Create default values.
default_values_list = []
for move in moves:
default_values_list.append({
'ref': _('Reversal of: %s') % move.name,
'invoice_payment_ref': self.reason,
'date': self.date or move.date,
'invoice_date': move.is_invoice(include_receipts=True) and (self.date or move.date) or False,
'journal_id': self.journal_id and self.journal_id.id or move.journal_id.id,
})
# Handle reverse method.
if self.refund_method == 'cancel' or (moves and moves[0].type == 'entry'):
new_moves = moves._reverse_moves(default_values_list, cancel=True)
elif self.refund_method == 'modify':
new_moves = moves._reverse_moves(default_values_list, cancel=True)
moves_vals_list = []
for move in moves.with_context(include_business_fields=True):
moves_vals_list.append(move.copy_data({
'invoice_payment_ref': move.name,
'date': self.date or move.date,
})[0])
new_moves = moves.create(moves_vals_list)
elif self.refund_method == 'refund':
new_moves = moves._reverse_moves(default_values_list)
else:
return
# Create action.
action = {
'name': _('Reverse Moves'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
}
if len(new_moves) == 1:
action.update({
'view_mode': 'form',
'res_id': new_moves.id,
})
else:
action.update({
'view_mode': 'tree,form',
'res_model': 'account.move',
'domain': [('id', 'in', res)],
}
return {'type': 'ir.actions.act_window_close'}
'domain': [('id', 'in', new_moves.ids)],
})
return action
@@ -1,18 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_account_move_reversal" model="ir.ui.view">
<field name="name">account.move.reversal.form</field>
<field name="model">account.move.reversal</field>
<field name="arch" type="xml">
<form string="Account Move Reversal">
<group col="4">
<field name="date"/>
<field name="journal_id"/>
<form string="Reverse Journal Entry">
<field name="residual" invisible="1"/>
<field name="move_type" invisible="1"/>
<group>
<group attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'in_invoice'))]}">
<field name="refund_method" widget="radio" attrs="{'readonly': [('residual', '=', 0)]}"/>
</group>
<group attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'in_invoice'))]}">
<div attrs="{'invisible':[('refund_method', '!=', 'refund')]}" class="oe_grey" colspan="4">
You will be able to edit and validate this
credit note directly or keep it draft,
waiting for the document to be issued by
your supplier/customer.
</div>
<div attrs="{'invisible':[('refund_method', '!=', 'cancel')]}" class="oe_grey" colspan="4">
Use this option if you want to cancel an invoice you should not
have issued. The credit note will be created, validated and reconciled
with the invoice. You will not be able to modify the credit note.
</div>
<div attrs="{'invisible':[('refund_method', '!=', 'modify')]}" class="oe_grey" colspan="4">
Use this option if you want to cancel an invoice and create a new
one. The credit note will be created, validated and reconciled
with the current invoice. A new draft invoice will be created
so that you can edit it.
</div>
</group>
<group>
<field name="move_id" readonly="context.get('active_id')" invisible="context.get('active_id')" />
<field name="reason" attrs="{'invisible': [('move_type', '==', 'entry')], 'reason': [('move_type', '==', 'entry')]}"/>
<field name="date" string="Refund Date" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'in_invoice'))]}"/>
<field name="date" attrs="{'invisible': [('move_type', 'in', ('out_invoice', 'in_invoice'))]}"/>
</group>
<group>
<field name="journal_id" attrs="{'invisible': [('move_type', 'not in', ('entry'))]}" />
</group>
</group>
<footer>
<button string="Reverse Moves" name="reverse_moves" type="object" class="btn-primary"/>
<button string='Reverse' name="reverse_moves" type="object" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
@@ -65,45 +65,18 @@ class AccountAnalyticDefault(models.Model):
return res
class AccountInvoiceLine(models.Model):
_inherit = "account.invoice.line"
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
@api.onchange('product_id', 'account_id')
def _onchange_product_id_account_id(self):
rec = self.env['account.analytic.default'].account_get(
product_id=self.product_id.id,
partner_id=self.invoice_id.commercial_partner_id.id,
partner_id=self.partner_id.id,
account_id=self.account_id.id,
user_id=self.invoice_id.user_id.id or self.env.uid,
date=self.invoice_id.date_due,
company_id=self.invoice_id.company_id.id,
user_id=self.env.uid,
date=self.date_maturity,
company_id=self.move_id.company_id.id
)
self.account_analytic_id = rec.analytic_id.id
self.analytic_tag_ids = rec.analytic_tag_ids.ids
def _set_additional_fields(self):
if not self.account_analytic_id or not self.analytic_tag_ids:
rec = self.env['account.analytic.default'].account_get(
product_id=self.product_id.id,
partner_id=self.invoice_id.commercial_partner_id.id,
account_id=self.account_id.id,
user_id=self.invoice_id.user_id.id or self.env.uid,
date=self.invoice_id.date_due,
company_id=self.invoice_id.company_id.id,
)
if rec:
if not self.account_analytic_id:
self.account_analytic_id = rec.analytic_id.id
if not self.analytic_tag_ids:
self.analytic_tag_ids = rec.analytic_tag_ids.ids
super(AccountInvoiceLine, self)._set_additional_fields()
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
@api.onchange('account_id', 'partner_id', 'product_id')
def _onchange_product_id_account_id_partner_id(self):
rec = self.env['account.analytic.default'].account_get(product_id=self.product_id.id, partner_id=self.partner_id.id, account_id=self.account_id.id, user_id=self.env.uid, date=self.move_id.date, company_id=self.company_id.id)
self.analytic_account_id = rec.analytic_id.id
self.analytic_tag_ids = rec.analytic_tag_ids.ids
+2 -23
View File
@@ -5,34 +5,12 @@
<field name="model">account.journal</field>
<field name="inherit_id" ref="account.view_account_journal_form"/>
<field name="arch" type="xml">
<field name="group_invoice_lines" position="after">
<field name="loss_account_id" position="after">
<field name="update_posted" groups="base.group_no_one"/>
</field>
</field>
</record>
<record id="invoice_form_cancel_inherit" model="ir.ui.view">
<field name="name">invoice.form.cancel.inherit</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_invoice_draft']" position="before">
<button name="action_invoice_cancel" type="object" states="draft,open,in_payment,paid" string="Cancel" groups="account.group_account_invoice"/>
</xpath>
</field>
</record>
<record id="invoice_supplier_cancel_form_inherit" model="ir.ui.view">
<field name="name">invoice.supplier.cancel.form.inherit</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_invoice_draft']" position="before">
<button name="action_invoice_cancel" type="object" states="draft,open,in_payment,paid" string="Cancel" groups="account.group_account_invoice"/>
</xpath>
</field>
</record>
<record id="bank_statement_draft_form_inherit" model="ir.ui.view">
<field name="name">bank.statement.draft.form.inherit</field>
<field name="model">account.bank.statement</field>
@@ -77,6 +55,7 @@
<field name="arch" type="xml">
<field name="state" position="before">
<button name="button_cancel" states="posted" string="Cancel Entry" type="object" groups="account.group_account_invoice"/>
<button name="button_draft" states="cancel" string="Reset to Draft" type="object" groups="account.group_account_invoice"/>
</field>
</field>
</record>
@@ -144,7 +144,7 @@ class AccountPayment(models.Model):
multi_stub = self.company_id.account_check_printing_multi_stub
invoices = self.reconciled_invoice_ids.sorted(key=lambda r: r.date_due)
invoices = self.reconciled_invoice_ids.sorted(key=lambda r: r.invoice_date_due)
debits = invoices.filtered(lambda r: r.type == 'in_invoice')
credits = invoices.filtered(lambda r: r.type == 'in_refund')
@@ -182,21 +182,21 @@ class AccountPayment(models.Model):
# Find the account.partial.reconcile which are common to the invoice and the payment
if invoice.type in ['in_invoice', 'out_refund']:
invoice_sign = 1
invoice_payment_reconcile = invoice.move_id.line_ids.mapped('matched_debit_ids').filtered(lambda r: r.debit_move_id in self.move_line_ids)
invoice_payment_reconcile = invoice.line_ids.mapped('matched_debit_ids').filtered(lambda r: r.debit_move_id in self.move_line_ids)
else:
invoice_sign = -1
invoice_payment_reconcile = invoice.move_id.line_ids.mapped('matched_credit_ids').filtered(lambda r: r.credit_move_id in self.move_line_ids)
invoice_payment_reconcile = invoice.line_ids.mapped('matched_credit_ids').filtered(lambda r: r.credit_move_id in self.move_line_ids)
if self.currency_id != self.journal_id.company_id.currency_id:
amount_paid = abs(sum(invoice_payment_reconcile.mapped('amount_currency')))
else:
amount_paid = abs(sum(invoice_payment_reconcile.mapped('amount')))
amount_residual = invoice_sign * invoice.residual
amount_residual = invoice_sign * invoice.amount_residual
return {
'due_date': format_date(self.env, invoice.date_due),
'number': invoice.reference and invoice.number + ' - ' + invoice.reference or invoice.number,
'due_date': format_date(self.env, invoice.invoice_date_due),
'number': invoice.ref and invoice.name + ' - ' + invoice.ref or invoice.name,
'amount_total': formatLang(self.env, invoice_sign * invoice.amount_total, currency_obj=invoice.currency_id),
'amount_residual': formatLang(self.env, amount_residual, currency_obj=invoice.currency_id) if amount_residual * 10**4 != 0 else '-',
'amount_paid': formatLang(self.env, invoice_sign * amount_paid, currency_obj=invoice.currency_id),
@@ -16,8 +16,8 @@ class TestPrintCheck(AccountingTestCase):
def setUp(self):
super(TestPrintCheck, self).setUp()
self.invoice_model = self.env['account.invoice']
self.invoice_line_model = self.env['account.invoice.line']
self.invoice_model = self.env['account.move']
self.invoice_line_model = self.env['account.move.line']
self.payment_model = self.env['account.payment']
self.partner_axelor = self.env.ref("base.res_partner_2")
@@ -31,26 +31,23 @@ class TestPrintCheck(AccountingTestCase):
self.bank_journal.check_manual_sequencing = True
def create_invoice(self, amount=100, is_refund=False):
invoice = self.invoice_model.create({
invoice = self.env['account.move'].with_context(default_type=is_refund and 'out_refund' or 'in_invoice').create({
'partner_id': self.partner_axelor.id,
'name': is_refund and "Supplier Refund" or "Supplier Invoice",
'type': is_refund and "out_refund" or "in_invoice",
'account_id': self.account_payable.id,
'date_invoice': time.strftime('%Y') + '-06-26',
'invoice_date': time.strftime('%Y') + '-06-26',
'date': time.strftime('%Y') + '-06-26',
'invoice_line_ids': [
(0, 0, {
'product_id': self.product.id,
'quantity': 1,
'price_unit': is_refund and amount / 4 or amount,
})
]
})
self.invoice_line_model.create({
'product_id': self.product.id,
'quantity': 1,
'price_unit': is_refund and amount / 4 or amount,
'invoice_id': invoice.id,
'name': 'something',
'account_id': self.account_expenses.id,
})
invoice.action_invoice_open()
invoice.post()
return invoice
def create_payment(self, invoices):
payment_register = Form(self.env['account.payment'].with_context(active_model='account.invoice', active_ids=invoices.ids))
payment_register = Form(self.env['account.payment'].with_context(active_model='account.move', active_ids=invoices.ids))
payment_register.payment_date = time.strftime('%Y') + '-07-15'
payment_register.journal_id = self.bank_journal
payment_register.payment_method_id = self.payment_method_check
@@ -60,8 +57,8 @@ class TestPrintCheck(AccountingTestCase):
def test_print_check(self):
# Make a payment for 10 invoices and 5 credit notes
invoices = self.env['account.invoice']
for i in range(0, 42):
invoices = self.env['account.move']
for i in range(0, 15):
invoices |= self.create_invoice(is_refund=(i % 3 == 0))
payment = self.create_payment(invoices)
self.assertEqual(all(payment.mapped('check_amount_in_words')), True, 'The amount in words is not set on all the payments')
@@ -76,7 +73,7 @@ class TestPrintCheck(AccountingTestCase):
self.assertEqual(len(report_pages), 1)
def test_from_register(self):
invoices = self.env['account.invoice']
invoices = self.env['account.move']
for i in range(0, 3):
invoices |= self.create_invoice(is_refund=(i % 3 == 0))
payment = self.create_payment(invoices)
@@ -26,13 +26,13 @@
<!-- Amounts. -->
<ram:SpecifiedLineTradeAgreement>
<t t-set="taxes"
t-value="line.invoice_line_tax_ids.compute_all(
t-value="line.tax_ids.compute_all(
line.price_unit,
currency=line.currency_id,
quantity=line.quantity,
product=line.product_id,
partner=record.partner_id,
is_refund=line.invoice_id.type in ('in_refund', 'out_refund'))"/>
is_refund=line.move_id.type in ('in_refund', 'out_refund'))"/>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount
t-att-currencyID="currency.name"
@@ -55,7 +55,7 @@
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<t t-foreach="line.invoice_line_tax_ids" t-as="tax">
<t t-foreach="line.tax_ids" t-as="tax">
<ram:ApplicableTradeTax t-if="tax.amount_type == 'percent'">
<ram:RateApplicablePercent t-esc="tax.amount"/>
</ram:ApplicableTradeTax>
@@ -118,13 +118,13 @@
<!-- Document Headers. -->
<rsm:ExchangedDocument>
<ram:ID t-esc="record.reference"/>
<ram:ID t-esc="record.ref"/>
<ram:TypeCode t-esc="'381' if 'refund' in record.type else '380'"/>
<ram:IssueDateTime>
<udt:DateTimeString format="102" t-esc="format_date(record.date_invoice)"/>
<udt:DateTimeString format="102" t-esc="format_date(record.invoice_date)"/>
</ram:IssueDateTime>
<ram:IncludedNote t-if="record.comment">
<ram:Content t-esc="record.comment"/>
<ram:IncludedNote t-if="record.narration">
<ram:Content t-esc="record.narration"/>
</ram:IncludedNote>
</rsm:ExchangedDocument>
@@ -166,7 +166,7 @@
<!-- Reference. -->
<ram:BuyerOrderReferencedDocument>
<ram:IssuerAssignedID t-esc="'%s: %s' % (record.number, record.name) if record.name else record.number"/>
<ram:IssuerAssignedID t-esc="'%s: %s' % (record.name, record.invoice_payment_ref) if record.invoice_payment_ref else record.name"/>
</ram:BuyerOrderReferencedDocument>
</ram:ApplicableHeaderTradeAgreement>
@@ -184,32 +184,32 @@
<ram:ApplicableHeaderTradeSettlement>
<!-- Bank account. -->
<ram:SpecifiedTradeSettlementPaymentMeans t-if="record.partner_bank_id.acc_type == 'iban'">
<ram:SpecifiedTradeSettlementPaymentMeans t-if="record.invoice_partner_bank_id.acc_type == 'iban'">
<ram:PayeePartyCreditorFinancialAccount>
<ram:IBANID t-esc="record.partner_bank_id.sanitized_acc_number"/>
<ram:IBANID t-esc="record.invoice_partner_bank_id.sanitized_acc_number"/>
</ram:PayeePartyCreditorFinancialAccount>
</ram:SpecifiedTradeSettlementPaymentMeans>
<!-- Tax Summary. -->
<t t-foreach="record.tax_line_ids" t-as="tax_line">
<t t-foreach="record.line_ids.filtered(lambda line: line.tax_line_id)" t-as="tax_line">
<ram:ApplicableTradeTax>
<ram:CalculatedAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(tax_line.amount, currency)"/>
t-esc="format_monetary(tax_line.price_unit, currency)"/>
<ram:BasisAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(tax_line.base, currency)"/>
t-esc="format_monetary(tax_line.tax_base_amount, currency)"/>
<ram:RateApplicablePercent
t-if="tax_line.tax_id.amount_type == 'percent'"
t-esc="tax_line.tax_id.amount"/>
t-if="tax_line.tax_line_id.amount_type == 'percent'"
t-esc="tax_line.tax_line_id.amount"/>
</ram:ApplicableTradeTax>
</t>
<!-- Payment Term. -->
<ram:SpecifiedTradePaymentTerms>
<ram:Description t-if="record.payment_term_id" t-esc="record.payment_term_id.name"/>
<ram:DueDateDateTime t-if="record.date_due">
<udt:DateTimeString t-esc="format_date(record.date_due)"/>
<ram:Description t-if="record.invoice_payment_term_id" t-esc="record.invoice_payment_term_id.name"/>
<ram:DueDateDateTime t-if="record.invoice_date_due">
<udt:DateTimeString t-esc="format_date(record.invoice_date_due)"/>
</ram:DueDateDateTime>
</ram:SpecifiedTradePaymentTerms>
@@ -220,7 +220,7 @@
t-esc="format_monetary(record.amount_untaxed, currency)"/>
<ram:TaxBasisTotalAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(sum(record.tax_line_ids.mapped('base')), currency)"/>
t-esc="format_monetary(sum(record.line_ids.filtered(lambda line: line.tax_line_id).mapped('price_unit')), currency)"/>
<ram:TaxTotalAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(record.amount_tax, currency)"/>
@@ -229,10 +229,10 @@
t-esc="format_monetary(record.amount_total, currency)"/>
<ram:TotalPrepaidAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(record.amount_total - record.residual, currency)"/>
t-esc="format_monetary(record.amount_total - record.amount_residual, currency)"/>
<ram:DuePayableAmount
t-att-currencyID="currency.name"
t-esc="format_monetary(record.residual, currency)"/>
t-esc="format_monetary(record.amount_residual, currency)"/>
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
</ram:ApplicableHeaderTradeSettlement>
</rsm:SupplyChainTradeTransaction>
+1 -1
View File
@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*-
from . import account_invoice
from . import account_move
from . import ir_actions_report
@@ -3,12 +3,11 @@
from odoo import api, models, fields, tools, _
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, float_repr
from odoo.tests.common import Form
from odoo.exceptions import UserError
from odoo.exceptions import UserError, except_orm
from datetime import datetime
from lxml import etree
from PyPDF2 import PdfFileReader
from collections import namedtuple
import io
import base64
@@ -20,9 +19,8 @@ _logger = logging.getLogger(__name__)
DEFAULT_FACTURX_DATE_FORMAT = '%Y%m%d'
class AccountInvoice(models.Model):
_inherit = 'account.invoice'
_name = 'account.invoice'
class AccountMove(models.Model):
_inherit = 'account.move'
@api.multi
def _export_as_facturx_xml(self):
@@ -58,17 +56,42 @@ class AccountInvoice(models.Model):
'''
amount_total_import = None
# type must be present in the context to get the right behavior of the _default_journal method (account.invoice).
# journal_id must be present in the context to get the right behavior of the _default_account method (account.invoice.line).
journal_id = self._default_journal()
self_ctx = self.with_context(journal_id=journal_id.id)
if self._context.get('default_journal_id'):
journal = self.env['account.journal'].browse(self.env.context['default_journal_id'])
default_type = 'out_invoice' if journal.type == 'sale' else 'in_invoice'
elif self._context.get('default_type'):
default_type = self._context['default_type']
else:
raise UserError(_("No information about the journal or the type of invoice is passed"))
# Total amount.
elements = tree.xpath('//ram:GrandTotalAmount', namespaces=tree.nsmap)
total_amount = elements and float(elements[0].text) or 0.0
# Refund type.
# There is two modes to handle refund in Factur-X:
# a) type_code == 380 for invoice, type_code == 381 for refund, all positive amounts.
# b) type_code == 380, negative amounts in case of refund.
# To handle both, we consider the 'a' mode and switch to 'b' if a negative amount is encountered.
elements = tree.xpath('//rsm:ExchangedDocument/ram:TypeCode', namespaces=tree.nsmap)
type_code = elements[0].text
if type_code == '381':
default_type = 'out_refund' if default_type == 'out_invoice' else 'in_refund'
refund_sign = -1
else:
# Handle 'b' refund mode.
if total_amount < 0:
default_type = 'out_refund' if default_type == 'out_invoice' else 'in_refund'
refund_sign = -1 if 'refund' in default_type else 1
# Write the type as the journal entry is already created.
self.type = default_type
# self could be a single record (editing) or be empty (new).
view = journal_id.type == 'purchase' and 'account.invoice_supplier_form' or 'account.invoice_form'
with Form(self_ctx, view=view) as invoice_form:
with Form(self.with_context(default_type=default_type)) as invoice_form:
# Partner (first step to avoid warning 'Warning! You must first select a partner.').
partner_type = journal_id.type == 'purchase' and 'SellerTradeParty' or 'BuyerTradeParty'
partner_type = invoice_form.journal_id.type == 'purchase' and 'SellerTradeParty' or 'BuyerTradeParty'
elements = tree.xpath('//ram:'+partner_type+'/ram:SpecifiedTaxRegistration/ram:ID', namespaces=tree.nsmap)
partner = elements and self.env['res.partner'].search([('vat', '=', elements[0].text)], limit=1)
if not partner:
@@ -84,35 +107,21 @@ class AccountInvoice(models.Model):
# Reference.
elements = tree.xpath('//rsm:ExchangedDocument/ram:ID', namespaces=tree.nsmap)
if elements:
invoice_form.reference = elements[0].text
invoice_form.ref = elements[0].text
# Name.
elements = tree.xpath('//ram:BuyerOrderReferencedDocument/ram:IssuerAssignedID', namespaces=tree.nsmap)
if elements:
invoice_form.name = elements[0].text
invoice_form.invoice_payment_ref = elements[0].text
# Comment.
elements = tree.xpath('//ram:IncludedNote/ram:Content', namespaces=tree.nsmap)
if elements:
invoice_form.comment = elements[0].text
# Refund type.
# There is two modes to handle refund in Factur-X:
# a) type_code == 380 for invoice, type_code == 381 for refund, all positive amounts.
# b) type_code == 380, negative amounts in case of refund.
# To handle both, we consider the 'a' mode and switch to 'b' if a negative amount is encountered.
elements = tree.xpath('//rsm:ExchangedDocument/ram:TypeCode', namespaces=tree.nsmap)
type_code = elements[0].text
refund_sign = type_code == '380' and 1 or -1
invoice_form.narration = elements[0].text
# Total amount.
elements = tree.xpath('//ram:GrandTotalAmount', namespaces=tree.nsmap)
if elements:
total_amount = float(elements[0].text)
# Handle 'b' refund mode.
if total_amount < 0 and type_code == '380':
refund_sign = -1
# Currency.
if elements[0].attrib.get('currencyID'):
@@ -129,16 +138,14 @@ class AccountInvoice(models.Model):
if elements:
date_str = elements[0].text
date_obj = datetime.strptime(date_str, DEFAULT_FACTURX_DATE_FORMAT)
invoice_form.date_invoice = date_obj.strftime(DEFAULT_SERVER_DATE_FORMAT)
invoice_form.invoice_date = date_obj.strftime(DEFAULT_SERVER_DATE_FORMAT)
# Due date.
elements = tree.xpath('//ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString', namespaces=tree.nsmap)
if elements:
date_str = elements[0].text
date_obj = datetime.strptime(date_str, DEFAULT_FACTURX_DATE_FORMAT)
# Set to empty record set to avoid readonly on date_due, can not set to False or None in a Form
invoice_form.payment_term_id = self.env['account.payment.term']
invoice_form.date_due = date_obj.strftime(DEFAULT_SERVER_DATE_FORMAT)
invoice_form.invoice_date_due = date_obj.strftime(DEFAULT_SERVER_DATE_FORMAT)
# Invoice lines.
elements = tree.xpath('//ram:IncludedSupplyChainTradeLineItem', namespaces=tree.nsmap)
@@ -188,19 +195,19 @@ class AccountInvoice(models.Model):
# Taxes
line_elements = element.xpath('.//ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent', namespaces=tree.nsmap)
invoice_line_form.invoice_line_tax_ids.clear()
invoice_line_form.tax_ids.clear()
for tax_element in line_elements:
percentage = float(tax_element.text)
tax = self.env['account.tax'].search([
('company_id', '=', invoice_form.company_id.id),
('amount_type', '=', 'percent'),
('type_tax_use', '=', journal_id.type),
('type_tax_use', '=', invoice_form.journal_id.type),
('amount', '=', percentage),
], limit=1)
if tax:
invoice_line_form.invoice_line_tax_ids.add(tax)
invoice_line_form.tax_ids.add(tax)
elif amount_total_import:
# No lines in BASICWL.
with invoice_form.invoice_line_ids.new() as invoice_line_form:
@@ -208,12 +215,6 @@ class AccountInvoice(models.Model):
invoice_line_form.quantity = 1
invoice_line_form.price_unit = amount_total_import
# Refund.
if self_ctx.env.context['journal_type'] == 'purchase':
invoice_form.type = 'in_refund' if refund_sign == -1 else 'in_invoice'
else:
invoice_form.type = 'out_refund' if refund_sign == -1 else 'out_invoice'
return invoice_form.save()
@api.multi
@@ -221,7 +222,7 @@ class AccountInvoice(models.Model):
def message_post(self, **kwargs):
# OVERRIDE
# /!\ 'default_res_id' in self._context is used to don't process attachment when using a form view.
res = super(AccountInvoice, self).message_post(**kwargs)
res = super(AccountMove, self).message_post(**kwargs)
if 'no_new_invoice' not in self.env.context and len(self) == 1 and self.state == 'draft':
# Get attachments.
@@ -280,7 +281,8 @@ class AccountInvoice(models.Model):
self._import_facturx_invoice(tree)
buffer.close()
except except_orm as e:
raise e
except Exception as e:
# Malformed pdf
_logger.exception(e)
@@ -13,9 +13,9 @@ class IrActionsReport(models.Model):
@api.multi
def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None):
# OVERRIDE
if self.model == 'account.invoice' and res_ids and len(res_ids) == 1:
invoice = self.env['account.invoice'].browse(res_ids)
if invoice.type in ('out_invoice', 'out_refund') and invoice.state != 'draft':
if self.model == 'account.move' and res_ids and len(res_ids) == 1:
invoice = self.env['account.move'].browse(res_ids)
if invoice.is_sale_document() and invoice.state != 'draft':
xml_content = invoice._export_as_facturx_xml()
# Add attachment.
@@ -19,7 +19,7 @@ class PaymentPortal(http.Controller):
:return html: form containing all values related to the acquirer to
redirect customers to the acquirer website """
invoice_sudo = request.env['account.invoice'].sudo().browse(invoice_id)
invoice_sudo = request.env['account.move'].sudo().browse(invoice_id)
if not invoice_sudo:
return False
@@ -63,7 +63,7 @@ class PaymentPortal(http.Controller):
if access_token:
params['access_token'] = access_token
invoice_sudo = request.env['account.invoice'].sudo().browse(invoice_id).exists()
invoice_sudo = request.env['account.move'].sudo().browse(invoice_id).exists()
if not invoice_sudo:
params['error'] = 'pay_invoice_invalid_doc'
return request.redirect(_build_url_w_params(error_url, params))
@@ -36,7 +36,7 @@ class AccountTaxPython(models.Model):
return super(AccountTaxPython, self)._compute_amount(base_amount, price_unit, quantity, product, partner)
@api.multi
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False):
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True):
taxes = self.filtered(lambda r: r.amount_type != 'code')
company = self.env.company
for tax in self.filtered(lambda r: r.amount_type == 'code'):
@@ -45,7 +45,7 @@ class AccountTaxPython(models.Model):
safe_eval(tax.python_applicable, localdict, mode="exec", nocopy=True)
if localdict.get('result', False):
taxes += tax
return super(AccountTaxPython, taxes).compute_all(price_unit, currency, quantity, product, partner, is_refund=is_refund)
return super(AccountTaxPython, taxes).compute_all(price_unit, currency, quantity, product, partner, is_refund=is_refund, handle_price_include=handle_price_include)
class AccountTaxTemplatePython(models.Model):
@@ -19,7 +19,7 @@ class ReportAssertAccount(models.AbstractModel):
"""
returns the list of invoices that are set as reconciled = True
"""
return self.env['account.invoice'].search([('reconciled', '=', True)]).ids
return self.env['account.move'].search([('reconciled', '=', True)]).ids
def order_columns(item, cols=None):
"""
-41
View File
@@ -1,41 +0,0 @@
Odoo Invoicing
--------------
Send professional invoices & get paid online with the Odoo
<a href="https://www.odoo.com/page/billing">billing software</a>.
Create and send professional looking invoices & get paid online. It
automatically integrates with other apps to bill automatically based on your
activities.
Send Invoices With No Effort
----------------------------
Send invoices directly to your clients in just a click. The invoice is
automatically attached to the email as a PDF file.
Get Paid Faster with Electronic invoicing
-----------------------------------------
Get paid online with paypal or other payment processing service. Get rid of the
stress of having to constantly remind your debtors. Simply set-up and automate
follow-ups to get paid quickly.
Connect Your Bank Accounts
--------------------------
Import your bank statements and reconcile them in just a few clicks. Prepare
payment orders based on your supplier invoices and payment terms.
Analyse Your Sales & Costs
--------------------------
Get direct access to key information with dynamic and customizable dashboards.
Analyse your invoicing by product, customer, salesperson, etc.
Integration With Other Apps
---------------------------
Bill automatically based on sales orders, delivery orders, contracts or on time
and material. Define recurrencies to produce recurring invoice automatically.
-4
View File
@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
-23
View File
@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name' : 'Sales & Purchases Receipts',
'version' : '1.0',
'summary': 'Manage your debts and credits thanks to simple sale/purchase receipts',
'description': """
This module allows you recording sales and purchases receipts. Receipts are useful when the payment is done directly. Thanks to the receipts, no need to encode an invoice and a payment, the receipt is enough.
""",
'category': 'Accounting',
'sequence': 20,
'depends' : ['account'],
'demo' : [],
'data' : [
'security/ir.model.access.csv',
'views/account_voucher_views.xml',
'security/account_voucher_security.xml',
'data/account_voucher_data.xml',
],
'auto_install': False,
'installable': True,
}
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<!-- Voucher-related subtypes for messaging / Chatter -->
<record id="mt_voucher_state_change" model="mail.message.subtype">
<field name="name">Status Change</field>
<field name="res_model">account.voucher</field>
<field name="default" eval="False"/>
<field name="description">Status changed</field>
</record>
</data>
</odoo>
@@ -1,676 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-09-21 13:17+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid " * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid "In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-556
View File
@@ -1,556 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
# Andre de Kock <adekock11@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.saas~18\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-20 09:52+0000\n"
"PO-Revision-Date: 2017-09-20 09:52+0000\n"
"Last-Translator: Andre de Kock <adekock11@gmail.com>, 2017\n"
"Language-Team: Afrikaans (https://www.transifex.com/odoo/teams/41243/af/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: af\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_date
msgid "Accounting Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_subtotal
msgid "Amount"
msgstr "Bedrag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_analytic_id
msgid "Analytic Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Kanselleer"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Gekanselleer"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:159
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Click to create a sale receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Click to register a purchase receipt."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_company_id
msgid "Company"
msgstr "Maatskappy"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_uid
msgid "Created by"
msgstr "Geskep deur"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_date
msgid "Created on"
msgstr "Geskep op"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_currency_id
msgid "Currency"
msgstr "Geldeenheid"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Klient"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Datum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_name
msgid "Description"
msgstr "Beskrywing"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_display_name
msgid "Display Name"
msgstr "Vertoningsnaam"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Groepeer deur"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher___last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line___last_update
msgid "Last Modified on"
msgstr "Laas Gewysig op"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_uid
msgid "Last Updated by"
msgstr "Laas Opgedateer deur"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_date
msgid "Last Updated on"
msgstr "Laas Opgedateer op"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Vennoot"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_name
msgid "Payment Reference"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:195
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:198
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_product_id
msgid "Product"
msgstr "Produk"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_quantity
msgid "Quantity"
msgstr "Hoeveelheid"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_sequence
msgid "Sequence"
msgstr "Volgorde"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Stand"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_amount
msgid "Tax Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_amount
msgid "Total"
msgstr "Totaal"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_voucher_type
msgid "Type"
msgstr "Soort"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_unit
msgid "Unit Price"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Bevestig"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:97
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:377
#, python-format
msgid "You must first select a partner!"
msgstr ""
-555
View File
@@ -1,555 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.saas~18\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-20 09:52+0000\n"
"PO-Revision-Date: 2017-09-20 09:52+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Amharic (https://www.transifex.com/odoo/teams/41243/am/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: am\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_date
msgid "Accounting Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_subtotal
msgid "Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_analytic_id
msgid "Analytic Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "መሰረዝ"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "ተሰርዟል"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:159
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Click to create a sale receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Click to register a purchase receipt."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_company_id
msgid "Company"
msgstr "ድርጅት"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_uid
msgid "Created by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_date
msgid "Created on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_currency_id
msgid "Currency"
msgstr "ገንዘብ"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "ተባባሪ"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_name
msgid "Description"
msgstr "ማብራርያ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_display_name
msgid "Display Name"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "በመደብ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_id
msgid "ID"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher___last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line___last_update
msgid "Last Modified on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_date
msgid "Last Updated on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "ተባባሪ"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_name
msgid "Payment Reference"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:195
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:198
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_product_id
msgid "Product"
msgstr "እቃ"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_quantity
msgid "Quantity"
msgstr "ብዛት"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_sequence
msgid "Sequence"
msgstr "ቅደም ተከተል"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "ሁኔታው"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_amount
msgid "Tax Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_amount
msgid "Total"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_voucher_type
msgid "Type"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_unit
msgid "Unit Price"
msgstr "የአንዱ ዋጋ"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:97
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:377
#, python-format
msgid "You must first select a partner!"
msgstr ""
-708
View File
@@ -1,708 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
# Sadig Adam <sadig41@gmail.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# hamza tayseer atieh <hamza.atieh@minervadata.com>, 2018
# Osoul <baruni@osoul.ly>, 2018
# Mohammed Albasha <m.albasha.ma@gmail.com>, 2018
# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018
# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# amal ahmed <amalalhashemy88@hotmail.com>, 2018
# Abd El-Rahman Ali <abdelrahman.ali.242@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Ahmed Yousif <ahmed.yousif@outlook.com>, 2018
# Husam Migdadi <samwatson18@gmail.com>, 2018
# Mostafa Hanafy <mostafa.s.hanafy@gmail.com>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-08-24 09:15+0000\n"
"Last-Translator: Mostafa Hanafy <mostafa.s.hanafy@gmail.com>, 2018\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
"* تستخدم الحالة `مسودة` عندما يشفر المستخدم قسيمة جديدة.\n"
"* تستخدم الحالة Pro-forma عندما لاتحوي القسيمة رقما\n"
"* تستخدم الحالة `مرسل` عند انشاء المستخدم لقسيمة، ويولد رقم للقسيمة ويتم انشاء مدخلات القسيمة في حساب\n"
"* تستخدم الحالة `ملغاة عندما يلغي المستخدم القسيمة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "الحساب"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "تاريخ القيد"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "تاريخ المحاسبة"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "السند المحاسبي"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "الإجراء المطلوب"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "القيمة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "الحساب التحليلي"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "الوسوم التحليلية"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "هل ترغب حقاً في إلغاء هذا الإيصال؟"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "عدد المرفقات"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "تاريخ الفاتورة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "بيانات الوثيقة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "مرجع الفاتورة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "إلغاء"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "إلغاء الإيصال"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "ملغي"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "لا يمكن حذف قسيمة (s) التي تم فتحها بالفعل أو المدفوعة."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "المؤسسة"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "الشركات المرتبطة بهذه اليومية"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "أنشئ بواسطة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "أنشئ في"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "العملة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "العميل"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "التاريخ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "الوصف"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "اسم العرض"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "مسودة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "القسائم الإفتراضية"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "تاريخ الاستحقاق"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "تاريخ فعال للمدخلات المحاسبية"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "المتابعون"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "المتابعون (القنوات)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "المتابعون (الشركاء)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr "يعطي تسلسل لهذا السطر عندما يتم عرض الايصال"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "تجميع حسب"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "المعرف"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "إذا تم تحديده ، فإن بعض الرسائل بها خطأ في التسليم."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr "في حالة وجود مشكلة بالتقريب للضريبة استخدم هذا الحقل لتصحيحه"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "ملاحظات داخلية"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "متابع"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "دفتر اليومية"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "قيد يومية"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "عناصر اليومية"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "آخر تعديل في"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "آخر تحديث بواسطة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "آخر تحديث في"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "المرفق الرئيسي"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr "خطأ في تسليم الرسائل"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "الرسائل"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "ملاحظات"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "الرقم"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "عدد الإجراءات"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr "عدد الاخطاء"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "عدد الرسائل التي تتطلب اجراء"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "عدد الرسائل مع خطأ في التسليم"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "عدد الرسائل الجديدة"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr "السعر لا يشمل الضريبة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "مدفوع"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "الشريك"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "الدفع مباشرة"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr "الدفع لاحقاً"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "دفع"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "طرق السداد"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "الرجاء تفعيل التسلسل لليومية المختارة!"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "من فضلك حدد تسلسل في دفتر اليومية."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "تم"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "نشر القسيمة"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "أولى"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "المنتج"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "الشراء"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "ايصال الشراء"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "قسائم الشراء"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "الكمية"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "الإيصالات"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "المبيعات"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "بيانات المبيعات"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "استلام المبيعات"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "بحث الإيصالات"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "التسلسل"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "تعيين كمسودة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "الحالة"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "تغيير الحالة"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "الحالة تغيرت"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "الضريبة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "قيمة الضريبة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr "تصحيح الضريبة"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "لقد تم دفع القسيمة بالكامل"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "حساب الايراد أو حساب المصروف مرتبط بالمنتج المُختار."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr "مرجع الشريك لهذا المستند"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "للمراجعة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "الإجمالي"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "إجمالي المبلغ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "النوع"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "سعر الوحدة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "الرسائل الجديدة"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "عدد الرسائل الجديدة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "اعتماد"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "المورّد"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr "ايصال المجهز"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "قيد"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "قيود الإيصال"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "خطوط القسيمة"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "احصائيات القسيمة"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "قيود الإيصالات"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "رسائل الموقع"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "سجل تواصل الموقع"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
"عند تاكييد وصل الشراء يمكنك تسجيل\n"
"دفعة المجهز المتعلقة بوصل الشراء هذا."
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
"عند تأكييد وصل البيع يمكنك تسجيل دفعة العميل \n"
"المتعلقة بوصل البيع هذا."
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-679
View File
@@ -1,679 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-08-24 09:15+0000\n"
"Language-Team: Azerbaijani (https://www.transifex.com/odoo/teams/41243/az/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: az\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-555
View File
@@ -1,555 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.saas~18\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-20 09:52+0000\n"
"PO-Revision-Date: 2017-09-20 09:52+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Bulgarian (https://www.transifex.com/odoo/teams/41243/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_date
msgid "Accounting Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_subtotal
msgid "Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_analytic_id
msgid "Analytic Account"
msgstr "Аналитична сметка"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Откажи"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Отказанa"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:159
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Click to create a sale receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Click to register a purchase receipt."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_company_id
msgid "Company"
msgstr "Фирма"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_uid
msgid "Created by"
msgstr "Създадено от"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_date
msgid "Created on"
msgstr "Създадено на"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_currency_id
msgid "Currency"
msgstr "Валута"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Клиент"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_name
msgid "Description"
msgstr "Описание"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_display_name
msgid "Display Name"
msgstr "Име за показване"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Групиране по"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher___last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line___last_update
msgid "Last Modified on"
msgstr "Последно променено на"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_uid
msgid "Last Updated by"
msgstr "Последно обновено от"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_date
msgid "Last Updated on"
msgstr "Последно обновено на"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Партньор"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_name
msgid "Payment Reference"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:195
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:198
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_product_id
msgid "Product"
msgstr "Продукт"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_quantity
msgid "Quantity"
msgstr "Количество"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_sequence
msgid "Sequence"
msgstr "Последователност"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Състояние"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_amount
msgid "Tax Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_amount
msgid "Total"
msgstr "Общо"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_voucher_type
msgid "Type"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_unit
msgid "Unit Price"
msgstr "Единична цена"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:97
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:377
#, python-format
msgid "You must first select a partner!"
msgstr ""
-684
View File
@@ -1,684 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux, 2018
# Boško Stojaković <bluesoft83@gmail.com>, 2018
# Bole <bole@dajmi5.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-09-21 13:17+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2018\n"
"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: bs\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Konto"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Datum knjiženja"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "Račun knjigovodstva"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Potrebna akcija"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Iznos"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Analitički konto"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Analitičke oznake"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Jeste li sigurni da želite otkazati ovu potvrdu?"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "Broj zakački"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Datum računa"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Informacije računa"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "Referenca računa"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Otkaži"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Otkaži račun"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Otkazan"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "Otvorene ili plaćene račune nije moguće izbrisati."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Kompanija"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Kompanija za koju se vodi ovaj dnevnik"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Valuta"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Kupac"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Datum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Opis"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "U pripremi"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Računi u pripremi"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Datum dospijeća"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "Efektivni datum za računovodstvene zapise"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Pratioci"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "Pratioci (Kanali)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "Pratioci (Partneri)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Grupiši po"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Ako je označeno nove poruke će zahtjevati vašu pažnju."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Ako je zakačeno, nove poruke će zahtjevati vašu pažnju"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Interne zabilješke"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "Je pratilac"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Dnevnik knjiženja"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Dnevnički zapis"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Stavke dnevnika"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "Glavna zakačka"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Poruke"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Zabilješke"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Broj"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Broj akcija"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Broj poruka koje zahtjevaju neku akciju"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Broj nepročitanih poruka"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr "Samo za porez koji nije u cijeni"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Plaćeno"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Partner"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Plati direktno"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Plaćanje"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Metoda plaćanja"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "Molimo aktivirajte sekvencu odabrnog dnevnika!"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Molimo definišite sekvencu na dnevniku."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Proknjižen"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "Knjiženi računi"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Pro-forma"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Proizvod"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Nabava"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Računi nabavke"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "Račun nabavke"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Količina"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Prijemi"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Prodaja"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Informacije o prodaji"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Račun prodaje"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "Pretraži račune"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Sekvenca"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Postavi u pripremu"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Status"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Promjena statusa"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Promijenjen status"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Porez"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Iznos poreza"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "Račun je plaćen u potpunosti."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "Račun prihoda ili troškova vezan za odabrani proizvod."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Za provjeru"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "Ukupno"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Ukupan iznos"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Tip"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Jedinična cijena"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Nepročitane poruke"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Brojač nepročitanih poruka"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Odobri"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Dobavljač"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "Račun"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "Stavke računa"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "Stavke računa"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "Statistika računa"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "Zapisi računa"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Poruke sa website-a"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-699
View File
@@ -1,699 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Manel Fernandez <manelfera@outlook.com>, 2019
# Martin Trigaux, 2019
# Marc Tormo i Bochaca <mtbochaca@gmail.com>, 2019
# RGB Consulting <odoo@rgbconsulting.com>, 2019
# Quim - eccit <quim@eccit.com>, 2019
# Sandra Franch <sandra.franch@upc.edu>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2016-08-05 12:55+0000\n"
"Last-Translator: Sandra Franch <sandra.franch@upc.edu>, 2019\n"
"Language-Team: Catalan (https://www.transifex.com/odoo/teams/41243/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
"* L'estat 'Esborrany' s'utilitza quan un usuari està introduint un nou i no confirmat comprovant.\n"
"* 'Proforma' s'estableix quan el comprovant està en estat proforma. El comprovant encara no té un número de comprovant.\n"
"* L'estat 'Assegut' s'utilitza quan l'usuari confirma el comprovant, assignant un número de comprovant i creant-li els assentaments comptables.\n"
"* L'estat 'Cancel·lat' s'utilitza quan l'usuari cancel·la el comprovant."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Compte"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "Data del compte"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Data comptable"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "Comprovants comptables"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Cal fer alguna acció"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Import"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Compte analític"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Etiquetes analítiques"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Està segur que desitja cancel·lar aquest rebut?"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "Nombre d'adjunts"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Data de factura"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Informació de la factura"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "Referència de factura"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Cancel·la"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Cancel·lar rebut"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Cancel·lat"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "No es pot esborrar comprovants que ja estan oberts o pagats."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Companyia"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Empresa relacionada amb aquest diari"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Creat per"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Creat el"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Client"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Data"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Descripció"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Mostrar Nom"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "Esborrany"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Comprovant esborrany"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Data de venciment"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "Data efectiva per entrades comptables."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Seguidors"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "Seguidors (Canals)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "Seguidors (Clients)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr "Dona la seqüència d'aquesta línia quan es visualitza al comprovant."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Agrupar per"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Si està marcat, els nous missatges requereixen la vostra atenció"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Si està marcat, els nous missatges requereixen la vostra atenció"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Si està marcat, alguns missatges tenen un error d'entrega."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
"En cas de tenir un problema d'arrodoniment a l'impost, utilitzi aquest camp "
"per corregir-lo."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Notes internes"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "És seguidor"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Diari"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Assentament comptable"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Apunts comptables"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Última modificació el "
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Última actualització per"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Última actualització el"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "Adjunt principal"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr "Error d'entrega del missatge"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Missatges"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Notes"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Número"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Nombre d'accions"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr "Nombre d'errors"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Nombre de missatges que requereixen una acció"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Nombre de missatges amb error d'entrega"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Nombre de missatges no llegits"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr "Només per impostos exclosos del preu"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Pagat"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Empresa"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Paga directament"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr "Paga més tard"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Pagament"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Mètode de pagament"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "Activi, si us plau, la seqüència del diari seleccionat!"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Defineixi si us plau una seqüència al diari."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Fixat"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "Comprovant assentats"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Pro-forma"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Producte"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Compra"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Rebut de compra"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "Comprovant de compra"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Quantitat"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Recepcions"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Venda"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Informació de vendes"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Rebut de vendes"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "Cerca comprovants"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Seqüència"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Canvia a esborrany"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Estat"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Canvi d'estat"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Estat canviat"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Impost"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Import de l'impost"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr "Correcció de l'impost"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "El comprovant ha estat totalment pagat"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr ""
"El compte d'ingressos o despeses relacionada amb el producte seleccionat."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr "La referència externa d'aquest document."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Per revisa"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "Total"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Import total"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Tipus"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Preu un."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Missatges pendents de llegir"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Comptador de missatges no llegits"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Validar"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Proveïdor "
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr "Comprovant del venedor"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "Comprovant"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "Comprovants"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "Línies de comprovant"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "Estadístiques de comprovants"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "Comprovants"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Missatges de la pàgina web"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "Historial de comunicacions del lloc web"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
"Quan un rebut de compra està confirmat, vostè pot registrar el pagament al "
"proveïdor relacionat amb aquest rebut de compra"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
"Quan el rebut de venda és confirmat, vostè pot registrar el pagament del "
"client relacionat amb aquest rebut de venda."
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-694
View File
@@ -1,694 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux, 2018
# Jaroslav Helemik Nemec <nemec@helemik.cz>, 2018
# Jakub Lohnisky <jakub@lepremier.cz>, 2018
# Ladislav Tomm <tomm@helemik.cz>, 2018
# Jan Horzinka <jan.horzinka@centrum.cz>, 2018
# Michal Veselý <michal@veselyberanek.net>, 2018
# milda dvorak <milda.dvorak@optimal4.cz>, 2018
# trendspotter <j.podhorecky@volny.cz>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-08-24 09:15+0000\n"
"Last-Translator: trendspotter <j.podhorecky@volny.cz>, 2018\n"
"Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
" * Stav 'Koncept' se používá, když uživatel zadá nový a nepotvrzený poukaz\n"
" * 'Proforma' je použita, pokud poukaz nemá vygenerováno číslo poukázky.\n"
" * Stav 'Odeslané' se používá, když uživatel vytvoří poukaz, vygeneruje se číslo poukázky a na účtu jsou vytvořeny položky poukazu.\n"
" * Stav 'Zrušeno' se používá, když uživatel zruší poukaz."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Účet"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "Datum účtu"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Datum účtování"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Vyžaduje akci"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Částka"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Analytický účet"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Analytické značky"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Opravdu chcete zrušit tuto účtenku?"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "Počet příloh"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Datum dokladu"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Údaje dokladu"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Zrušit"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Zrušit účtenku"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Zrušeno"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "Nelze smazat poukázku(y), které již byly otevřeny nebo zaplaceny."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Firma"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Společnost vztažená k této knize"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Vytvořil(a)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Vytvořeno"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Měna"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Zákazník"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Datum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Popis"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Zobrazovaný název"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "Návrh"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Koncepty účtenek"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Termín splnění"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Sledující"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Seskupit podle"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Pokud je zaškrtnuto, nové zprávy vyžadují vaši pozornost."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Pokud je zaškrtnuto, nové zprávy vyžadují vaši pozornost."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Pokud je zaškrtnuto, některé zprávy mají chybu při doručení."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Interní poznámky"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Deník"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Položka deníku"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Položky deníku"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Naposled změněno"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Naposledy upraveno od"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Naposled upraveno"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "Hlavní příloha"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr "Chyba při doručování zpráv"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Zprávy"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr "Chybějící společnost"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Poznámky"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Číslo"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Počet akcí"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr "Počet chyb"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Počet zpráv, které vyžadují akci"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Počet zpráv s chybou při doručení"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Počet nepřečtených zpráv"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Uhrazeno"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Kontakt"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Uhrazeno přímo"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Platba"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Způsob platby"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "Prosím aktivujte posloupnost zvoleného deníku!"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Prosím určete posloupnost deníku."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Vloženo"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Proforma"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Výrobek"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Nákup"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Nákupní účtenka"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Množství"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Účtenky"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Prodej"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Údaje prodeje"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Účtenka"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Číselná řada"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Uložit jako koncept"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Stav"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Změna stavu"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Stav změněn"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Daň"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Výše daně"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "Příjmový a výdajový účet vztažený k vybranému výrobku."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Ke kontrole"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "Celkem"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Celková částka"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Typ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Jednotková cena"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Nepřečtené zprávy"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Počítadlo nepřečtených zpráv"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Schválit"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Dodavatel"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Zprávy Webové stránky"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "Historie komunikace Webové stránky"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr "Nejprve musíte vybrat partnera."
-699
View File
@@ -1,699 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# peso <peer.sommerlund@gmail.com>, 2018
# Martin Trigaux, 2018
# Hans Henrik Gabelgaard <hhg@gabelgaard.org>, 2018
# Morten Schou <ms@msteknik.dk>, 2018
# Jesper Carstensen <jc@danodoo.dk>, 2018
# Jesper Carstensen <info@danodoo.dk>, 2018
# Ronni Poulsen <rp@flexonet.dk>, 2018
# Pernille Kristensen <pernillekristensen1994@gmail.com>, 2018
# Sanne Kristensen <sanne@vkdata.dk>, 2018
# Ejner Sønniksen <ejner@vkdata.dk>, 2018
# lhmflexerp <lhm@flexerp.dk>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-08-24 09:15+0000\n"
"Last-Translator: lhmflexerp <lhm@flexerp.dk>, 2018\n"
"Language-Team: Danish (https://www.transifex.com/odoo/teams/41243/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Konto"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "Konto dato"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Bogføringsdato"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "Bogføringsbilag"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Handling påkrævet"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Beløb"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Analyse konto"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Analytiske tags"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Er du sikker på du vil annullere dette bilag?"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "Antal vedhæftninger"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Bilagsdato"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Bilagsinformation"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "Bilagsreference"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Annuller"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Annuller bilag"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Annulleret"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "Kan ikke slette bilag der er åbne eller betalt."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Virksomhed"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Virksomhed knyttet til denne konto"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Oprettet af"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Oprettet den"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Valuta"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Kunde"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Dato"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Beskrivelse"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Vis navn"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "Udkast"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Kladdebilag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Forfaldsdato"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "Bogføringsdato for regnskabs transaktioner"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Følgere"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "Følgere (kanaler)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "Følgere (partnere)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Sortér efter"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Hvis afmærket, kræver nye beskeder din opmærksomhed"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Hvis afmærket, kræver nye beskeder din opmærksomhed "
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Hvis afkrydset har nogle beskeder en leveringsfejl"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
"Hvis der er et afrundingsproblem med momsen, brug dette felt for at rette "
"det"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Interne noter"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "Er følger"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Journal"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Postering"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Journalposter"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Sidst ændret den"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Sidst opdateret af"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Sidst opdateret den"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "Primær vedhæftning"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr "Besked leveringsfejl"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Beskeder"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Noter"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Nummer"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Antal handlinger"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr "Antal fejl"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Antal meddelser der kræver handling"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Antal beskeder med leveringsfejl"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Antal ulæste beskeder"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Betalt"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Kontakt"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Betal direkte"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr "Betal senere"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Betaling"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Betalingsmetode"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Vælg en bilagsserie på journalen"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Bogført"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "Bogførte bilag"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Proforma"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Produkt"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Indkøb"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Indkøbskvittering"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "Købsbilag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Antal"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Varemodtagelse"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Salg"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Salgsinformation"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Salgs kvittering"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "Søg bilag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Sekvens"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Sæt til kladde"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Status"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Status ændring"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Status ændret"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Moms"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Momsbeløb"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr "Momskorrektion"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "Bilaget er betalt fuldt ud."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "Indtægts- eller udgiftskontoen relateret til det valgte produkt."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr "Partner referencen for dette dokument."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Til gennemgang"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "I alt"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Beløb i alt"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Type"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Enhedspris"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Ulæste beskeder"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Ulæste besked tæller"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Validér"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Leverandør"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr "Leverandørbilag"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "Bilag"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "Bilagsposteringer"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "Bilagslinjer"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "Bilagsstatistik"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "Bilagsposteringer"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Website beskeder"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "Website kommunikations historik"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
"Når indkøbet er bekræftet, kan du indtaste\n"
" leverandørbetalingen relateret til dette indkøb."
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
"Når salget er bekræftet, kan du indtaste\n"
" kundebetalingen relateret til dette salg."
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-695
View File
@@ -1,695 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux, 2018
# Johannes Croe <jcr@odoo.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-09-21 13:17+0000\n"
"Last-Translator: Johannes Croe <jcr@odoo.com>, 2018\n"
"Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
" * Ein Zahlungsbeleg befindet sich nach der Erstellung zunächst im \"Entwurf\".\n"
"* Durch Änderung auf den Status \"Pro-Forma\", wird der Status geändert, aber keine Belegnummer vergeben.\n"
"* Der Status \"Gebucht\" wird angewendet, wenn ein Benutzer einen Zahlungsbeleg mitsamt Belegnummer vollständig gebucht hat.\n"
"* Der Zustand \"Abgebrochen\" kennzeichnet den Abbruch eines Zahlungsbelegs."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Konto"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "Buchungsdatum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Buchungsdatum"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "Buchung Zahlungsbelege"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Aktion notwendig"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Betrag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Analysekonto"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Kostenstellen Tags"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Sind Sie sicher, dass Sie diesen Beleg löschen wollen ?"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr "# Anhänge"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Rechnungsdatum"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Rechnungsinformationen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "Belegreferenz"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Abbrechen"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Zahlungseinzug abbrechen"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Abgebrochen"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr "Offene oder bezahlte Belege können nicht storniert werden"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Unternehmen"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Unternehmen für dieses Journal"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Währung"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Kunde"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Datum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Beschreibung"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "Entwurf"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Belegentwurf"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Fälligkeit"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "Tatsächliches Buchungsdatum"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Abonnenten"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "Abonnenten (Kanäle)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "Abonnenten (Partner)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr "Liefert die Reihenfolge dieser Position bei Anzeige des Belegs."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Gruppieren nach"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Falls markiert, benötigen neue Nachrichten Ihre Kenntnisnahme."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Falls markiert, benötigen neue Nachrichten Ihre Kenntnisnahme."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
"Das Senden mancher Nachrichten ist fehlgeschlagen wenn dieses Fenster "
"angekreuzt ist."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
"Nutzen Sie dieses Feld zur Korrektur von Rundungsdifferenzen bei der "
"Steuerermittelung"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Interne Notizen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "Ist ein Abonnent"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Journal"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Buchungssatz"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Buchungszeilen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert durch"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr "Hauptanhänge"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr "Error beim senden der Nachricht"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Nachrichten"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Notizen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Nummer"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Anzahl der Aktionen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr "Fehlernummer"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Anzahl der Nachrichten, die eine Aktion erfordern"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Anzahl der Nachrichten mit einem Fehler beim Senden."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Anzahl ungelesener Nachrichten"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr "Nur für Steuern ohne Preis"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Bezahlt"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Partner"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Einzahlung sofort buchen"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr "Später zahlen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Zahlung"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Zahlungsmethode"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "Bitte aktivieren Sie die Nummernfolge für das gewählte Journal !"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Definieren Sie eine Nummernfolge für das Journal."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Gebucht"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "Verbuchte Belege"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Proforma"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Produkt"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Einkauf"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Einkauf Bestätigung"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "Einkaufsbelege"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Menge"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Anlieferungen"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Verkauf"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Information Umsatz"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Buchen von Einnahmen"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "Zahlungsbelege suchen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Reihenfolge"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Auf Entwurf setzen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Status"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Statusänderung"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Status geändert"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Steuer"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Steuerbetrag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr "Steuerkorrektur"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "Der Beleg wurde vollständig bezahlt"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "Aufwand- und Erlöskonto des gewählten Produktes"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr "Referenz des Partners zu diesem Dokument."
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Zu Prüfen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "Total"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Gesamtbetrag"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Typ"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Preis pro ME"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Ungelesene Nachrichten"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Zähler der ungelesenen Nachrichten"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Bestätigen"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Lieferant"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr "Lieferantenbelege"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "Zahlungsbeleg"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "Zahlungsbeleg Buchungen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "Zahlungspositionen"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "Statistik Zahlungsbelege"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "Zahlungsbuchungen"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Website-Nachrichten"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "Website-Kommunikationshistorie"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
"Wenn der Einkaufsbeleg bestätigt wird, können Sie den Zahlungsausgang zu "
"diesem Beleg erfassen."
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
"Wenn der Verkaufsbeleg bestätigt wird, können Sie den Zahlungseingang zu "
"diesem Beleg erfassen."
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-691
View File
@@ -1,691 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
# Martin Trigaux, 2018
# Kostas Goutoudis <goutoudis@gmail.com>, 2018
# Stefanos Nikou <stefanos.nikou@gmail.com>, 2018
# George Tarasidis <george_tarasidis@yahoo.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
"PO-Revision-Date: 2018-09-21 13:17+0000\n"
"Last-Translator: George Tarasidis <george_tarasidis@yahoo.com>, 2018\n"
"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_id
msgid "Account"
msgstr "Λογαριασμός"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr "Λογαριασμού Ημερομηνία "
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__account_date
msgid "Accounting Date"
msgstr "Ημερ. Λογιστικής"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr "Παραστατικό Λογιστικής"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Accounting Voucher Line"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction
msgid "Action Needed"
msgstr "Απαιτείται ενέργεια"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_subtotal
msgid "Amount"
msgstr "Ποσό"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__account_analytic_id
msgid "Analytic Account"
msgstr "Αναλυτικός Λογαριασμός"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__analytic_tag_ids
msgid "Analytic Tags"
msgstr "Ετικέτες Αναλυτικής"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr "Σίγουρα θέλετε να καταργήσετε αυτή την απόδειξη;"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Bill Date"
msgstr "Ημερ. Χρέωσης"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr "Πληροφορίες Λογαριασμού"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__reference
msgid "Bill Reference"
msgstr "Αναφορά Χρέωσης"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Ακύρωση"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr "Ακύρωση Απόδειξης"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr "Ακυρώθηκε"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:172
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
"Δεν είναι δυνατή η διαγραφή των παραστατικών που είναι ήδη ανοιχτά ή "
"εξοφλημένα."
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__company_id
msgid "Company"
msgstr "Εταιρία"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__company_id
msgid "Company related to this journal"
msgstr "Η εταιρία που σχετίζεται με το ημερολόγιο"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Create a new sale receipt"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_uid
msgid "Created by"
msgstr "Δημιουργήθηκε από"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__create_date
msgid "Created on"
msgstr "Δημιουργήθηκε στις"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__currency_id
msgid "Currency"
msgstr "Νόμισμα"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr "Πελάτης"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Date"
msgstr "Ημερομηνία"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__name
msgid "Description"
msgstr "Περιγραφή"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__display_name
msgid "Display Name"
msgstr "Εμφάνιση Ονόματος"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr "Προσχέδιο"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr "Πρόχειρα Παραστατικά"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__date_due
msgid "Due Date"
msgstr "Ημερ. Λήξης"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__account_date
msgid "Effective date for accounting entries"
msgstr "Ημερομηνία έναρξης ισχύος για λογιστικές εγγραφές"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_follower_ids
msgid "Followers"
msgstr "Ακόλουθοι"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_channel_ids
msgid "Followers (Channels)"
msgstr "Ακόλουθοι (Κανάλια)"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_partner_ids
msgid "Followers (Partners)"
msgstr "Ακόλουθοι (Συνεργάτες)"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr "Ομαδοποίηση κατά"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__id
msgid "ID"
msgstr "Κωδικός"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread
msgid "If checked new messages require your attention."
msgstr "Εάν επιλεγεί τα νέα μηνύματα χρειάζονται την προσοχή σας"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Εάν επιλεγεί τα νέα μηνύματα χρειάζονται την προσοχή σας."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr "Εσωτερικά Σημειώματα"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_is_follower
msgid "Is Follower"
msgstr "Είναι Ακόλουθος"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr "Ημερολόγιο"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__move_id
msgid "Journal Entry"
msgstr "Εγγραφή Ημερολογίου"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr "Εγγραφές Ημερολογίων"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher____last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line____last_update
msgid "Last Modified on"
msgstr "Τελευταία τροποποίηση στις"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_uid
msgid "Last Updated by"
msgstr "Τελευταία Ενημέρωση από"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__write_date
msgid "Last Updated on"
msgstr "Τελευταία Ενημέρωση στις"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_ids
msgid "Messages"
msgstr "Μηνύματα"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:109
#, python-format
msgid "Missing Company"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:111
#, python-format
msgid "Missing Currency"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
msgid "Notes"
msgstr "Σημειώσεις"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__number
msgid "Number"
msgstr "Αριθμός"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of Actions"
msgstr "Πλήθος ενεργειών"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Πλήθος μηνυμάτων που απαιτούν ενέργεια"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__message_unread_counter
msgid "Number of unread messages"
msgstr "Πλήθος μη αναγνωσμένων μηνυμάτων"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__tax_ids
msgid "Only for tax excluded from price"
msgstr "Μόνο για φόρους εξαιρούμενους από την τιμή"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__paid
msgid "Paid"
msgstr "Εξοφλημένη"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr "Συναλλασόμενος"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr "Απευθείας Πληρωμή"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__pay_now
msgid "Payment"
msgstr "Πληρωμή"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__name
msgid "Payment Memo"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__payment_journal_id
msgid "Payment Method"
msgstr "Μέθοδος Πληρωμής"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:208
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr "Παρακαλώ ενεργοποιήστε την ακολουθία του επιλεγμένου ημερολογίου !"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:211
#, python-format
msgid "Please define a sequence on the journal."
msgstr "Παρακαλώ ορίστε μια αλληλουχία στο ημερολόγιο."
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr "Καταχωρημένη"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr "Καταχωρημένα Παραστατικά"
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr "Προτιμολόγιο"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__product_id
msgid "Product"
msgstr "Είδος"
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr "Αγορά"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr "Απόδειξη Αγοράς"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr "Παραστατικό Αγοράς"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__quantity
msgid "Quantity"
msgstr "Ποσότητα"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Receipts"
msgstr "Παραλαβή"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Register a new purchase receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr "Πώληση"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr "Πληροφορίες Πώλησης"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr "Απόδειξη Πώλησης"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr "Αναζήτηση Παραστατικών"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__sequence
msgid "Sequence"
msgstr "Ακολουθία"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr "Ορισμός σε Πρόχειρη"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr "Κατάσταση"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr "Αλλαγή Κατάστασης"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr "Αλλαγή κατάστασης"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__tax_ids
msgid "Tax"
msgstr "Φόρος"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_amount
msgid "Tax Amount"
msgstr "Ποσό Φόρου"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__tax_correction
msgid "Tax Correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__paid
msgid "The Voucher has been totally paid."
msgstr "Το Παραστατικό έχει πλήρως εξοφληθεί. "
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line__account_id
msgid "The income or expense account related to the selected product."
msgstr "Ο λογαριασμός εσόδων ή εξόδων που σχετίζεται με το επιλεγμένο είδος."
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr "Για Επισκόπηση"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__amount
msgid "Total"
msgstr "Σύνολο"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr "Σύνολο"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__voucher_type
msgid "Type"
msgstr "Τύπος"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__price_unit
msgid "Unit Price"
msgstr "Τιμή Μονάδας"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread
msgid "Unread Messages"
msgstr "Μη αναγνωσμένα μηνύματα"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Μετρητής μη αναγνωσμένων μηνυμάτων"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr "Επικύρωση"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr "Προμηθευτής"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:116
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line__voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr "Παραστατικό"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr "Εγγραφές Παραστατικών"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr "Γραμμές Παραστατικού"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr "Στατιστικά Παραστατικού"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr "Καταχωρήσεις Παραστατικού"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__website_message_ids
msgid "Website Messages"
msgstr "Μηνύματα Ιστότοπου"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher__website_message_ids
msgid "Website communication history"
msgstr "Ιστορικό επικοινωνίας ιστότοπου"
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
"Όταν επιβεβαιωθεί η απόδειξη αγοράς, μπορείτε να καταγράψετε την\n"
" πληρωμή προμηθευτή σχετικά με αυτήν την απόδειξη αγοράς."
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
"Όταν επιβεβαιωθεί η απόδειξη πώλησης, μπορείτε να καταγράψετε την πληρωμή πελατών\n"
" που σχετίζεται με αυτήν την απόδειξη πώλησης."
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:457
#, python-format
msgid "You must first select a partner."
msgstr ""
-553
View File
@@ -1,553 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_voucher
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
"PO-Revision-Date: 2015-09-19 08:18+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: English (Australia) (http://www.transifex.com/odoo/odoo-9/"
"language/en_AU/)\n"
"Language: en_AU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_state
msgid ""
" * The 'Draft' status is used when a user is encoding a new and unconfirmed "
"Voucher.\n"
" * The 'Pro-forma' status is used when the voucher does not have a voucher "
"number.\n"
" * The 'Posted' status is used when user create voucher,a voucher number is "
"generated and voucher entries are created in account.\n"
" * The 'Cancelled' status is used when user cancel voucher."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_account_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_id
msgid "Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
msgid "Account Date"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_subtotal
msgid "Amount"
msgstr "Import"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_account_analytic_id
msgid "Analytic Account"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Are you sure you want to cancel this receipt?"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Date"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Bill Information"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_reference
msgid "Bill Reference"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Cancel"
msgstr "Cancel"
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Cancel Receipt"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Cancelled"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:147
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid "Click to create a sale receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid "Click to register a purchase receipt."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_company_id
msgid "Company"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_company_id
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_company_id
msgid "Company related to this journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_uid
msgid "Created by"
msgstr "Created by"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_create_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_create_date
msgid "Created on"
msgstr "Created on"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_currency_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_currency_id
msgid "Currency"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
msgid "Customer"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Date"
msgstr "Date"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_name
msgid "Description"
msgstr "Description"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_display_name
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_display_name
msgid "Display Name"
msgstr "Display Name"
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Draft Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_date_due
msgid "Due Date"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_date
msgid "Effective date for accounting entries"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_sequence
msgid "Gives the sequence of this line when displaying the voucher."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Group By"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_id
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_id
msgid "ID"
msgstr "ID"
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_tax_correction
msgid ""
"In case we have a rounding problem in the tax, use this field to correct it"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Internal Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_journal_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Journal"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_move_id
msgid "Journal Entry"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Journal Items"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher___last_update
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line___last_update
msgid "Last Modified on"
msgstr "Last Modified on"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_uid
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_uid
msgid "Last Updated by"
msgstr "Last Updated by"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_write_date
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_write_date
msgid "Last Updated on"
msgstr "Last Updated on"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_narration
msgid "Notes"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_number
msgid "Number"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_tax_ids
msgid "Only for tax excluded from price"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_paid
msgid "Paid"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_partner_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "Partner"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Directly"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,pay_now:0
msgid "Pay Later"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_pay_now
msgid "Payment"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_name
msgid "Payment Reference"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:183
#, python-format
msgid "Please activate the sequence of selected journal !"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:186
#, python-format
msgid "Please define a sequence on the journal."
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Posted Vouchers"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,state:0
msgid "Pro-forma"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_product_id
msgid "Product"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Purchase"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Purchase Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_quantity
msgid "Quantity"
msgstr ""
#. module: account_voucher
#: selection:account.voucher,voucher_type:0
msgid "Sale"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Information"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Sales Receipt"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Search Vouchers"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_sequence
msgid "Sequence"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Set to Draft"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_state
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
msgid "Status"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
msgstr ""
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status changed"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_tax_ids
msgid "Tax"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_amount
msgid "Tax amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_tax_correction
msgid "Tax correction"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_paid
msgid "The Voucher has been totally paid."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_line_account_id
msgid "The income or expense account related to the selected product."
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,help:account_voucher.field_account_voucher_reference
msgid "The partner reference of this document."
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
msgid "To Review"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_amount
msgid "Total"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Total Amount"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_voucher_type
msgid "Type"
msgstr ""
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_price_unit
msgid "Unit Price"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
msgid "Validate"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Vendor"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
msgid "Vendor Voucher"
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:31
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_voucher_id
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_sale
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_filter_vendor
#, python-format
msgid "Voucher"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_tree_purchase
msgid "Voucher Entries"
msgstr ""
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_line
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher_line_ids
#: model_terms:ir.ui.view,arch_db:account_voucher.view_purchase_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_sale_receipt_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_form
#: model_terms:ir.ui.view,arch_db:account_voucher.view_voucher_line_tree
msgid "Voucher Lines"
msgstr ""
#. module: account_voucher
#: model_terms:ir.ui.view,arch_db:account_voucher.account_cash_statement_graph
msgid "Voucher Statistics"
msgstr ""
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_purchase_receipt
msgid ""
"When the purchase receipt is confirmed, you can record the\n"
" vendor payment related to this purchase receipt."
msgstr ""
#. module: account_voucher
#: model_terms:ir.actions.act_window,help:account_voucher.action_sale_receipt
msgid ""
"When the sale receipt is confirmed, you can record the customer\n"
" payment related to this sales receipt."
msgstr ""
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:348
#, python-format
msgid "You must first select a partner!"
msgstr "You must first select a partner!"

Some files were not shown because too many files have changed in this diff Show More