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.
 
 
 
 

144 lines
5.2 KiB

# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# @author Quentin DUPONT (quentin.dupont@grap.coop)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import _, api, fields, models
from odoo.exceptions import Warning as UserError
import odoo.addons.decimal_precision as dp
class AccountBankStatement(models.Model):
_inherit = "account.bank.statement"
# Columns Section
control_balance = fields.Float(
string="Controled Balance",
compute="_compute_control_balance",
digits_compute=dp.get_precision("Account"),
)
control_difference = fields.Float(
string="Control Difference",
compute="_compute_control_difference",
digits_compute=dp.get_precision("Account"),
)
is_pos_control = fields.Boolean(
string="Pos control Bank statement",
compute="_compute_is_pos_control", store=True,
)
pos_session_state = fields.Char(
string="Pos session state", compute="_compute_pos_session_state"
)
display_autosolve = fields.Boolean(
string="Display autosolve", compute="_compute_display_autosolve"
)
# Compute Section
@api.multi
@api.depends("line_ids")
def _compute_control_balance(self):
for statement in self:
statement.control_balance = sum(
statement.mapped("balance_end_real")
)
@api.multi
@api.depends("control_balance", "total_entry_encoding", "balance_end_real")
def _compute_control_difference(self):
for statement in self:
statement.control_difference = (
+ statement.balance_end_real
- statement.balance_start
- statement.total_entry_encoding
)
@api.multi
@api.depends("journal_id.pos_control", "pos_session_state",
"balance_start")
def _compute_is_pos_control(self):
for statement in self:
journal = statement.journal_id
statement.is_pos_control = journal.pos_control
@api.multi
@api.depends("pos_session_id.state")
def _compute_pos_session_state(self):
for statement in self:
statement.pos_session_state = statement.pos_session_id.state
# Display button autosolve with some conditions
@api.multi
def _compute_display_autosolve(self):
for statement in self:
if not statement.journal_id.pos_control:
statement.display_autosolve = False
else:
if statement.pos_session_id.config_id.autosolve_limit:
difference_with_limit = (
abs(statement.control_difference)
- statement.pos_session_id.config_id.autosolve_limit
)
else:
difference_with_limit = -1
statement.display_autosolve = (
statement.pos_session_state not in
["closed"]
and difference_with_limit < 0
and abs(round(statement.control_difference, 3)) != 0
)
@api.multi
@api.depends("pos_session_state")
def automatic_solve(self):
self.WizardReason = self.env['wizard.pos.move.reason']
for statement in self:
pos_move_reason = statement.\
pos_session_id.config_id.autosolve_pos_move_reason
if pos_move_reason:
cb_pos_move_reason_id = pos_move_reason.id
cb_difference = statement.control_difference
cb_journal_id = statement.journal_id.id
if cb_difference < 0:
default_move_type = "expense"
else:
default_move_type = "income"
wizard = self.WizardReason.with_context(
active_id=statement.pos_session_id.id,
default_move_type=default_move_type).create({
'move_reason_id': cb_pos_move_reason_id,
'journal_id': cb_journal_id,
'statement_id': statement.id,
'amount': abs(cb_difference),
'name': 'Automatic solve',
})
wizard.apply()
else:
raise UserError(
_(
"We can't autosolve this difference. \nYou need to "
"configure the Point Of Sale config and choose a "
"pos move reason for autosolving this difference."
)
)
def open_cashbox_starting_balance(self):
return self.open_cashbox_balance('starting')
def open_cashbox_ending_balance(self):
return self.open_cashbox_balance('ending')
def open_cashbox_balance(self, balance_moment):
action = self.env.ref(
"pos_multiple_control."
"action_wizard_pos_update_bank_statement_balance").read()[0]
action['context'] = {'balance_moment': balance_moment,
'active_id': [self.id],
'active_pos_id': [self.pos_session_id.id],
'active_model': 'pos.session'}
return action