[FIX] account: invoice related usability changes. Add of signed fields to display the residual and total amounts of refunds with a negative sign, fixed the invoiced button on partners, fixed the numbering for refunds
This commit is contained in:
@@ -225,7 +225,7 @@ class AccountJournal(models.Model):
|
||||
help="Company related to this journal")
|
||||
|
||||
analytic_journal_id = fields.Many2one('account.analytic.journal', string='Analytic Journal', help="Journal for analytic entries")
|
||||
refund_sequence = fields.Boolean(string='Dedicated Refund Sequence', help="Check this box if you don't want to share the same sequence for invoices and refunds made from this journal")
|
||||
refund_sequence = fields.Boolean(string='Dedicated Refund Sequence', help="Check this box if you don't want to share the same sequence for invoices and refunds made from this journal", default=True)
|
||||
|
||||
inbound_payment_method_ids = fields.Many2many('account.payment.method', 'account_journal_inbound_payment_method_rel', 'journal_id', 'inbound_payment_method',
|
||||
domain=[('payment_type', '=', 'inbound')], string='Debit Methods', default=lambda self: self._default_inbound_payment_methods(),
|
||||
@@ -328,8 +328,6 @@ class AccountJournal(models.Model):
|
||||
def _create_sequence(self, vals, refund=False):
|
||||
""" Create new no_gap entry sequence for every new Journal"""
|
||||
prefix = self._get_sequence_prefix(vals['code'], refund)
|
||||
if refund:
|
||||
prefix = 'R' + prefix
|
||||
seq = {
|
||||
'name': vals['name'],
|
||||
'implementation': 'no_gap',
|
||||
@@ -407,7 +405,7 @@ class AccountJournal(models.Model):
|
||||
# We just need to create the relevant sequences according to the chosen options
|
||||
if not vals.get('sequence_id'):
|
||||
vals.update({'sequence_id': self.sudo()._create_sequence(vals).id})
|
||||
if vals.get('refund_sequence') and not vals.get('refund_sequence_id'):
|
||||
if vals.get('type') in ('sale', 'puchase') and vals.get('refund_sequence') and not vals.get('refund_sequence_id'):
|
||||
vals.update({'refund_sequence_id': self.sudo()._create_sequence(vals, refund=True).id})
|
||||
|
||||
journal = super(AccountJournal, self).create(vals)
|
||||
|
||||
@@ -44,13 +44,14 @@ class AccountInvoice(models.Model):
|
||||
self.amount_untaxed = sum(line.price_subtotal for line in self.invoice_line_ids)
|
||||
self.amount_tax = sum(line.amount for line in self.tax_line_ids)
|
||||
self.amount_total = self.amount_untaxed + self.amount_tax
|
||||
amount_total_signed = self.amount_total
|
||||
amount_total_company_signed = self.amount_total
|
||||
amount_untaxed_signed = self.amount_untaxed
|
||||
if self.currency_id and self.currency_id != self.company_id.currency_id:
|
||||
amount_total_signed = self.currency_id.compute(self.amount_total, self.company_id.currency_id)
|
||||
amount_total_company_signed = self.currency_id.compute(self.amount_total, self.company_id.currency_id)
|
||||
amount_untaxed_signed = self.currency_id.compute(self.amount_untaxed, self.company_id.currency_id)
|
||||
sign = self.type in ['in_refund', 'out_refund'] and -1 or 1
|
||||
self.amount_total_signed = amount_total_signed * sign
|
||||
self.amount_total_company_signed = amount_total_company_signed * sign
|
||||
self.amount_total_signed = self.amount_total * sign
|
||||
self.amount_untaxed_signed = amount_untaxed_signed * sign
|
||||
|
||||
@api.model
|
||||
@@ -91,16 +92,18 @@ class AccountInvoice(models.Model):
|
||||
def _compute_residual(self):
|
||||
residual = 0.0
|
||||
residual_signed = 0.0
|
||||
residual_company_signed = 0.0
|
||||
sign = self.type in ['in_refund', 'in_invoice'] and -1 or 1
|
||||
for line in self.sudo().move_id.line_ids:
|
||||
if line.account_id.internal_type in ('receivable', 'payable'):
|
||||
residual_signed += line.amount_residual * sign
|
||||
residual_company_signed += line.amount_residual * sign
|
||||
if line.currency_id == self.currency_id:
|
||||
residual += line.amount_residual_currency if line.currency_id else line.amount_residual
|
||||
else:
|
||||
from_currency = (line.currency_id and line.currency_id.with_context(date=line.date)) or line.company_id.currency_id.with_context(date=line.date)
|
||||
residual += from_currency.compute(line.amount_residual, self.currency_id)
|
||||
self.residual_signed = residual_signed
|
||||
self.residual_company_signed = residual_company_signed
|
||||
self.residual_signed = abs(residual) * sign
|
||||
self.residual = abs(residual)
|
||||
digits_rounding_precision = self.currency_id.rounding
|
||||
if float_is_zero(self.residual, digits_rounding_precision):
|
||||
@@ -265,7 +268,10 @@ class AccountInvoice(models.Model):
|
||||
store=True, readonly=True, compute='_compute_amount')
|
||||
amount_total = fields.Monetary(string='Total',
|
||||
store=True, readonly=True, compute='_compute_amount')
|
||||
amount_total_signed = fields.Monetary(string='Total', currency_field='company_currency_id',
|
||||
amount_total_signed = fields.Monetary(string='Total', currency_field='currency_id',
|
||||
store=True, readonly=True, compute='_compute_amount',
|
||||
help="Total amount in the currency of the invoice, negative for credit notes.")
|
||||
amount_total_company_signed = fields.Monetary(string='Total', currency_field='company_currency_id',
|
||||
store=True, readonly=True, compute='_compute_amount',
|
||||
help="Total amount in the currency of the company, negative for credit notes.")
|
||||
currency_id = fields.Many2one('res.currency', string='Currency',
|
||||
@@ -288,7 +294,9 @@ class AccountInvoice(models.Model):
|
||||
|
||||
residual = fields.Monetary(string='Amount Due',
|
||||
compute='_compute_residual', store=True, help="Remaining amount due.")
|
||||
residual_signed = fields.Monetary(string='Amount Due', currency_field='company_currency_id',
|
||||
residual_signed = fields.Monetary(string='Amount Due', currency_field='currency_id',
|
||||
compute='_compute_residual', store=True, help="Remaining amount due in the currency of the invoice.")
|
||||
residual_company_signed = fields.Monetary(string='Amount Due', currency_field='company_currency_id',
|
||||
compute='_compute_residual', store=True, help="Remaining amount due in the currency of the company.")
|
||||
payment_ids = fields.Many2many('account.payment', 'account_invoice_payment_rel', 'invoice_id', 'payment_id', string="Payments", copy=False, readonly=True)
|
||||
payment_move_line_ids = fields.Many2many('account.move.line', string='Payments', compute='_compute_payments', store=True)
|
||||
@@ -734,7 +742,7 @@ class AccountInvoice(models.Model):
|
||||
}
|
||||
ctx['company_id'] = inv.company_id.id
|
||||
ctx['dont_create_taxes'] = True
|
||||
ctx['invoice_id'] = inv.move_name and inv or False
|
||||
ctx['invoice'] = inv
|
||||
ctx_nolang = ctx.copy()
|
||||
ctx_nolang.pop('lang', None)
|
||||
move = account_move.with_context(ctx_nolang).create(move_vals)
|
||||
|
||||
@@ -111,7 +111,7 @@ class account_journal(models.Model):
|
||||
data.append({'label':label,'value':0.0, 'type': 'past' if i<0 else 'future'})
|
||||
|
||||
# Build SQL query to find amount aggregated by week
|
||||
select_sql_clause = """SELECT sum(residual_signed) as total, min(date) as aggr_date from account_invoice where journal_id = %(journal_id)s and state = 'open'"""
|
||||
select_sql_clause = """SELECT sum(residual_company_signed) as total, min(date) as aggr_date from account_invoice where journal_id = %(journal_id)s and state = 'open'"""
|
||||
query = ''
|
||||
start_date = (first_day_of_week + timedelta(days=-7))
|
||||
for i in range(0,6):
|
||||
|
||||
@@ -118,7 +118,7 @@ class AccountMove(models.Model):
|
||||
new_name = False
|
||||
journal = move.journal_id
|
||||
|
||||
if invoice and invoice.move_name:
|
||||
if invoice and invoice.move_name != '/':
|
||||
new_name = invoice.move_name
|
||||
else:
|
||||
if journal.sequence_id:
|
||||
|
||||
@@ -84,7 +84,7 @@ class account_abstract_payment(models.AbstractModel):
|
||||
total = 0
|
||||
payment_currency = self.currency_id or self.journal_id.currency_id or self.journal_id.company_id.currency_id
|
||||
for inv in self._get_invoices():
|
||||
total += inv.residual_signed
|
||||
total += inv.residual_company_signed
|
||||
if self.company_id and self.company_id.currency_id != payment_currency:
|
||||
total = self.company_id.currency_id.with_context(date=self.payment_date).compute(total, payment_currency)
|
||||
return abs(total)
|
||||
|
||||
@@ -250,31 +250,19 @@ class ResPartner(models.Model):
|
||||
|
||||
# generate where clause to include multicompany rules
|
||||
where_query = account_invoice_report._where_calc([
|
||||
('partner_id', 'in', all_partner_ids), ('state', 'not in', ['draft', 'cancel'])
|
||||
('partner_id', 'in', all_partner_ids), ('state', 'not in', ['draft', 'cancel']), ('company_id', '=', self.env.user.company_id.id)
|
||||
])
|
||||
account_invoice_report._apply_ir_rules(where_query, 'read')
|
||||
from_clause, where_clause, where_clause_params = where_query.get_sql()
|
||||
|
||||
query = """ WITH currency_rate (currency_id, rate, date_start, date_end) AS (
|
||||
SELECT r.currency_id, r.rate, r.name AS date_start,
|
||||
(SELECT name FROM res_currency_rate r2
|
||||
WHERE r2.name > r.name AND
|
||||
r2.currency_id = r.currency_id
|
||||
ORDER BY r2.name ASC
|
||||
LIMIT 1) AS date_end
|
||||
FROM res_currency_rate r
|
||||
)
|
||||
SELECT SUM(price_total * cr.rate) as total
|
||||
FROM account_invoice_report account_invoice_report, currency_rate cr
|
||||
query = """
|
||||
SELECT SUM(price_total) as total
|
||||
FROM account_invoice_report account_invoice_report
|
||||
WHERE %s
|
||||
AND cr.currency_id = %%s
|
||||
AND (COALESCE(account_invoice_report.date, NOW()) >= cr.date_start)
|
||||
AND (COALESCE(account_invoice_report.date, NOW()) < cr.date_end OR cr.date_end IS NULL)
|
||||
""" % where_clause
|
||||
|
||||
# price_total is in the currency with rate = 1
|
||||
# total_invoice should be displayed in the current user's currency
|
||||
self.env.cr.execute(query, where_clause_params + [user_currency_id])
|
||||
# price_total is in the company currency
|
||||
self.env.cr.execute(query, where_clause_params)
|
||||
partner.total_invoiced = self.env.cr.fetchone()[0]
|
||||
|
||||
@api.multi
|
||||
|
||||
@@ -73,7 +73,7 @@ class AccountInvoiceReport(models.Model):
|
||||
|
||||
_depends = {
|
||||
'account.invoice': [
|
||||
'account_id', 'amount_total_signed', 'commercial_partner_id', 'company_id',
|
||||
'account_id', 'amount_total_company_signed', 'commercial_partner_id', 'company_id',
|
||||
'currency_id', 'date_due', 'date_invoice', 'fiscal_position_id',
|
||||
'journal_id', 'partner_bank_id', 'partner_id', 'payment_term_id',
|
||||
'residual', 'state', 'type', 'user_id',
|
||||
@@ -125,7 +125,7 @@ class AccountInvoiceReport(models.Model):
|
||||
END
|
||||
ELSE 1::numeric
|
||||
END AS price_average,
|
||||
ai.residual_signed / (SELECT count(*) FROM account_invoice_line l where invoice_id = ai.id) *
|
||||
ai.residual_company_signed / (SELECT count(*) FROM account_invoice_line l where invoice_id = ai.id) *
|
||||
count(*) AS residual,
|
||||
ai.commercial_partner_id as commercial_partner_id,
|
||||
partner.country_id
|
||||
@@ -149,8 +149,8 @@ class AccountInvoiceReport(models.Model):
|
||||
GROUP BY 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.type, ai.state, pt.categ_id,
|
||||
ai.date_due, ai.account_id, ail.account_id, ai.partner_bank_id, ai.residual_signed,
|
||||
ai.amount_total_signed, ai.commercial_partner_id, partner.country_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, partner.country_id
|
||||
"""
|
||||
return group_by_str
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<calendar string="Invoices" color="journal_id" date_start="date_invoice">
|
||||
<field name="partner_id"/>
|
||||
<field name="amount_total"/>
|
||||
<field name="amount_total_signed"/>
|
||||
</calendar>
|
||||
</field>
|
||||
</record>
|
||||
@@ -20,7 +20,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Invoices" display_quantity="true">
|
||||
<field name="partner_id"/>
|
||||
<field name="amount_total" type="measure"/>
|
||||
<field name="amount_total_signed" type="measure"/>
|
||||
</pivot>
|
||||
</field>
|
||||
</record>
|
||||
@@ -31,7 +31,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Invoices">
|
||||
<field name="partner_id"/>
|
||||
<field name="amount_total" type="measure"/>
|
||||
<field name="amount_total_signed" type="measure"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
@@ -133,8 +133,8 @@
|
||||
<field name="user_id"/>
|
||||
<field name="date_due"/>
|
||||
<field name="origin"/>
|
||||
<field name="amount_total"/>
|
||||
<field name="residual"/>
|
||||
<field name="amount_total_signed"/>
|
||||
<field name="residual_signed"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="company_currency_id" invisible="1"/>
|
||||
<field name="state"/>
|
||||
@@ -194,8 +194,8 @@
|
||||
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
|
||||
<field name="date_due"/>
|
||||
<field name="origin"/>
|
||||
<field name="amount_total"/>
|
||||
<field name="residual" string="To Pay"/>
|
||||
<field name="amount_total_signed"/>
|
||||
<field name="residual_signed" string="To Pay"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="company_currency_id" invisible="1"/>
|
||||
<field name="state"/>
|
||||
@@ -295,7 +295,6 @@
|
||||
<field name="amount_untaxed"/>
|
||||
<field name="amount_tax"/>
|
||||
<field name="amount_total" class="oe_subtotal_footer_separator"/>
|
||||
<field name="amount_total_signed" groups="base.group_multi_currency" />
|
||||
<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"/>
|
||||
@@ -440,7 +439,6 @@
|
||||
<field name="amount_untaxed"/>
|
||||
<field name="amount_tax"/>
|
||||
<field name="amount_total" class="oe_subtotal_footer_separator"/>
|
||||
<field name="amount_total_signed" groups="base.group_multi_currency" />
|
||||
<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"/>
|
||||
@@ -543,7 +541,7 @@
|
||||
<field name="name">Invoices</field>
|
||||
<field name="res_model">account.invoice</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,calendar,graph</field>
|
||||
<field name="view_mode">tree,form,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>
|
||||
|
||||
Reference in New Issue
Block a user