mirror of
https://gitlab.com/flectra-hq/flectra.git
synced 2026-08-19 01:34:43 -05:00
[PATCH] Upstream patch - 20012022
This commit is contained in:
@@ -882,6 +882,7 @@ class AccountMove(models.Model):
|
||||
'name': _('%s (rounding)', biggest_tax_line.name),
|
||||
'account_id': biggest_tax_line.account_id.id,
|
||||
'tax_repartition_line_id': biggest_tax_line.tax_repartition_line_id.id,
|
||||
'tax_tag_ids': [(6, 0, biggest_tax_line.tax_tag_ids.ids)],
|
||||
'tax_exigible': biggest_tax_line.tax_exigible,
|
||||
'exclude_from_invoice_tab': True,
|
||||
})
|
||||
|
||||
@@ -857,6 +857,7 @@ class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
})
|
||||
|
||||
def test_in_invoice_line_onchange_cash_rounding_1(self):
|
||||
# Test 'add_invoice_line' rounding
|
||||
move_form = Form(self.invoice)
|
||||
# Add a cash rounding having 'add_invoice_line'.
|
||||
move_form.invoice_cash_rounding_id = self.cash_rounding_a
|
||||
@@ -911,12 +912,45 @@ class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
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()
|
||||
# Test 'biggest_tax' rounding
|
||||
|
||||
self.assertInvoiceValues(self.invoice, [
|
||||
self.company_data['company'].country_id = self.env.ref('base.us')
|
||||
|
||||
# Add a tag to product_a's default tax
|
||||
tax_line_tag = self.env['account.account.tag'].create({
|
||||
'name': "Tax tag",
|
||||
'applicability': 'taxes',
|
||||
'country_id': self.company_data['company'].country_id.id,
|
||||
})
|
||||
|
||||
repartition_line = self.tax_purchase_a.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax')
|
||||
repartition_line.write({'tag_ids': [(4, tax_line_tag.id, 0)]})
|
||||
|
||||
# Create the invoice
|
||||
biggest_tax_invoice = self.env['account.move'].create({
|
||||
'move_type': 'in_invoice',
|
||||
'invoice_date': '2019-01-01',
|
||||
'partner_id': self.partner_a.id,
|
||||
'invoice_cash_rounding_id': self.cash_rounding_b.id,
|
||||
'invoice_payment_term_id': self.pay_terms_a.id,
|
||||
'invoice_line_ids': [
|
||||
(0, 0, {
|
||||
'product_id': self.product_a.id,
|
||||
'price_unit': 799.99,
|
||||
'tax_ids': [(6, 0, self.product_a.supplier_taxes_id.ids)],
|
||||
'product_uom_id': self.product_a.uom_id.id,
|
||||
}),
|
||||
|
||||
(0, 0, {
|
||||
'product_id': self.product_b.id,
|
||||
'price_unit': self.product_b.standard_price,
|
||||
'tax_ids': [(6, 0, self.product_b.supplier_taxes_id.ids)],
|
||||
'product_uom_id': self.product_b.uom_id.id,
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
self.assertInvoiceValues(biggest_tax_invoice, [
|
||||
{
|
||||
**self.product_line_vals_1,
|
||||
'price_unit': 799.99,
|
||||
@@ -924,10 +958,24 @@ class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': 919.99,
|
||||
'amount_currency': 799.99,
|
||||
'debit': 799.99,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.product_line_vals_2,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_1,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_2,
|
||||
'tax_repartition_line_id': self.tax_purchase_b.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
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,
|
||||
@@ -941,6 +989,8 @@ class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -0.04,
|
||||
'tax_ids': [],
|
||||
'tax_line_id': self.tax_purchase_a.id,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
'currency_id': self.company_data['currency'].id,
|
||||
'amount_currency': -0.04,
|
||||
'debit': 0.0,
|
||||
@@ -955,6 +1005,8 @@ class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -1127.95,
|
||||
'amount_currency': -1127.95,
|
||||
'credit': 1127.95,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
], {
|
||||
**self.move_vals,
|
||||
|
||||
@@ -539,6 +539,7 @@ class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
|
||||
})
|
||||
|
||||
def test_in_refund_line_onchange_cash_rounding_1(self):
|
||||
# Test 'add_invoice_line' rounding
|
||||
move_form = Form(self.invoice)
|
||||
# Add a cash rounding having 'add_invoice_line'.
|
||||
move_form.invoice_cash_rounding_id = self.cash_rounding_a
|
||||
@@ -593,12 +594,45 @@ class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
|
||||
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()
|
||||
# Test 'biggest_tax' rounding
|
||||
|
||||
self.assertInvoiceValues(self.invoice, [
|
||||
self.company_data['company'].country_id = self.env.ref('base.us')
|
||||
|
||||
# Add a tag to product_a's default tax
|
||||
tax_line_tag = self.env['account.account.tag'].create({
|
||||
'name': "Tax tag",
|
||||
'applicability': 'taxes',
|
||||
'country_id': self.company_data['company'].country_id.id,
|
||||
})
|
||||
|
||||
repartition_line = self.tax_purchase_a.refund_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax')
|
||||
repartition_line.write({'tag_ids': [(4, tax_line_tag.id, 0)]})
|
||||
|
||||
# Create the invoice
|
||||
biggest_tax_invoice = self.env['account.move'].create({
|
||||
'move_type': 'in_refund',
|
||||
'invoice_date': '2019-01-01',
|
||||
'partner_id': self.partner_a.id,
|
||||
'invoice_cash_rounding_id': self.cash_rounding_b.id,
|
||||
'invoice_payment_term_id': self.pay_terms_a.id,
|
||||
'invoice_line_ids': [
|
||||
(0, 0, {
|
||||
'product_id': self.product_a.id,
|
||||
'price_unit': 799.99,
|
||||
'tax_ids': [(6, 0, self.product_a.supplier_taxes_id.ids)],
|
||||
'product_uom_id': self.product_a.uom_id.id,
|
||||
}),
|
||||
|
||||
(0, 0, {
|
||||
'product_id': self.product_b.id,
|
||||
'price_unit': self.product_b.standard_price,
|
||||
'tax_ids': [(6, 0, self.product_b.supplier_taxes_id.ids)],
|
||||
'product_uom_id': self.product_b.uom_id.id,
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
self.assertInvoiceValues(biggest_tax_invoice, [
|
||||
{
|
||||
**self.product_line_vals_1,
|
||||
'price_unit': 799.99,
|
||||
@@ -606,10 +640,24 @@ class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': 919.99,
|
||||
'amount_currency': -799.99,
|
||||
'credit': 799.99,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.product_line_vals_2,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_1,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_2,
|
||||
'tax_repartition_line_id': self.tax_purchase_b.refund_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
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,
|
||||
@@ -623,6 +671,8 @@ class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -0.04,
|
||||
'tax_ids': [],
|
||||
'tax_line_id': self.tax_purchase_a.id,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
'currency_id': self.company_data['currency'].id,
|
||||
'amount_currency': 0.04,
|
||||
'debit': 0.04,
|
||||
@@ -637,6 +687,8 @@ class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -1127.95,
|
||||
'amount_currency': 1127.95,
|
||||
'debit': 1127.95,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
], {
|
||||
**self.move_vals,
|
||||
|
||||
@@ -1460,6 +1460,7 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
])
|
||||
|
||||
def test_out_invoice_line_onchange_cash_rounding_1(self):
|
||||
# Test 'add_invoice_line' rounding
|
||||
move_form = Form(self.invoice)
|
||||
# Add a cash rounding having 'add_invoice_line'.
|
||||
move_form.invoice_cash_rounding_id = self.cash_rounding_a
|
||||
@@ -1514,12 +1515,45 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
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()
|
||||
# Test 'biggest_tax' rounding
|
||||
|
||||
self.assertInvoiceValues(self.invoice, [
|
||||
self.company_data['company'].country_id = self.env.ref('base.us')
|
||||
|
||||
# Add a tag to product_a's default tax
|
||||
tax_line_tag = self.env['account.account.tag'].create({
|
||||
'name': "Tax tag",
|
||||
'applicability': 'taxes',
|
||||
'country_id': self.company_data['company'].country_id.id,
|
||||
})
|
||||
|
||||
repartition_line = self.tax_sale_a.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax')
|
||||
repartition_line.write({'tag_ids': [(4, tax_line_tag.id, 0)]})
|
||||
|
||||
# Create the invoice
|
||||
biggest_tax_invoice = self.env['account.move'].create({
|
||||
'move_type': 'out_invoice',
|
||||
'invoice_date': '2019-01-01',
|
||||
'partner_id': self.partner_a.id,
|
||||
'invoice_cash_rounding_id': self.cash_rounding_b.id,
|
||||
'invoice_payment_term_id': self.pay_terms_a.id,
|
||||
'invoice_line_ids': [
|
||||
(0, 0, {
|
||||
'product_id': self.product_a.id,
|
||||
'price_unit': 999.99,
|
||||
'tax_ids': [(6, 0, self.product_a.taxes_id.ids)],
|
||||
'product_uom_id': self.product_a.uom_id.id,
|
||||
}),
|
||||
|
||||
(0, 0, {
|
||||
'product_id': self.product_b.id,
|
||||
'price_unit': self.product_b.lst_price,
|
||||
'tax_ids': [(6, 0, self.product_b.taxes_id.ids)],
|
||||
'product_uom_id': self.product_b.uom_id.id,
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
self.assertInvoiceValues(biggest_tax_invoice, [
|
||||
{
|
||||
**self.product_line_vals_1,
|
||||
'price_unit': 999.99,
|
||||
@@ -1527,10 +1561,24 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': 1149.99,
|
||||
'amount_currency': -999.99,
|
||||
'credit': 999.99,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.product_line_vals_2,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_1,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_2,
|
||||
'tax_repartition_line_id': self.tax_sale_b.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
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,
|
||||
@@ -1544,6 +1592,8 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -0.04,
|
||||
'tax_ids': [],
|
||||
'tax_line_id': self.tax_sale_a.id,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
'currency_id': self.company_data['currency'].id,
|
||||
'amount_currency': 0.04,
|
||||
'debit': 0.04,
|
||||
@@ -1558,6 +1608,8 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -1409.95,
|
||||
'amount_currency': 1409.95,
|
||||
'debit': 1409.95,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
], {
|
||||
**self.move_vals,
|
||||
|
||||
@@ -539,6 +539,7 @@ class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
|
||||
})
|
||||
|
||||
def test_out_refund_line_onchange_cash_rounding_1(self):
|
||||
# Test 'add_invoice_line' rounding
|
||||
move_form = Form(self.invoice)
|
||||
# Add a cash rounding having 'add_invoice_line'.
|
||||
move_form.invoice_cash_rounding_id = self.cash_rounding_a
|
||||
@@ -593,12 +594,45 @@ class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
|
||||
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()
|
||||
# Test 'biggest_tax' rounding
|
||||
|
||||
self.assertInvoiceValues(self.invoice, [
|
||||
self.company_data['company'].country_id = self.env.ref('base.us')
|
||||
|
||||
# Add a tag to product_a's default tax
|
||||
tax_line_tag = self.env['account.account.tag'].create({
|
||||
'name': "Tax tag",
|
||||
'applicability': 'taxes',
|
||||
'country_id': self.company_data['company'].country_id.id,
|
||||
})
|
||||
|
||||
repartition_line = self.tax_sale_a.refund_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax')
|
||||
repartition_line.write({'tag_ids': [(4, tax_line_tag.id, 0)]})
|
||||
|
||||
# Create the invoice
|
||||
biggest_tax_invoice = self.env['account.move'].create({
|
||||
'move_type': 'out_refund',
|
||||
'invoice_date': '2019-01-01',
|
||||
'partner_id': self.partner_a.id,
|
||||
'invoice_cash_rounding_id': self.cash_rounding_b.id,
|
||||
'invoice_payment_term_id': self.pay_terms_a.id,
|
||||
'invoice_line_ids': [
|
||||
(0, 0, {
|
||||
'product_id': self.product_a.id,
|
||||
'price_unit': 999.99,
|
||||
'tax_ids': [(6, 0, self.product_a.taxes_id.ids)],
|
||||
'product_uom_id': self.product_a.uom_id.id,
|
||||
}),
|
||||
|
||||
(0, 0, {
|
||||
'product_id': self.product_b.id,
|
||||
'price_unit': self.product_b.lst_price,
|
||||
'tax_ids': [(6, 0, self.product_b.taxes_id.ids)],
|
||||
'product_uom_id': self.product_b.uom_id.id,
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
self.assertInvoiceValues(biggest_tax_invoice, [
|
||||
{
|
||||
**self.product_line_vals_1,
|
||||
'price_unit': 999.99,
|
||||
@@ -606,10 +640,24 @@ class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': 1149.99,
|
||||
'amount_currency': 999.99,
|
||||
'debit': 999.99,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.product_line_vals_2,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_1,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
},
|
||||
{
|
||||
**self.tax_line_vals_2,
|
||||
'tax_repartition_line_id': self.tax_sale_b.refund_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
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,
|
||||
@@ -623,6 +671,8 @@ class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -0.04,
|
||||
'tax_ids': [],
|
||||
'tax_line_id': self.tax_sale_a.id,
|
||||
'tax_repartition_line_id': repartition_line.id,
|
||||
'tax_tag_ids': tax_line_tag.ids,
|
||||
'currency_id': self.company_data['currency'].id,
|
||||
'amount_currency': -0.04,
|
||||
'debit': 0.0,
|
||||
@@ -637,6 +687,8 @@ class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
|
||||
'price_total': -1409.95,
|
||||
'amount_currency': -1409.95,
|
||||
'credit': 1409.95,
|
||||
'tax_repartition_line_id': None,
|
||||
'tax_tag_ids': [],
|
||||
},
|
||||
], {
|
||||
**self.move_vals,
|
||||
|
||||
@@ -1078,7 +1078,7 @@
|
||||
widget="email"
|
||||
attrs="{'invisible': ['|', ('move_type', 'not in', ('in_invoice', 'in_refund')), ('invoice_source_email', '=', False)]}"/>
|
||||
<field name="auto_post"
|
||||
attrs="{'readonly': ['|',('reversed_entry_id', '!=', False),('state','!=','draft')]}"/>
|
||||
attrs="{'readonly': [('state','!=','draft')]}"/>
|
||||
<field name="to_check"/>
|
||||
</group>
|
||||
</group>
|
||||
@@ -1088,7 +1088,7 @@
|
||||
<group id="other_tab_entry_group">
|
||||
<group name="misc_group">
|
||||
<field name="auto_post"
|
||||
attrs="{'invisible': [('move_type', '!=', 'entry')], 'readonly': ['|',('reversed_entry_id', '!=', False),('state','!=','draft')]}"/>
|
||||
attrs="{'invisible': [('move_type', '!=', 'entry')], 'readonly': [('state','!=','draft')]}"/>
|
||||
<field name="reversed_entry_id"
|
||||
attrs="{'invisible': [('move_type', '!=', 'entry')]}"/>
|
||||
<field name="to_check"
|
||||
|
||||
@@ -10,6 +10,7 @@ from flectra import api, fields, models, _
|
||||
from flectra.exceptions import UserError, AccessDenied
|
||||
from flectra.tools import float_is_zero, pycompat
|
||||
from flectra.tools.misc import get_lang
|
||||
from stdnum.fr import siren
|
||||
|
||||
|
||||
class AccountFrFec(models.TransientModel):
|
||||
@@ -89,13 +90,24 @@ class AccountFrFec(models.TransientModel):
|
||||
sources:
|
||||
https://www.service-public.fr/professionnels-entreprises/vosdroits/F23570
|
||||
http://www.douane.gouv.fr/articles/a11024-tva-dans-les-dom
|
||||
|
||||
* Returns the siren if the company is french or an empty siren for dom-tom
|
||||
* For non-french companies -> returns the complete vat number
|
||||
"""
|
||||
dom_tom_group = self.env.ref('l10n_fr.dom-tom')
|
||||
is_dom_tom = company.country_id.code in dom_tom_group.country_ids.mapped('code')
|
||||
if not company.vat or is_dom_tom:
|
||||
return {'siren': ''}
|
||||
if is_dom_tom:
|
||||
return ''
|
||||
elif company.country_id.code == 'FR':
|
||||
if not company.vat:
|
||||
raise UserError(_("Missing VAT number for company %s") % company.display_name)
|
||||
elif len(company.vat) < 13 or not siren.is_valid(company.vat[4:13]):
|
||||
raise UserError(_("Invalid VAT number for company %s") % company.display_name)
|
||||
else:
|
||||
return company.vat[4:13]
|
||||
else:
|
||||
return {'siren': company.vat[4:13]}
|
||||
return '' if not company.vat else company.vat
|
||||
|
||||
|
||||
def generate_fec(self):
|
||||
self.ensure_one()
|
||||
@@ -383,7 +395,7 @@ class AccountFrFec(models.TransientModel):
|
||||
self.write({
|
||||
'fec_data': base64.encodebytes(fecvalue),
|
||||
# Filename = <siren>FECYYYYMMDD where YYYMMDD is the closing date
|
||||
'filename': '%sFEC%s%s.csv' % (company_legal_data['siren'], end_date, suffix),
|
||||
'filename': '%sFEC%s%s.csv' % (company_legal_data, end_date, suffix),
|
||||
})
|
||||
|
||||
# Set fiscal year lock date to the end date (not in test)
|
||||
|
||||
@@ -67,15 +67,20 @@ class MailTemplate(models.Model):
|
||||
help="Sidebar action to make this template available on records "
|
||||
"of the related document model")
|
||||
|
||||
@api.model
|
||||
def create(self, values):
|
||||
result = super().create(values)
|
||||
def _fix_attachment_ownership(self):
|
||||
for record in self:
|
||||
record.attachment_ids.write({'res_model': record._name, 'res_id': record.id})
|
||||
return self
|
||||
|
||||
# fix attachment ownership
|
||||
if result.attachment_ids:
|
||||
result.attachment_ids.write({'res_model': self._name, 'res_id': result.id})
|
||||
@api.model_create_multi
|
||||
def create(self, values_list):
|
||||
return super().create(values_list)\
|
||||
._fix_attachment_ownership()
|
||||
|
||||
return result
|
||||
def write(self, vals):
|
||||
super().write(vals)
|
||||
self._fix_attachment_ownership()
|
||||
return True
|
||||
|
||||
def unlink(self):
|
||||
self.unlink_action()
|
||||
|
||||
@@ -270,18 +270,20 @@ class MassMailing(models.Model):
|
||||
values['name'] = "%s %s" % (values['subject'], datetime.strftime(fields.datetime.now(), tools.DEFAULT_SERVER_DATETIME_FORMAT))
|
||||
if values.get('body_html'):
|
||||
values['body_html'] = self._convert_inline_images_to_urls(values['body_html'])
|
||||
result = super().create(values)
|
||||
|
||||
# fix attachment ownership
|
||||
if result.attachment_ids:
|
||||
result.attachment_ids.write({'res_model': self._name, 'res_id': result.id})
|
||||
|
||||
return result
|
||||
return super().create(values)\
|
||||
._fix_attachment_ownership()
|
||||
|
||||
def write(self, values):
|
||||
if values.get('body_html'):
|
||||
values['body_html'] = self._convert_inline_images_to_urls(values['body_html'])
|
||||
return super(MassMailing, self).write(values)
|
||||
super().write(values)
|
||||
self._fix_attachment_ownership()
|
||||
return True
|
||||
|
||||
def _fix_attachment_ownership(self):
|
||||
for record in self:
|
||||
record.attachment_ids.write({'res_model': record._name, 'res_id': record.id})
|
||||
return self
|
||||
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
|
||||
@@ -4,19 +4,27 @@ flectra.define('point_of_sale.CashBoxOpening', function(require) {
|
||||
const PosComponent = require('point_of_sale.PosComponent');
|
||||
const Registries = require('point_of_sale.Registries');
|
||||
const { Gui } = require('point_of_sale.Gui');
|
||||
const field_utils = require('web.field_utils');
|
||||
|
||||
class CashBoxOpening extends PosComponent {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.changes = {};
|
||||
this.defaultValue = this.env.pos.bank_statement.balance_start || 0;
|
||||
this.defaultValue = this.env.pos.format_currency_no_symbol(
|
||||
this.env.pos.bank_statement.balance_start || 0
|
||||
);
|
||||
this.symbol = this.env.pos.currency.symbol;
|
||||
}
|
||||
captureChange(event) {
|
||||
this.changes[event.target.name] = event.target.value;
|
||||
}
|
||||
startSession() {
|
||||
let cashOpening = this.changes.cashBoxValue? this.changes.cashBoxValue: this.defaultValue;
|
||||
let cashOpening = this.changes.cashBoxValue ? this.changes.cashBoxValue : this.defaultValue;
|
||||
try {
|
||||
cashOpening = field_utils.parse.float(cashOpening);
|
||||
} catch (err) {
|
||||
cashOpening = NaN;
|
||||
}
|
||||
if(isNaN(cashOpening)) {
|
||||
Gui.showPopup('ErrorPopup',{
|
||||
'title': 'Wrong value',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from flectra import exceptions
|
||||
from flectra import exceptions, SUPERUSER_ID
|
||||
from flectra.addons.sale.controllers.portal import CustomerPortal
|
||||
from flectra.http import request, route
|
||||
from flectra.tools import consteq
|
||||
@@ -29,8 +29,8 @@ class SaleStockPortal(CustomerPortal):
|
||||
except exceptions.AccessError:
|
||||
return request.redirect('/my')
|
||||
|
||||
# print report as sudo, since it require access to product, taxes, payment term etc.. and portal does not have those access rights.
|
||||
pdf = request.env.ref('stock.action_report_delivery').sudo()._render_qweb_pdf([picking_sudo.id])[0]
|
||||
# print report as SUPERUSER, since it require access to product, taxes, payment term etc.. and portal does not have those access rights.
|
||||
pdf = request.env.ref('stock.action_report_delivery').with_user(SUPERUSER_ID)._render_qweb_pdf([picking_sudo.id])[0]
|
||||
pdfhttpheaders = [
|
||||
('Content-Type', 'application/pdf'),
|
||||
('Content-Length', len(pdf)),
|
||||
|
||||
@@ -29,8 +29,9 @@ class AccountMove(models.Model):
|
||||
if self.state == 'draft':
|
||||
return []
|
||||
|
||||
sale_orders = self.mapped('invoice_line_ids.sale_line_ids.order_id')
|
||||
stock_move_lines = sale_orders.mapped('picking_ids.move_lines.move_line_ids')
|
||||
sale_lines = self.invoice_line_ids.sale_line_ids
|
||||
sale_orders = sale_lines.order_id
|
||||
stock_move_lines = sale_lines.move_ids.filtered(lambda r: r.state == 'done').move_line_ids
|
||||
|
||||
# Get the other customer invoices and refunds.
|
||||
ordered_invoice_ids = sale_orders.mapped('invoice_ids')\
|
||||
@@ -46,27 +47,33 @@ class AccountMove(models.Model):
|
||||
break
|
||||
i += 1
|
||||
|
||||
# Get the previous invoice if any.
|
||||
# Get the previous invoices if any.
|
||||
previous_invoices = ordered_invoice_ids[:self_index]
|
||||
last_invoice = previous_invoices[-1] if len(previous_invoices) else None
|
||||
|
||||
# Get the incoming and outgoing sml between self.invoice_date and the previous invoice (if any).
|
||||
# Get the incoming and outgoing sml between self.invoice_date and the previous invoice (if any) of the related product.
|
||||
write_dates = [wd for wd in self.invoice_line_ids.mapped('write_date') if wd]
|
||||
self_datetime = max(write_dates) if write_dates else None
|
||||
last_write_dates = last_invoice and [wd for wd in last_invoice.invoice_line_ids.mapped('write_date') if wd]
|
||||
last_invoice_datetime = max(last_write_dates) if last_write_dates else None
|
||||
last_invoice_datetime = dict()
|
||||
for product in self.invoice_line_ids.product_id:
|
||||
last_invoice = previous_invoices.filtered(lambda inv: product in inv.invoice_line_ids.product_id)
|
||||
last_invoice = last_invoice[-1] if len(last_invoice) else None
|
||||
last_write_dates = last_invoice and [wd for wd in last_invoice.invoice_line_ids.mapped('write_date') if wd]
|
||||
last_invoice_datetime[product] = max(last_write_dates) if last_write_dates else None
|
||||
|
||||
def _filter_incoming_sml(ml):
|
||||
if ml.state == 'done' and ml.location_id.usage == 'customer' and ml.lot_id:
|
||||
if last_invoice_datetime:
|
||||
return last_invoice_datetime <= ml.date <= self_datetime
|
||||
last_date = last_invoice_datetime.get(ml.product_id)
|
||||
if last_date:
|
||||
return last_date <= ml.date <= self_datetime
|
||||
else:
|
||||
return ml.date <= self_datetime
|
||||
return False
|
||||
|
||||
def _filter_outgoing_sml(ml):
|
||||
if ml.state == 'done' and ml.location_dest_id.usage == 'customer' and ml.lot_id:
|
||||
if last_invoice_datetime:
|
||||
return last_invoice_datetime <= ml.date <= self_datetime
|
||||
last_date = last_invoice_datetime.get(ml.product_id)
|
||||
if last_date:
|
||||
return last_date <= ml.date <= self_datetime
|
||||
else:
|
||||
return ml.date <= self_datetime
|
||||
return False
|
||||
|
||||
@@ -61,7 +61,7 @@ class TestMassMailPerformance(TestMassMailPerformanceBase):
|
||||
})
|
||||
|
||||
# runbot needs +51 compared to local
|
||||
with self.assertQueryCount(__system__=1717, marketing=1718): # test_mass_mailing_only: 1665 - 1666
|
||||
with self.assertQueryCount(__system__=1718, marketing=1720): # test_mass_mailing_only: 1665 - 1666
|
||||
mailing.action_send_mail()
|
||||
|
||||
self.assertEqual(mailing.sent, 50)
|
||||
@@ -101,7 +101,7 @@ class TestMassMailBlPerformance(TestMassMailPerformanceBase):
|
||||
})
|
||||
|
||||
# runbot needs +63 compared to local
|
||||
with self.assertQueryCount(__system__=1994, marketing=1995): # test_mass_mailing only: 1931 - 1932
|
||||
with self.assertQueryCount(__system__=1995, marketing=1997): # test_mass_mailing only: 1931 - 1932
|
||||
mailing.action_send_mail()
|
||||
|
||||
self.assertEqual(mailing.sent, 50)
|
||||
|
||||
Reference in New Issue
Block a user