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.
 
 
 
 

153 lines
5.1 KiB

# Copyright 2020 ForgeFlow, S.L.
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class WizardPOSBankStatementUpdateBalance(models.TransientModel):
_name = "wizard.pos.update.bank.statement.balance"
_description = 'POS Update Bank Statement Balance'
def _default_session_id(self):
return self.env.context.get('active_pos_id', False)
_BALANCE_MOMENT_SELECTION = [
('bydefault', 'Default'),
('starting', 'Starting balance'),
('ending', 'Ending balance'),
]
item_ids = fields.One2many(
comodel_name="wizard.pos.update.bank.statement.balance.line",
inverse_name="wiz_id",
string="Items",
)
balance_moment = fields.Selection(
selection=_BALANCE_MOMENT_SELECTION, string='Balance moment',
default='bydefault')
journal_id = fields.Many2one(
comodel_name='account.journal', string="Journal",
domain="[('id', 'in', journal_ids)]", required=True)
session_id = fields.Many2one(
comodel_name='pos.session', string="Current Session",
default=_default_session_id, required=True, readonly=True)
@api.model
def _prepare_item(self, statement):
return {
"statement_id": statement.id,
"name": statement.name,
"journal_id": statement.journal_id.id,
"balance_start": statement.balance_start,
"balance_end": statement.balance_end,
"total_entry_encoding": statement.total_entry_encoding,
"currency_id": statement.currency_id.id,
}
@api.model
def default_get(self, flds):
res = super().default_get(flds)
# Load objects
session_obj = self.env["pos.session"]
bank_statement_obj = self.env["account.bank.statement"]
# Load context
active_ids = self.env.context["active_id"] or []
active_pos_id = self.env.context["active_pos_id"] or []
active_model = self.env.context["active_model"] or []
balance_moment = self.env.context["balance_moment"] or []
# Check propagation
if not active_pos_id:
return res
assert active_model == "pos.session", \
"Bad context propagation"
if len(active_pos_id) > 1:
raise UserError(_('You cannot start the closing '
'balance for multiple POS sessions'))
# Add bank statement lines
session = session_obj.browse(active_pos_id[0])
bank_statement = bank_statement_obj.browse(active_ids[0])
items = []
items.append([0, 0, self._prepare_item(bank_statement)])
# Give values for wizard
res["session_id"] = session.id
res["item_ids"] = items
res["balance_moment"] = balance_moment
res["journal_id"] = bank_statement.journal_id.id
return res
@api.model
def _prepare_cash_box_journal(self, item):
return {
'amount': abs(item.difference),
'name': _('Out'),
"journal_id": item.journal_id.id,
}
@api.multi
def action_confirm(self):
self.ensure_one()
# record new values from wizard
for item in self.item_ids:
if item.balance_moment == 'starting':
item.statement_id.balance_start = item.balance_start_real
elif item.balance_moment == 'ending':
item.statement_id.balance_end_real = item.balance_end_real
# item.statement_id.balance_end = item.balance_end_real
return True
class WizardPOSBankStatementUpdateBalanceLine(models.TransientModel):
_name = "wizard.pos.update.bank.statement.balance.line"
_description = 'POS Update Bank Statement Balance Line'
wiz_id = fields.Many2one(
comodel_name='wizard.pos.update.bank.statement.balance',
required=True,
)
statement_id = fields.Many2one(
comodel_name='account.bank.statement',
)
name = fields.Char(
related='statement_id.name'
)
journal_id = fields.Many2one(
comodel_name='account.journal',
related='statement_id.journal_id',
)
balance_start = fields.Monetary(
string="Starting Balance",
default=0.0,
compute='_compute_balance_start'
)
balance_start_real = fields.Monetary(
default=0.0
)
total_entry_encoding = fields.Monetary(
related='statement_id.total_entry_encoding',
)
balance_end = fields.Monetary(
string="Computed Balance",
default=0.0,
compute='_compute_balance_end'
)
balance_end_real = fields.Monetary(
default=0.0
)
currency_id = fields.Many2one(
comodel_name='res.currency',
related='statement_id.currency_id'
)
balance_moment = fields.Selection(
related='wiz_id.balance_moment',
default='bydefault')
def _compute_balance_start(self):
for rec in self:
rec.balance_start = rec.statement_id.balance_start
def _compute_balance_end(self):
for rec in self:
rec.balance_end = rec.statement_id.balance_end