diff --git a/addons/sale/models/account_reconciliation_widget.py b/addons/sale/models/account_reconciliation_widget.py index ff6612a0891..517d4e76e5d 100644 --- a/addons/sale/models/account_reconciliation_widget.py +++ b/addons/sale/models/account_reconciliation_widget.py @@ -16,7 +16,7 @@ class AccountReconciliation(models.AbstractModel): FROM sale_order o, account_bank_statement_line stl WHERE - lower(concat(o.name,o.reference)) ~ lower(stl.name) + POSITION(lower(stl.name) IN lower(concat(o.name,o.reference))) != 0 AND stl.id IN %s AND (stl.partner_id is null OR stl.partner_id = o.partner_id) AND (o.invoice_status = 'to invoice' OR o.state = 'sent') diff --git a/addons/sale/tests/test_sale_order.py b/addons/sale/tests/test_sale_order.py index 78a1afec795..ea44bceaf57 100644 --- a/addons/sale/tests/test_sale_order.py +++ b/addons/sale/tests/test_sale_order.py @@ -238,3 +238,58 @@ class TestSaleOrder(TestCommonSaleNoChart): self.assertEquals(self.sale_order.amount_total, self.sale_order.amount_untaxed + self.sale_order.amount_tax, 'Taxes should be applied') + + def test_reconciliation_with_so(self): + # create SO + so = self.env['sale.order'].create({ + 'name': 'SO/01/01', + 'reference': 'Petit suisse', + 'partner_id': self.partner_customer_usd.id, + 'partner_invoice_id': self.partner_customer_usd.id, + 'partner_shipping_id': self.partner_customer_usd.id, + 'pricelist_id': self.pricelist_usd.id, + }) + self.env['sale.order.line'].create({ + 'name': self.product_order.name, + 'product_id': self.product_order.id, + 'product_uom_qty': 2, + 'product_uom': self.product_order.uom_id.id, + 'price_unit': self.product_order.list_price, + 'order_id': so.id, + 'tax_id': False, + }) + # Mark SO as sent otherwise we won't find any match + so.write({'state': 'sent'}) + # Create bank statement + statement = self.env['account.bank.statement'].create({ + 'name': 'Test', + 'journal_id': self.journal_purchase.id, + 'user_id': self.user_employee.id, + }) + st_line1 = self.env['account.bank.statement.line'].create({ + 'name': 'should not find anything', + 'amount': 15, + 'statement_id': statement.id + }) + st_line2 = self.env['account.bank.statement.line'].create({ + 'name': 'SO/01', + 'amount': 15, + 'statement_id': statement.id + }) + st_line3 = self.env['account.bank.statement.line'].create({ + 'name': 'suisse', + 'amount': 15, + 'statement_id': statement.id + }) + # Call get_bank_statement_line_data for st_line_1, should not find any sale order + res = self.env['account.reconciliation.widget'].get_bank_statement_line_data([st_line1.id]) + line = res.get('lines', [{}])[0] + self.assertFalse(line.get('sale_order_ids', False)) + # Call again for st_line_2, it should find sale_order + res = self.env['account.reconciliation.widget'].get_bank_statement_line_data([st_line2.id]) + line = res.get('lines', [{}])[0] + self.assertEquals(line.get('sale_order_ids', []), [so.id]) + # Call again for st_line_3, it should find sale_order based on reference + res = self.env['account.reconciliation.widget'].get_bank_statement_line_data([st_line3.id]) + line = res.get('lines', [{}])[0] + self.assertEquals(line.get('sale_order_ids', []), [so.id])