You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
5.7 KiB
172 lines
5.7 KiB
# Copyright (C) 2018 - Today: GRAP (http://www.grap.coop)
|
|
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import fields
|
|
from odoo.tests.common import TransactionCase
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class TestModule(TransactionCase):
|
|
"""Tests for 'Point of Sale - Change Payment' Module"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.PosSession = self.env["pos.session"]
|
|
self.PosOrder = self.env["pos.order"]
|
|
self.AccountJournal = self.env["account.journal"]
|
|
self.PosMakePayment = self.env['pos.make.payment']
|
|
self.PosPaymentChangeWizard = self.env["pos.payment.change.wizard"]
|
|
self.PosPaymentChangeWizardNewLine = self.env[
|
|
"pos.payment.change.wizard.new.line"
|
|
]
|
|
self.product = self.env.ref("product.product_product_3")
|
|
self.pos_config = self.env.ref("point_of_sale.pos_config_main").copy()
|
|
|
|
def _initialize_journals_open_session(self):
|
|
|
|
self.check_journal = self.AccountJournal.create({
|
|
"name": "Demo Check Journal",
|
|
"type": "bank",
|
|
"journal_user": True,
|
|
})
|
|
self.cash_journal = self.AccountJournal.create({
|
|
"name": "Demo Cash Journal",
|
|
"type": "cash",
|
|
"journal_user": True,
|
|
})
|
|
|
|
# create new session and open it
|
|
self.pos_config.journal_ids = [
|
|
self.check_journal.id,
|
|
self.cash_journal.id,
|
|
]
|
|
self.pos_config.open_session_cb()
|
|
self.session = self.pos_config.current_session_id
|
|
self.check_statement = self.session.statement_ids.filtered(
|
|
lambda x: x.journal_id == self.check_journal
|
|
)
|
|
self.cash_statement = self.session.statement_ids.filtered(
|
|
lambda x: x.journal_id == self.cash_journal
|
|
)
|
|
|
|
def _sale(self, journal_1, price_1, journal_2=False, price_2=0.0):
|
|
price = price_1 + price_2
|
|
line_vals = {
|
|
"name": "OL/0001",
|
|
"product_id": self.product.id,
|
|
"qty": 1.0,
|
|
"price_unit": price,
|
|
"price_subtotal": price,
|
|
"price_subtotal_incl": price,
|
|
}
|
|
order = self.PosOrder.create({
|
|
"session_id": self.session.id,
|
|
"amount_tax": 0,
|
|
"amount_total": price,
|
|
"amount_paid": price,
|
|
"amount_return": 0,
|
|
"lines": [[0, False, line_vals]],
|
|
})
|
|
order.add_payment({
|
|
'amount': price_1,
|
|
'payment_date': fields.Date.today(),
|
|
'payment_name': "Demo",
|
|
'journal': journal_1.id,
|
|
})
|
|
if journal_2:
|
|
order.add_payment({
|
|
'amount': price_2,
|
|
'payment_date': fields.Date.today(),
|
|
'payment_name': "Demo",
|
|
'journal': journal_2.id,
|
|
})
|
|
order.action_pos_order_paid()
|
|
return order
|
|
|
|
def _change_payment(
|
|
self, order, journal_1, amount_1, journal_2=False, amount_2=0.0
|
|
):
|
|
# Switch to check journal
|
|
wizard = self.PosPaymentChangeWizard.with_context(
|
|
active_id=order.id
|
|
).create({})
|
|
self.PosPaymentChangeWizardNewLine.with_context(
|
|
active_id=order.id
|
|
).create(
|
|
{
|
|
"wizard_id": wizard.id,
|
|
"new_journal_id": journal_1.id,
|
|
"amount": amount_1,
|
|
}
|
|
)
|
|
if journal_2:
|
|
self.PosPaymentChangeWizardNewLine.with_context(
|
|
active_id=order.id
|
|
).create(
|
|
{
|
|
"wizard_id": wizard.id,
|
|
"new_journal_id": journal_2.id,
|
|
"amount": amount_2,
|
|
}
|
|
)
|
|
wizard.button_change_payment()
|
|
|
|
# Test Section
|
|
def test_01_payment_change_policy_update(self):
|
|
self.pos_config.payment_change_policy = "update"
|
|
|
|
self._initialize_journals_open_session()
|
|
# Make a sale with 35 in cash journal and 65 in check
|
|
order = self._sale(self.cash_journal, 35, self.check_journal, 65)
|
|
|
|
order_qty = len(self.PosOrder.search([]))
|
|
|
|
with self.assertRaises(UserError):
|
|
# Should not work if total is not correct
|
|
self._change_payment(
|
|
order, self.cash_journal, 10, self.check_journal, 10)
|
|
|
|
self._change_payment(
|
|
order, self.cash_journal, 10, self.check_journal, 90)
|
|
|
|
# check Session
|
|
self.assertEqual(
|
|
self.cash_statement.balance_end,
|
|
10,
|
|
"Bad recompute of the balance for the statement cash",
|
|
)
|
|
|
|
self.assertEqual(
|
|
self.check_statement.balance_end,
|
|
90,
|
|
"Bad recompute of the balance for the statement check",
|
|
)
|
|
|
|
# Check Order quantity
|
|
self.assertEqual(
|
|
order_qty,
|
|
len(self.PosOrder.search([])),
|
|
"In 'Update' mode, changing payment should not create"
|
|
" other PoS Orders",
|
|
)
|
|
|
|
def test_02_payment_change_policy_refund(self):
|
|
self.pos_config.payment_change_policy = "refund"
|
|
|
|
self._initialize_journals_open_session()
|
|
# Make a sale with 35 in cash journal and 65 in check
|
|
order = self._sale(self.cash_journal, 35, self.check_journal, 65)
|
|
|
|
order_qty = len(self.PosOrder.search([]))
|
|
|
|
self._change_payment(
|
|
order, self.cash_journal, 50, self.check_journal, 50)
|
|
|
|
# Check Order quantity
|
|
self.assertEqual(
|
|
order_qty + 2,
|
|
len(self.PosOrder.search([])),
|
|
"In 'Refund' mode, changing payment should generate"
|
|
" two new PoS Orders",
|
|
)
|