point_of_sale/tests/test_pos_other_currency_config.py

319 lines
19 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import odoo
from odoo import tools
from odoo.tests.common import Form
from odoo.addons.point_of_sale.tests.common import TestPoSCommon
@odoo.tests.tagged('post_install', '-at_install')
class TestPoSOtherCurrencyConfig(TestPoSCommon):
""" Test PoS with basic configuration
"""
def setUp(self):
super(TestPoSOtherCurrencyConfig, self).setUp()
self.config = self.other_currency_config
self.product1 = self.create_product('Product 1', self.categ_basic, 10.0, 5)
self.product2 = self.create_product('Product 2', self.categ_basic, 20.0, 10)
self.product3 = self.create_product('Product 3', self.categ_basic, 30.0, 15)
self.product4 = self.create_product('Product 4', self.categ_anglo, 100, 50)
self.product5 = self.create_product('Product 5', self.categ_anglo, 200, 70)
self.product6 = self.create_product('Product 6', self.categ_anglo, 45.3, 10.73)
self.product7 = self.create_product('Product 7', self.categ_basic, 7, 7, tax_ids=self.taxes['tax7'].ids)
self.adjust_inventory(
[self.product1, self.product2, self.product3, self.product4, self.product5, self.product6, self.product7],
[100, 50, 50, 100, 100, 100, 100]
)
# change the price of product2 to 12.99 fixed. No need to convert.
pricelist_item = self.env['product.pricelist.item'].create({
'product_tmpl_id': self.product2.product_tmpl_id.id,
'fixed_price': 12.99,
})
self.config.pricelist_id.write({'item_ids': [(6, 0, (self.config.pricelist_id.item_ids | pricelist_item).ids)]})
self.output_account = self.categ_anglo.property_stock_account_output_categ_id
self.expense_account = self.categ_anglo.property_account_expense_categ_id
def test_01_check_product_cost(self):
# Product price should be half of the original price because currency rate is 0.5.
# (see `self._create_other_currency_config` method)
# Except for product2 where the price is specified in the pricelist.
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product1, 1), 5.00)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product2, 1), 12.99)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product3, 1), 15.00)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product4, 1), 50)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product5, 1), 100)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product6, 1), 22.65)
self.assertAlmostEqual(self.config.pricelist_id._get_product_price(self.product7, 1), 3.50)
def test_02_orders_without_invoice(self):
""" orders without invoice
Orders
======
+---------+----------+-----------+----------+-----+-------+
| order | payments | invoiced? | product | qty | total |
+---------+----------+-----------+----------+-----+-------+
| order 1 | cash | no | product1 | 10 | 50 |
| | | | product2 | 10 | 129.9 |
| | | | product3 | 10 | 150 |
+---------+----------+-----------+----------+-----+-------+
| order 2 | cash | no | product1 | 5 | 25 |
| | | | product2 | 5 | 64.95 |
+---------+----------+-----------+----------+-----+-------+
| order 3 | bank | no | product2 | 5 | 64.95 |
| | | | product3 | 5 | 75 |
+---------+----------+-----------+----------+-----+-------+
Expected Result
===============
+---------------------+---------+-----------------+
| account | balance | amount_currency |
+---------------------+---------+-----------------+
| sale_account | -1119.6 | -559.80 |
| pos receivable bank | 279.9 | 139.95 |
| pos receivable cash | 839.7 | 419.85 |
+---------------------+---------+-----------------+
| Total balance | 0.0 | 0.00 |
+---------------------+---------+-----------------+
"""
def _before_closing_cb():
# check values before closing the session
self.assertEqual(3, self.pos_session.order_count)
orders_total = sum(order.amount_total for order in self.pos_session.order_ids)
self.assertAlmostEqual(orders_total, self.pos_session.total_payments_amount, msg='Total order amount should be equal to the total payment amount.')
self._run_test({
'payment_methods': self.cash_pm2 | self.bank_pm2,
'orders': [
{'pos_order_lines_ui_args': [(self.product1, 10), (self.product2, 10), (self.product3, 10)], 'uid': '00100-010-0001'},
{'pos_order_lines_ui_args': [(self.product1, 5), (self.product2, 5)], 'uid': '00100-010-0002'},
{'pos_order_lines_ui_args': [(self.product2, 5), (self.product3, 5)], 'payments': [(self.bank_pm2, 139.95)], 'uid': '00100-010-0003'},
],
'before_closing_cb': _before_closing_cb,
'journal_entries_before_closing': {},
'journal_entries_after_closing': {
'session_journal_entry': {
'line_ids': [
{'account_id': self.sales_account.id, 'partner_id': False, 'debit': 0, 'credit': 1119.6, 'reconciled': False, 'amount_currency': -559.80},
{'account_id': self.bank_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 279.9, 'credit': 0, 'reconciled': True, 'amount_currency': 139.95},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 839.7, 'credit': 0, 'reconciled': True, 'amount_currency': 419.85},
],
},
'cash_statement': [
((419.85, ), {
'line_ids': [
{'account_id': self.cash_pm2.journal_id.default_account_id.id, 'partner_id': False, 'debit': 839.7, 'credit': 0, 'reconciled': False, 'amount_currency': 419.85},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 839.7, 'reconciled': True, 'amount_currency': -419.85},
]
}),
],
'bank_payments': [
((139.95, ), {
'line_ids': [
{'account_id': self.bank_pm2.outstanding_account_id.id, 'partner_id': False, 'debit': 279.9, 'credit': 0, 'reconciled': False, 'amount_currency': 139.95},
{'account_id': self.bank_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 279.9, 'reconciled': True, 'amount_currency': -139.95},
]
}),
],
},
})
def test_03_orders_with_invoice(self):
""" orders with invoice
Orders
======
+---------+----------+---------------+----------+-----+-------+
| order | payments | invoiced? | product | qty | total |
+---------+----------+---------------+----------+-----+-------+
| order 1 | cash | no | product1 | 10 | 50 |
| | | | product2 | 10 | 129.9 |
| | | | product3 | 10 | 150 |
+---------+----------+---------------+----------+-----+-------+
| order 2 | cash | yes, customer | product1 | 5 | 25 |
| | | | product2 | 5 | 64.95 |
+---------+----------+---------------+----------+-----+-------+
| order 3 | bank | yes, customer | product2 | 5 | 64.95 |
| | | | product3 | 5 | 75 |
+---------+----------+---------------+----------+-----+-------+
Expected Result
===============
+---------------------+---------+-----------------+
| account | balance | amount_currency |
+---------------------+---------+-----------------+
| sale_account | -659.8 | -329.90 |
| pos receivable bank | 279.9 | 139.95 |
| pos receivable cash | 839.7 | 419.85 |
| invoice receivable | -179.9 | -89.95 |
| invoice receivable | -279.9 | -139.95 |
+---------------------+---------+-----------------+
| Total balance | 0.0 | 0.00 |
+---------------------+---------+-----------------+
"""
def _before_closing_cb():
# check values before closing the session
self.assertEqual(3, self.pos_session.order_count)
orders_total = sum(order.amount_total for order in self.pos_session.order_ids)
self.assertAlmostEqual(orders_total, self.pos_session.total_payments_amount, msg='Total order amount should be equal to the total payment amount.')
self._run_test({
'payment_methods': self.cash_pm2 | self.bank_pm2,
'orders': [
{'pos_order_lines_ui_args': [(self.product1, 10), (self.product2, 10), (self.product3, 10)], 'uid': '00100-010-0001'},
{'pos_order_lines_ui_args': [(self.product1, 5), (self.product2, 5)], 'is_invoiced': True, 'customer': self.customer, 'uid': '00100-010-0002'},
{'pos_order_lines_ui_args': [(self.product2, 5), (self.product3, 5)], 'payments': [(self.bank_pm2, 139.95)], 'is_invoiced': True, 'customer': self.customer, 'uid': '00100-010-0003'},
],
'before_closing_cb': _before_closing_cb,
'journal_entries_before_closing': {
'00100-010-0002': {
'payments': [
((self.cash_pm2, 89.95), {
'line_ids': [
{'account_id': self.c1_receivable.id, 'partner_id': self.customer.id, 'debit': 0, 'credit': 179.90, 'reconciled': True, 'amount_currency': -89.95},
{'account_id': self.pos_receivable_account.id, 'partner_id': False, 'debit': 179.90, 'credit': 0, 'reconciled': False, 'amount_currency': 89.95},
]
}),
],
},
'00100-010-0003': {
'payments': [
((self.bank_pm2, 139.95), {
'line_ids': [
{'account_id': self.c1_receivable.id, 'partner_id': self.customer.id, 'debit': 0, 'credit': 279.9, 'reconciled': True, 'amount_currency': -139.95},
{'account_id': self.pos_receivable_account.id, 'partner_id': False, 'debit': 279.9, 'credit': 0, 'reconciled': False, 'amount_currency': 139.95},
]
}),
],
},
},
'journal_entries_after_closing': {
'session_journal_entry': {
'line_ids': [
{'account_id': self.sales_account.id, 'partner_id': False, 'debit': 0, 'credit': 659.8, 'reconciled': False, 'amount_currency': -329.90},
{'account_id': self.bank_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 279.9, 'credit': 0, 'reconciled': True, 'amount_currency': 139.95},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 839.7, 'credit': 0, 'reconciled': True, 'amount_currency': 419.85},
{'account_id': self.pos_receivable_account.id, 'partner_id': False, 'debit': 0, 'credit': 179.90, 'reconciled': True, 'amount_currency': -89.95},
{'account_id': self.pos_receivable_account.id, 'partner_id': False, 'debit': 0, 'credit': 279.9, 'reconciled': True, 'amount_currency': -139.95},
],
},
'cash_statement': [
((419.85, ), {
'line_ids': [
{'account_id': self.cash_pm2.journal_id.default_account_id.id, 'partner_id': False, 'debit': 839.7, 'credit': 0, 'reconciled': False, 'amount_currency': 419.85},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 839.7, 'reconciled': True, 'amount_currency': -419.85},
]
}),
],
'bank_payments': [
((139.95, ), {
'line_ids': [
{'account_id': self.bank_pm2.outstanding_account_id.id, 'partner_id': False, 'debit': 279.9, 'credit': 0, 'reconciled': False, 'amount_currency': 139.95},
{'account_id': self.bank_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 279.9, 'reconciled': True, 'amount_currency': -139.95},
]
}),
],
},
})
def test_04_anglo_saxon_products(self):
"""
======
Orders
======
+---------+----------+-----------+----------+-----+----------+------------+
| order | payments | invoiced? | product | qty | total | total cost |
| | | | | | | |
+---------+----------+-----------+----------+-----+----------+------------+
| order 1 | cash | no | product4 | 7 | 700 | 350 |
| | | | product5 | 7 | 1400 | 490 |
+---------+----------+-----------+----------+-----+----------+------------+
| order 2 | cash | no | product5 | 6 | 1200 | 420 |
| | | | product4 | 6 | 600 | 300 |
| | | | product6 | 49 | 2219.7 | 525.77 |
+---------+----------+-----------+----------+-----+----------+------------+
| order 3 | cash | no | product5 | 2 | 400 | 140 |
| | | | product6 | 13 | 588.9 | 139.49 |
+---------+----------+-----------+----------+-----+----------+------------+
| order 4 | cash | no | product6 | 1 | 45.3 | 10.73 |
+---------+----------+-----------+----------+-----+----------+------------+
===============
Expected Result
===============
+---------------------+------------+-----------------+
| account | balance | amount_currency |
+---------------------+------------+-----------------+
| sale_account | -7153.90 | -3576.95 |
| pos_receivable-cash | 7153.90 | 3576.95 |
| expense_account | 2375.99 | 2375.99 |
| output_account | -2375.99 | -2375.99 |
+---------------------+------------+-----------------+
| Total balance | 0.00 | 0.00 |
+---------------------+------------+-----------------+
"""
self._run_test({
'payment_methods': self.cash_pm2,
'orders': [
{'pos_order_lines_ui_args': [(self.product4, 7), (self.product5, 7)], 'uid': '00100-010-0001'},
{'pos_order_lines_ui_args': [(self.product5, 6), (self.product4, 6), (self.product6, 49)], 'uid': '00100-010-0002'},
{'pos_order_lines_ui_args': [(self.product5, 2), (self.product6, 13)], 'uid': '00100-010-0003'},
{'pos_order_lines_ui_args': [(self.product6, 1)], 'uid': '00100-010-0004'},
],
'journal_entries_before_closing': {},
'journal_entries_after_closing': {
'session_journal_entry': {
'line_ids': [
{'account_id': self.sales_account.id, 'partner_id': False, 'debit': 0, 'credit': 7153.90, 'reconciled': False, 'amount_currency': -3576.95},
{'account_id': self.expense_account.id, 'partner_id': False, 'debit': 2375.99, 'credit': 0, 'reconciled': False, 'amount_currency': 2375.99},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 7153.90, 'credit': 0, 'reconciled': True, 'amount_currency': 3576.95},
{'account_id': self.output_account.id, 'partner_id': False, 'debit': 0, 'credit': 2375.99, 'reconciled': True, 'amount_currency': -2375.99},
],
},
'cash_statement': [
((3576.95, ), {
'line_ids': [
{'account_id': self.cash_pm2.journal_id.default_account_id.id, 'partner_id': False, 'debit': 7153.90, 'credit': 0, 'reconciled': False, 'amount_currency': 3576.95},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 7153.90, 'reconciled': True, 'amount_currency': -3576.95},
]
}),
],
'bank_payments': [],
},
})
def test_05_tax_base_amount(self):
self._run_test({
'payment_methods': self.cash_pm2,
'orders': [
{'pos_order_lines_ui_args': [(self.product7, 7)], 'uid': '00100-010-0001'},
],
'journal_entries_before_closing': {},
'journal_entries_after_closing': {
'session_journal_entry': {
'line_ids': [
{'account_id': self.tax_received_account.id, 'partner_id': False, 'debit': 0, 'credit': 3.43, 'reconciled': False, 'amount_currency': -1.715, 'tax_base_amount': 49},
{'account_id': self.sales_account.id, 'partner_id': False, 'debit': 0, 'credit': 49, 'reconciled': False, 'amount_currency': -24.5, 'tax_base_amount': 0},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 52.43, 'credit': 0, 'reconciled': True, 'amount_currency': 26.215, 'tax_base_amount': 0},
],
},
'cash_statement': [
((26.215, ), {
'line_ids': [
{'account_id': self.cash_pm2.journal_id.default_account_id.id, 'partner_id': False, 'debit': 52.43, 'credit': 0, 'reconciled': False, 'amount_currency': 26.215},
{'account_id': self.cash_pm2.receivable_account_id.id, 'partner_id': False, 'debit': 0, 'credit': 52.43, 'reconciled': True, 'amount_currency': -26.215},
]
}),
],
'bank_payments': [],
},
})