diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 5dde66d81de..796974adade 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -1173,6 +1173,11 @@ class AccountMoveLine(models.Model): account_move_line.payment_id.write({'invoice_ids': [(3, invoice.id, None)]}) rec_move_ids += account_move_line.matched_debit_ids rec_move_ids += account_move_line.matched_credit_ids + if self.env.context.get('invoice_id'): + current_invoice = self.env['account.invoice'].browse(self.env.context['invoice_id']) + rec_move_ids = rec_move_ids.filtered( + lambda r: (r.debit_move_id + r.credit_move_id) & current_invoice.move_id.line_ids + ) return rec_move_ids.unlink() #################################################### diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py index bda31562874..84c8092234b 100644 --- a/addons/account/tests/test_reconciliation.py +++ b/addons/account/tests/test_reconciliation.py @@ -621,3 +621,39 @@ class TestReconciliation(AccountingTestCase): # Checking if the direction of the move is correct full_rec_payable = full_rec_move.line_ids.filtered(lambda l: l.account_id == self.account_rsa) self.assertEqual(full_rec_payable.balance, 18.75) + + def test_unreconcile(self): + # Use case: + # 2 invoices paid with a single payment. Unreconcile the payment with one invoice, the + # other invoice should remain reconciled. + inv1 = self.create_invoice(invoice_amount=10, currency_id=self.currency_usd_id) + inv2 = self.create_invoice(invoice_amount=20, currency_id=self.currency_usd_id) + payment = self.env['account.payment'].create({ + 'payment_type': 'inbound', + 'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id, + 'partner_type': 'customer', + 'partner_id': self.partner_agrolait_id, + 'amount': 100, + 'currency_id': self.currency_usd_id, + 'journal_id': self.bank_journal_usd.id, + }) + payment.post() + credit_aml = payment.move_line_ids.filtered('credit') + + # Check residual before assignation + self.assertAlmostEquals(inv1.residual, 10) + self.assertAlmostEquals(inv2.residual, 20) + + # Assign credit and residual + inv1.assign_outstanding_credit(credit_aml.id) + inv2.assign_outstanding_credit(credit_aml.id) + self.assertAlmostEquals(inv1.residual, 0) + self.assertAlmostEquals(inv2.residual, 0) + + # Unreconcile one invoice at a time and check residual + credit_aml.with_context(invoice_id=inv1.id).remove_move_reconcile() + self.assertAlmostEquals(inv1.residual, 10) + self.assertAlmostEquals(inv2.residual, 0) + credit_aml.with_context(invoice_id=inv2.id).remove_move_reconcile() + self.assertAlmostEquals(inv1.residual, 10) + self.assertAlmostEquals(inv2.residual, 20) diff --git a/addons/l10n_ch/i18n_extra/de_CH.po b/addons/l10n_ch/i18n_extra/de_CH.po index 23e7511b472..0f9c0b78726 100644 --- a/addons/l10n_ch/i18n_extra/de_CH.po +++ b/addons/l10n_ch/i18n_extra/de_CH.po @@ -604,7 +604,7 @@ msgstr "Bankverbindlichkeiten" #: model:account.account,name:l10n_ch.1_ch_coa_2160 #: model:account.account.template,name:l10n_ch.ch_coa_2160 msgid "Dettes envers l'actionnaire" -msgstr "" +msgstr "Gesellschafterverbindlichkeiten" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3806 @@ -612,7 +612,7 @@ msgstr "" #: model:account.account.template,name:l10n_ch.ch_coa_3806 #: model:account.account.template,name:l10n_ch.ch_coa_4906 msgid "Différences de change" -msgstr "" +msgstr "Währungsdifferenzen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_2261 @@ -624,7 +624,7 @@ msgstr "Beschlossene Ausschüttungen" #: model:account.account,name:l10n_ch.1_ch_coa_4071 #: model:account.account.template,name:l10n_ch.ch_coa_4071 msgid "Droits de douanes à l'importation" -msgstr "" +msgstr "Einfuhrzölle" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1109 @@ -648,7 +648,7 @@ msgstr "Abrechnungskonto MWST" #: model:account.account,name:l10n_ch.1_ch_coa_4009 #: model:account.account.template,name:l10n_ch.ch_coa_4009 msgid "Déductions obtenues sur achats" -msgstr "" +msgstr "Einkaufsrabatte" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3009 @@ -714,7 +714,7 @@ msgstr "Unterhalt, Reparaturen, Ersatz mobile Sachanlagen" #: model:account.account,name:l10n_ch.1_ch_coa_1570 #: model:account.account.template,name:l10n_ch.ch_coa_1570 msgid "Equipements et Installations" -msgstr "" +msgstr "Feste Einrichtungen und Installationen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3800 @@ -722,7 +722,7 @@ msgstr "" #: model:account.account.template,name:l10n_ch.ch_coa_3800 #: model:account.account.template,name:l10n_ch.ch_coa_4900 msgid "Escomptes" -msgstr "" +msgstr "Erlösminderungen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4530 @@ -734,31 +734,31 @@ msgstr "Benzin" #: model:account.account,name:l10n_ch.1_ch_coa_3804 #: model:account.account.template,name:l10n_ch.ch_coa_3804 msgid "Frais d'encaissement" -msgstr "Frais d'encaissement" +msgstr "Inkassoaufwand" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3807 #: model:account.account.template,name:l10n_ch.ch_coa_3807 msgid "Frais d'expédition" -msgstr "Frais d'expédition" +msgstr "Versandkosten" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4072 #: model:account.account.template,name:l10n_ch.ch_coa_4072 msgid "Frais de transport à l'achat" -msgstr "Frais de transport à l'achat" +msgstr "Transportkosten" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4070 #: model:account.account.template,name:l10n_ch.ch_coa_4070 msgid "Frêts à l'achat" -msgstr "" +msgstr "Frachtkosten" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4510 #: model:account.account.template,name:l10n_ch.ch_coa_4510 msgid "Gaz" -msgstr "Gaz" +msgstr "Gas" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1770 @@ -992,7 +992,7 @@ msgstr "Beteiligungen" #: model:account.account,name:l10n_ch.1_ch_coa_4086 #: model:account.account.template,name:l10n_ch.ch_coa_4086 msgid "Pertes de matières" -msgstr "" +msgstr "Warenschwund" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3805 @@ -1125,13 +1125,13 @@ msgstr "Werbeaufwand" #: model:account.account,name:l10n_ch.1_ch_coa_3801 #: model:account.account.template,name:l10n_ch.ch_coa_3801 msgid "Rabais et réduction de prix" -msgstr "" +msgstr "Rabatte und Preisreduktionen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4901 #: model:account.account.template,name:l10n_ch.ch_coa_4901 msgid "Rabais et réductions de prix" -msgstr "" +msgstr "Rabatte und Preisreduktionen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3802 @@ -1139,7 +1139,7 @@ msgstr "" #: model:account.account.template,name:l10n_ch.ch_coa_3802 #: model:account.account.template,name:l10n_ch.ch_coa_4092 msgid "Ristournes" -msgstr "" +msgstr "Rückvergütungen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_2940 @@ -1473,13 +1473,13 @@ msgstr "Wertschriften" #: model:account.account,name:l10n_ch.1_transfer_account_id #: model:account.account.template,name:l10n_ch.transfer_account_id msgid "Transferts internes" -msgstr "" +msgstr "Interne Verrechnungen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1280 #: model:account.account.template,name:l10n_ch.ch_coa_1280 msgid "Travaux en cours" -msgstr "Unfertige Erzeugnisse" +msgstr "Nicht fakturierte Dienstleistungen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3940 @@ -1491,19 +1491,19 @@ msgstr "Bestandesänderungen nicht fakturierte Dienstleistungen" #: model:account.account,name:l10n_ch.1_ch_coa_1287 #: model:account.account.template,name:l10n_ch.ch_coa_1287 msgid "Variation de la valeur des travaux en cours" -msgstr "" +msgstr "Bestandesänderungen nicht fakturierte Dienstleistungen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1277 #: model:account.account.template,name:l10n_ch.ch_coa_1277 msgid "Variation de stock produits semi-ouvrés" -msgstr "" +msgstr "Bestandesänderungen unfertige Erzeugnisse" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1267 #: model:account.account.template,name:l10n_ch.ch_coa_1267 msgid "Variation de stocks de produits finis" -msgstr "" +msgstr "Bestandesänderungen fertige Erzeugnisse" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_1207 @@ -1511,13 +1511,13 @@ msgstr "" #: model:account.account.template,name:l10n_ch.ch_coa_1207 #: model:account.account.template,name:l10n_ch.ch_coa_4800 msgid "Variation des stocks de marchandises" -msgstr "" +msgstr "Bestandesänderungen Handelsware" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4801 #: model:account.account.template,name:l10n_ch.ch_coa_4801 msgid "Variation des stocks de matières premières" -msgstr "" +msgstr "Bestandesänderungen Rohstoffe" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3901 @@ -1535,7 +1535,7 @@ msgstr "Bestandesänderungen unfertige Erzeugnisse" #: model:account.account,name:l10n_ch.1_ch_coa_1217 #: model:account.account.template,name:l10n_ch.ch_coa_1217 msgid "Variation des stocks des matières premières" -msgstr "" +msgstr "Bestandesänderungen Rohstoffe" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_4008 @@ -1543,7 +1543,7 @@ msgstr "" #: model:account.account.template,name:l10n_ch.ch_coa_4008 #: model:account.account.template,name:l10n_ch.ch_coa_4080 msgid "Variations de stocks" -msgstr "" +msgstr "Inventurdifferenzen" #. module: l10n_ch #: model:account.account,name:l10n_ch.1_ch_coa_3200 diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 819f6ddf2d3..24f24216ba0 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -719,6 +719,8 @@ class MassMailing(models.Model): def _process_mass_mailing_queue(self): mass_mailings = self.search([('state', 'in', ('in_queue', 'sending')), '|', ('schedule_date', '<', fields.Datetime.now()), ('schedule_date', '=', False)]) for mass_mailing in mass_mailings: + user = mass_mailing.write_uid or self.env.user + mass_mailing = mass_mailing.with_context(**user.sudo(user=user).context_get()) if len(mass_mailing.get_remaining_recipients()) > 0: mass_mailing.state = 'sending' mass_mailing.send_mail() diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index 2052ed27ced..f18a5215c34 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -278,7 +278,7 @@