From 5f2a55b51adab26600c36ddae7ffedeb9eab8c68 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 25 Jan 2018 12:47:38 +0100 Subject: [PATCH 01/23] [ADD] pos_safe_box --- pos_safe_box/README.rst | 7 + pos_safe_box/__init__.py | 5 + pos_safe_box/__manifest__.py | 27 ++ pos_safe_box/data/ir_sequence_data.xml | 22 ++ pos_safe_box/models/__init__.py | 9 + pos_safe_box/models/pos_config.py | 14 + pos_safe_box/models/pos_session.py | 24 ++ pos_safe_box/models/pos_session_validation.py | 246 ++++++++++++++++++ pos_safe_box/models/safe_box_coin.py | 12 + pos_safe_box/models/safe_box_group.py | 57 ++++ pos_safe_box/security/ir.model.access.csv | 5 + pos_safe_box/static/description/icon.png | Bin 0 -> 3680 bytes pos_safe_box/tests/__init__.py | 5 + pos_safe_box/tests/test_pos_safe_box.py | 99 +++++++ pos_safe_box/views/pos_config_views.xml | 23 ++ .../views/pos_session_validation_views.xml | 100 +++++++ pos_safe_box/views/pos_session_views.xml | 14 + pos_safe_box/views/safe_box_coin_views.xml | 26 ++ pos_safe_box/views/safe_box_group_views.xml | 16 ++ 19 files changed, 711 insertions(+) create mode 100644 pos_safe_box/README.rst create mode 100644 pos_safe_box/__init__.py create mode 100644 pos_safe_box/__manifest__.py create mode 100644 pos_safe_box/data/ir_sequence_data.xml create mode 100644 pos_safe_box/models/__init__.py create mode 100644 pos_safe_box/models/pos_config.py create mode 100644 pos_safe_box/models/pos_session.py create mode 100644 pos_safe_box/models/pos_session_validation.py create mode 100644 pos_safe_box/models/safe_box_coin.py create mode 100644 pos_safe_box/models/safe_box_group.py create mode 100644 pos_safe_box/security/ir.model.access.csv create mode 100644 pos_safe_box/static/description/icon.png create mode 100644 pos_safe_box/tests/__init__.py create mode 100644 pos_safe_box/tests/test_pos_safe_box.py create mode 100644 pos_safe_box/views/pos_config_views.xml create mode 100644 pos_safe_box/views/pos_session_validation_views.xml create mode 100644 pos_safe_box/views/pos_session_views.xml create mode 100644 pos_safe_box/views/safe_box_coin_views.xml create mode 100644 pos_safe_box/views/safe_box_group_views.xml diff --git a/pos_safe_box/README.rst b/pos_safe_box/README.rst new file mode 100644 index 000000000..f8194777b --- /dev/null +++ b/pos_safe_box/README.rst @@ -0,0 +1,7 @@ +.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +============ +POS safe box +============ diff --git a/pos_safe_box/__init__.py b/pos_safe_box/__init__.py new file mode 100644 index 000000000..56b694d7b --- /dev/null +++ b/pos_safe_box/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import models diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py new file mode 100644 index 000000000..9f3743637 --- /dev/null +++ b/pos_safe_box/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +{ + 'name': 'Safe Box with PoS', + 'version': '11.0.1.0.0', + 'author': 'Eficent, Creu Blanca, Odoo Community Association (OCA)', + 'depends': [ + 'point_of_sale', + 'safe_box', + 'pos_close_approval', + ], + 'data': [ + 'security/ir.model.access.csv', + 'data/ir_sequence_data.xml', + 'views/pos_session_validation_views.xml', + 'views/pos_session_views.xml', + 'views/pos_config_views.xml', + 'views/safe_box_group_views.xml', + 'views/safe_box_coin_views.xml', + ], + 'website': 'https://github.com/eficent/cb-addons', + 'license': 'LGPL-3', + 'installable': True, + 'auto_install': False, +} diff --git a/pos_safe_box/data/ir_sequence_data.xml b/pos_safe_box/data/ir_sequence_data.xml new file mode 100644 index 000000000..dc54fc84d --- /dev/null +++ b/pos_safe_box/data/ir_sequence_data.xml @@ -0,0 +1,22 @@ + + + + + + + + Point of Sale session validation + pos.session.validation + SES/%(range_year)s/ + + + + + 4 + + + diff --git a/pos_safe_box/models/__init__.py b/pos_safe_box/models/__init__.py new file mode 100644 index 000000000..363c68aae --- /dev/null +++ b/pos_safe_box/models/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import pos_session +from . import pos_config +from . import pos_session_validation +from . import safe_box_group +from . import safe_box_coin diff --git a/pos_safe_box/models/pos_config.py b/pos_safe_box/models/pos_config.py new file mode 100644 index 000000000..9324a0ab8 --- /dev/null +++ b/pos_safe_box/models/pos_config.py @@ -0,0 +1,14 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields, models + + +class PosConfig(models.Model): + _inherit = 'pos.config' + + safe_box_group_id = fields.Many2one( + 'safe.box.group', + string='Safe box system' + ) diff --git a/pos_safe_box/models/pos_session.py b/pos_safe_box/models/pos_session.py new file mode 100644 index 000000000..99c5cbcd7 --- /dev/null +++ b/pos_safe_box/models/pos_session.py @@ -0,0 +1,24 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models + + +class PosSession(models.Model): + _inherit = 'pos.session' + + pos_session_validation_id = fields.Many2one( + 'pos.session.validation', + readonly=True, + ) + + @api.multi + def action_pos_session_close(self): + res = super(PosSession, self).action_pos_session_close() + for session in self: + sbg = session.config_id.safe_box_group_id + if sbg: + self.pos_session_validation_id = sbg.\ + get_current_session_validation() + return res diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py new file mode 100644 index 000000000..10c673c5f --- /dev/null +++ b/pos_safe_box/models/pos_session_validation.py @@ -0,0 +1,246 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class PosSessionValidation(models.Model): + _name = 'pos.session.validation' + _description = 'Session validation' + + name = fields.Char( + default='/', + required=True, + readonly=True + ) + date = fields.Date( + default=lambda self: fields.Date.today(), + readonly=True, + ) + safe_box_group_id = fields.Many2one( + 'safe.box.group', + string='Safe box system', + required=True, + readonly=True, + ) + pos_session_ids = fields.One2many( + 'pos.session', + inverse_name='pos_session_validation_id', + string='Sessions', + readonly=True, + ) + line_ids = fields.One2many( + comodel_name='pos.session.validation.line', + inverse_name='pos_session_validation_id' + ) + state = fields.Selection([ + ('draft', 'Draft'), + ('closed', 'Closed'), + ('approved', 'Approved'), + ]) + statement_ids = fields.One2many( + comodel_name='account.bank.statement', + related='pos_session_ids.statement_ids', + readonly=True, + ) + statement_line_ids = fields.One2many( + comodel_name='account.bank.statement.line', + related='pos_session_ids.statement_ids.line_ids', + readonly=True, + ) + issue_statement_line_ids = fields.One2many( + comodel_name='account.bank.statement.line', + compute='_compute_statement_values' + ) + currency_id = fields.Many2one( + 'res.currency', + related='safe_box_group_id.currency_id' + ) + amount = fields.Monetary( + currency_field='currency_id', + compute='_compute_statement_values' + ) + coin_amount = fields.Monetary( + currency_field='currency_id', + compute='_compute_amount' + ) + cash_amount = fields.Monetary( + currency_field='currency_id', + compute='_compute_statement_values' + ) + closing_move_id = fields.Many2one( + 'safe.box.move', + 'Closing move', + readonly=True, + ) + closing_date = fields.Datetime(readonly=True,) + approve_move_id = fields.Many2one( + 'safe.box.move', + 'Approve move', + readonly=True, + ) + approve_date = fields.Datetime(readonly=True,) + + @api.depends('line_ids') + def _compute_amount(self): + for record in self: + record.coin_amount = sum(record.line_ids.mapped('amount')) + + @api.depends('statement_ids', 'pos_session_ids') + def _compute_statement_values(self): + for record in self: + statements = record.statement_ids + record.amount = sum(statements.mapped('total_entry_encoding')) + record.cash_amount = sum(statements.filtered( + lambda r: r.journal_id.type == 'cash' + ).mapped('total_entry_encoding')) + lines = record.statement_line_ids + record.issue_statement_line_ids = lines.filtered( + lambda r: not r.invoice_id + ) + + def safe_box_move_vals(self): + return { + 'safe_box_group_id': self.safe_box_group_id.id, + } + + def safe_box_move_line_vals(self, move, safe_box, value): + return { + 'safe_box_move_id': move.id, + 'safe_box_id': safe_box, + 'amount': value, + } + + def account_move_vals(self, statement): + account = self.safe_box_group_id.account_ids.filtered( + lambda r: r.company_id.id == statement.journal_id.company_id.id + ) + if not account: + raise ValidationError(_( + 'Account cannot be found for this company')) + amount = statement.total_entry_encoding + if amount > 0: + statement_account = statement.journal_id.default_credit_account_id + else: + statement_account = statement.journal_id.default_debit_account_id + return { + 'journal_id': statement.journal_id.id, + 'safe_box_move_id': self.closing_move_id.id, + 'line_ids': [ + (0, 0, { + 'account_id': statement_account.id, + 'credit': amount if amount > 0 else 0, + 'debit': -amount if amount < 0 else 0, + }), + (0, 0, { + 'account_id': account.id, + 'credit': -amount if amount < 0 else 0, + 'debit': amount if amount > 0 else 0, + }) + ] + } + + @api.multi + def close(self): + self.ensure_one() + if self.coin_amount != self.cash_amount: + raise ValidationError(_('Coins and Notes must match cash value')) + self.closing_move_id = self.env['safe.box.move'].create( + self.safe_box_move_vals()) + lines = {} + for line in self.line_ids: + if not lines.get(line.safe_box_coin_id.type): + lines[line.safe_box_coin_id.type] = 0 + lines[line.safe_box_coin_id.type] += line.amount + for key in lines.keys(): + safe_box = False + if key == 'note': + safe_box = self.safe_box_group_id.note_safe_box_id.id + elif key == 'coin': + safe_box = self.safe_box_group_id.coin_safe_box_id.id + if not safe_box: + raise ValidationError(_('Safe boxes are not configured')) + self.env['safe.box.move.line'].create(self.safe_box_move_line_vals( + self.closing_move_id, safe_box, lines[key])) + for statement in self.statement_ids.filtered( + lambda r: ( + r.journal_id.type == 'cash' and + r.total_entry_encoding != 0 + ) + ): + move = self.env['account.move'].create( + self.account_move_vals(statement)) + move.post() + self.closing_move_id.close() + self.write({'state': 'closed', 'closing_date': fields.Datetime.now()}) + + @api.multi + def approve(self): + self.ensure_one() + sbg = self.safe_box_group_id + lines = [] + for initial_safe_box, end_safe_box in [ + (sbg.coin_safe_box_id, sbg.approve_coin_safe_box_id), + (sbg.note_safe_box_id, sbg.approve_note_safe_box_id), + ]: + if end_safe_box: + value = self.closing_move_id.line_ids.filtered( + lambda r: r.safe_box_id.id == initial_safe_box.id + ).amount + lines.append({ + 'safe_box_id': end_safe_box.id, + 'amount': value, + }) + lines.append({ + 'safe_box_id': initial_safe_box.id, + 'amount': -value, + }) + if len(lines) > 0: + self.approve_move_id = self.env['safe.box.move'].create({ + 'safe_box_group_id': self.safe_box_group_id.id, + 'line_ids': [(0, 0, line) for line in lines] + }) + self.approve_move_id.close() + self.write({ + 'state': 'approved', 'approve_date': fields.Datetime.now()}) + + @api.model + def get_name(self, vals): + return self.env['ir.sequence'].next_by_code( + 'pos.session.validation') or '/' + + @api.model + def create(self, vals): + if vals.get('name', '/') == '/': + vals.update({'name': self.get_name(vals)}) + return super(PosSessionValidation, self).create(vals) + + +class PosSessionValidationLine(models.Model): + _name = 'pos.session.validation.line' + + pos_session_validation_id = fields.Many2one( + 'pos.session.validation', + required=True, + readonly=True + ) + safe_box_coin_id = fields.Many2one( + 'safe.box.coin', + required=True, + string='Coin', + readonly=True, + ) + value = fields.Integer( + required=True, + default=0 + ) + amount = fields.Float( + compute='_compute_amount' + ) + + @api.depends('value', 'safe_box_coin_id') + def _compute_amount(self): + for record in self: + record.amount = record.safe_box_coin_id.rate * record.value diff --git a/pos_safe_box/models/safe_box_coin.py b/pos_safe_box/models/safe_box_coin.py new file mode 100644 index 000000000..6c4cdbe9e --- /dev/null +++ b/pos_safe_box/models/safe_box_coin.py @@ -0,0 +1,12 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields, models + + +class SafeBoxCoin(models.Model): + _inherit = 'safe.box.coin' + + type = fields.Selection([('coin', 'Coin'), ('note', 'Note')], + default='coin', required=True) diff --git a/pos_safe_box/models/safe_box_group.py b/pos_safe_box/models/safe_box_group.py new file mode 100644 index 000000000..98ffc05d2 --- /dev/null +++ b/pos_safe_box/models/safe_box_group.py @@ -0,0 +1,57 @@ +# Copyright 2017 Creu Blanca +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models, _ +from odoo.exceptions import Warning + + +class SafeBoxGroup(models.Model): + _inherit = 'safe.box.group' + + coin_safe_box_id = fields.Many2one( + 'safe.box', + domain="[('id', 'in', safe_box_ids)]", + string='Safe box where coins are stored on closure', + ) + approve_coin_safe_box_id = fields.Many2one( + 'safe.box', + domain="[('id', 'in', safe_box_ids)]", + string='Safe box where coins are stored on approval', + ) + note_safe_box_id = fields.Many2one( + 'safe.box', + domain="[('id', 'in', safe_box_ids)]", + string='Safe box where notes are stored on closure', + ) + approve_note_safe_box_id = fields.Many2one( + 'safe.box', + domain="[('id', 'in', safe_box_ids)]", + string='Safe box where notes are stored on approval', + ) + + def session_validation_vals(self): + return { + 'safe_box_group_id': self.id, + 'state': 'draft', + 'line_ids': [ + (0, 0, { + 'safe_box_coin_id': coin.id + }) for coin in self.coin_ids + ] + } + + @api.multi + def get_current_session_validation(self): + self.ensure_one() + validation = self.env['pos.session.validation'].search([ + ('safe_box_group_id', '=', self.id), + ('state', '=', 'draft') + ]) + if not validation: + return self.env['pos.session.validation'].create( + self.session_validation_vals() + ) + if len(validation.ids) > 1: + raise Warning(_('Only one validation session is allowed')) + return validation diff --git a/pos_safe_box/security/ir.model.access.csv b/pos_safe_box/security/ir.model.access.csv new file mode 100644 index 000000000..496567e4f --- /dev/null +++ b/pos_safe_box/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_pos_session_validation,access_pos_session_validation,model_pos_session_validation,point_of_sale.group_pos_user,1,1,1,0 +access_pos_session_validation_safe_box,access_pos_session_validation_safe_box,model_pos_session_validation,safe_box.group_safe_box_user,1,1,1,0 +access_pos_session_validation_line,access_pos_session_validation_line,model_pos_session_validation_line,point_of_sale.group_pos_user,1,1,1,0 +access_pos_session_validation_line_safe_box,access_pos_session_validation_line_safe_box,model_pos_session_validation_line,safe_box.group_safe_box_user,1,1,1,0 diff --git a/pos_safe_box/static/description/icon.png b/pos_safe_box/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..270165a99d3eab185d3a91690cf94a0f649594c1 GIT binary patch literal 3680 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 + + + pos.config.form.view + pos.config + + + +
+
+ +
+
+
+
+
+
+
+
diff --git a/pos_safe_box/views/pos_session_validation_views.xml b/pos_safe_box/views/pos_session_validation_views.xml new file mode 100644 index 000000000..74258407e --- /dev/null +++ b/pos_safe_box/views/pos_session_validation_views.xml @@ -0,0 +1,100 @@ + + + + + pos.session.validation.line.tree + pos.session.validation.line + + + + + + + + + + + + pos.session.validation.tree + pos.session.validation + + + + + + + + + + + + + + pos.session.validation.form + pos.session.validation + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session Validation + ir.actions.act_window + pos.session.validation + form + tree,form + + + + diff --git a/pos_safe_box/views/pos_session_views.xml b/pos_safe_box/views/pos_session_views.xml new file mode 100644 index 000000000..1edfd5c53 --- /dev/null +++ b/pos_safe_box/views/pos_session_views.xml @@ -0,0 +1,14 @@ + + + + pos.session.form.view + pos.session + + + + + + + + + diff --git a/pos_safe_box/views/safe_box_coin_views.xml b/pos_safe_box/views/safe_box_coin_views.xml new file mode 100644 index 000000000..f45b818c1 --- /dev/null +++ b/pos_safe_box/views/safe_box_coin_views.xml @@ -0,0 +1,26 @@ + + + + + safe.box.coin.form + safe.box.coin + + + + + + + + + + safe.box.coin.tree + safe.box.coin + + + + + + + + + diff --git a/pos_safe_box/views/safe_box_group_views.xml b/pos_safe_box/views/safe_box_group_views.xml new file mode 100644 index 000000000..689562d6e --- /dev/null +++ b/pos_safe_box/views/safe_box_group_views.xml @@ -0,0 +1,16 @@ + + + + safe.box.group.form + safe.box.group + + + + + + + + + + + From 72fba3101e790deb291ac36d92b4128288b54747 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Fri, 13 Jul 2018 12:21:38 +0200 Subject: [PATCH 02/23] [ADD] Spanish translation --- pos_safe_box/i18n/es.po | 319 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 pos_safe_box/i18n/es.po diff --git a/pos_safe_box/i18n/es.po b/pos_safe_box/i18n/es.po new file mode 100644 index 000000000..74ca793a6 --- /dev/null +++ b/pos_safe_box/i18n/es.po @@ -0,0 +1,319 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_safe_box +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-13 09:49+0000\n" +"PO-Revision-Date: 2018-07-13 09:49+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: pos_safe_box +#: code:addons/pos_safe_box/models/pos_session_validation.py:121 +#, python-format +msgid "Account cannot be found for this company" +msgstr "Account cannot be found for this company" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_amount +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_amount +msgid "Amount" +msgstr "Importe" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Approve" +msgstr "Approve" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_approve_date +msgid "Approve Date" +msgstr "Approve Date" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_approve_move_id +msgid "Approve move" +msgstr "Approve move" + +#. module: pos_safe_box +#: selection:pos.session.validation,state:0 +msgid "Approved" +msgstr "Approved" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_ids +msgid "Bank Statement" +msgstr "Extracto bancario" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_cash_amount +msgid "Cash Amount" +msgstr "Cash Amount" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Close" +msgstr "Cerrar" + +#. module: pos_safe_box +#: selection:pos.session.validation,state:0 +msgid "Closed" +msgstr "Closed" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_closing_date +msgid "Closing Date" +msgstr "Fecha de cierre" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_closing_move_id +msgid "Closing move" +msgstr "Closing move" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_safe_box_coin_id +#: selection:safe.box.coin,type:0 +msgid "Coin" +msgstr "Coin" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_coin_amount +msgid "Coin Amount" +msgstr "Coin Amount" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Coins" +msgstr "Coins" + +#. module: pos_safe_box +#: code:addons/pos_safe_box/models/pos_session_validation.py:149 +#, python-format +msgid "Coins and Notes must match cash value" +msgstr "Coins and Notes must match cash value" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_create_uid +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_create_date +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_create_date +msgid "Created on" +msgstr "Creado en" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_currency_id +msgid "Currency" +msgstr "Moneda" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_date +msgid "Date" +msgstr "Fecha" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_display_name +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: pos_safe_box +#: selection:pos.session.validation,state:0 +msgid "Draft" +msgstr "Draft" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_id +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_id +msgid "ID" +msgstr "ID (identificación)" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_issue_statement_line_ids +msgid "Issue Statement Line" +msgstr "Issue Statement Line" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Issues" +msgstr "Issues" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation___last_update +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line___last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_uid +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_date +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_ids +msgid "Line" +msgstr "Linea" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_line_tree +msgid "Lines" +msgstr "Lines" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_name +msgid "Name" +msgstr "Nombre" + +#. module: pos_safe_box +#: selection:safe.box.coin,type:0 +msgid "Note" +msgstr "Note" + +#. module: pos_safe_box +#: code:addons/pos_safe_box/models/safe_box_group.py:56 +#, python-format +msgid "Only one validation session is allowed" +msgstr "Only one validation session is allowed" + +#. module: pos_safe_box +#: model:ir.ui.menu,name:pos_safe_box.pos_session_validation_menu +msgid "PoS Session validation" +msgstr "PoS Session validation" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_pos_session_validation_id +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_pos_session_validation_id +msgid "Pos Session Validation" +msgstr "Pos Session Validation" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_config_form +msgid "Safe box" +msgstr "Safe box" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_safe_box_coin +msgid "Safe box coin" +msgstr "Safe box coin" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_safe_box_group +msgid "Safe box group" +msgstr "Safe box group" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_config_safe_box_group_id +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_safe_box_group_id +msgid "Safe box system" +msgstr "Safe box system" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_approve_coin_safe_box_id +msgid "Safe box where coins are stored on approval" +msgstr "Safe box where coins are stored on approval" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_coin_safe_box_id +msgid "Safe box where coins are stored on closure" +msgstr "Safe box where coins are stored on closure" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_approve_note_safe_box_id +msgid "Safe box where notes are stored on approval" +msgstr "Safe box where notes are stored on approval" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_note_safe_box_id +msgid "Safe box where notes are stored on closure" +msgstr "Safe box where notes are stored on closure" + +#. module: pos_safe_box +#: code:addons/pos_safe_box/models/pos_session_validation.py:164 +#, python-format +msgid "Safe boxes are not configured" +msgstr "Safe boxes are not configured" + +#. module: pos_safe_box +#: model:ir.actions.act_window,name:pos_safe_box.pos_session_validation_action +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Session Validation" +msgstr "Session Validation" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_pos_session_validation +msgid "Session validation" +msgstr "Session validation" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_tree +msgid "Session validations" +msgstr "Session validations" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_pos_session_ids +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Sessions" +msgstr "Sesiones" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_state +msgid "State" +msgstr "Estado" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_line_ids +msgid "Statement lines" +msgstr "Líneas de extracto" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form +msgid "Statements" +msgstr "Extractos" + +#. module: pos_safe_box +#: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_line_tree +msgid "Total amount" +msgstr "Total amount" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_coin_type +msgid "Type" +msgstr "Tipo" + +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_value +msgid "Value" +msgstr "Valor" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_pos_config +msgid "pos.config" +msgstr "pos.config" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_pos_session +msgid "pos.session" +msgstr "pos.session" + +#. module: pos_safe_box +#: model:ir.model,name:pos_safe_box.model_pos_session_validation_line +msgid "pos.session.validation.line" +msgstr "pos.session.validation.line" + From b0afdd1814f47d997db2da932b720f04d91f7833 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Fri, 19 Oct 2018 09:10:25 +0200 Subject: [PATCH 03/23] [FIX] context call --- pos_safe_box/models/pos_session_validation.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 10c673c5f..87c383f78 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -42,12 +42,12 @@ class PosSessionValidation(models.Model): ]) statement_ids = fields.One2many( comodel_name='account.bank.statement', - related='pos_session_ids.statement_ids', + compute='_compute_statement_ids', readonly=True, ) statement_line_ids = fields.One2many( comodel_name='account.bank.statement.line', - related='pos_session_ids.statement_ids.line_ids', + compute='_compute_statement_ids', readonly=True, ) issue_statement_line_ids = fields.One2many( @@ -83,6 +83,13 @@ class PosSessionValidation(models.Model): ) approve_date = fields.Datetime(readonly=True,) + @api.depends('pos_session_ids') + def _compute_statement_ids(self): + for record in self: + record.statement_ids = record.pos_session_ids.mapped( + 'statement_ids') + record.statement_line_ids = record.statement_ids.mapped('line_ids') + @api.depends('line_ids') def _compute_amount(self): for record in self: From 8a35cebf04fc2998753261e723acb362a6d2daa5 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 7 Nov 2018 13:44:17 +0100 Subject: [PATCH 04/23] [IMP] Agreement views --- pos_safe_box/i18n/es.po | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pos_safe_box/i18n/es.po b/pos_safe_box/i18n/es.po index 74ca793a6..8d1e9081d 100644 --- a/pos_safe_box/i18n/es.po +++ b/pos_safe_box/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-13 09:49+0000\n" -"PO-Revision-Date: 2018-07-13 09:49+0000\n" +"POT-Creation-Date: 2018-11-07 10:19+0000\n" +"PO-Revision-Date: 2018-11-07 10:19+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" "Plural-Forms: \n" #. module: pos_safe_box -#: code:addons/pos_safe_box/models/pos_session_validation.py:121 +#: code:addons/pos_safe_box/models/pos_session_validation.py:128 #, python-format msgid "Account cannot be found for this company" msgstr "Account cannot be found for this company" @@ -47,11 +47,6 @@ msgstr "Approve move" msgid "Approved" msgstr "Approved" -#. module: pos_safe_box -#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_ids -msgid "Bank Statement" -msgstr "Extracto bancario" - #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_cash_amount msgid "Cash Amount" @@ -94,7 +89,7 @@ msgid "Coins" msgstr "Coins" #. module: pos_safe_box -#: code:addons/pos_safe_box/models/pos_session_validation.py:149 +#: code:addons/pos_safe_box/models/pos_session_validation.py:156 #, python-format msgid "Coins and Notes must match cash value" msgstr "Coins and Notes must match cash value" @@ -152,13 +147,13 @@ msgstr "Issues" #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation___last_update #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line___last_update msgid "Last Modified on" -msgstr "Última modificación en" +msgstr "Última modificación el" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_uid #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_uid msgid "Last Updated by" -msgstr "Última actualización de" +msgstr "Última actualización por" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_date @@ -245,7 +240,7 @@ msgid "Safe box where notes are stored on closure" msgstr "Safe box where notes are stored on closure" #. module: pos_safe_box -#: code:addons/pos_safe_box/models/pos_session_validation.py:164 +#: code:addons/pos_safe_box/models/pos_session_validation.py:171 #, python-format msgid "Safe boxes are not configured" msgstr "Safe boxes are not configured" @@ -277,10 +272,15 @@ msgstr "Sesiones" msgid "State" msgstr "Estado" +#. module: pos_safe_box +#: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_ids +msgid "Statement" +msgstr "Extracto" + #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_line_ids -msgid "Statement lines" -msgstr "Líneas de extracto" +msgid "Statement Line" +msgstr "Statement Line" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form @@ -290,7 +290,7 @@ msgstr "Extractos" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_line_tree msgid "Total amount" -msgstr "Total amount" +msgstr "Importe total" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_coin_type From 32951b28f9bd856a5ae5a91c1c473676a1954356 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Mon, 12 Nov 2018 15:13:18 +0100 Subject: [PATCH 05/23] [ADD] translation --- pos_safe_box/i18n/es.po | 81 +++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/pos_safe_box/i18n/es.po b/pos_safe_box/i18n/es.po index 8d1e9081d..8d829a06d 100644 --- a/pos_safe_box/i18n/es.po +++ b/pos_safe_box/i18n/es.po @@ -1,25 +1,27 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_safe_box +# * pos_safe_box # msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-07 10:19+0000\n" -"PO-Revision-Date: 2018-11-07 10:19+0000\n" +"POT-Creation-Date: 2018-11-07 10:28+0000\n" +"PO-Revision-Date: 2018-11-09 12:28+0100\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: \n" +"Language: es\n" +"X-Generator: Poedit 2.2\n" #. module: pos_safe_box #: code:addons/pos_safe_box/models/pos_session_validation.py:128 #, python-format msgid "Account cannot be found for this company" -msgstr "Account cannot be found for this company" +msgstr "No se puede encontrar una cuenta para esta empresa" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_amount @@ -30,27 +32,27 @@ msgstr "Importe" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form msgid "Approve" -msgstr "Approve" +msgstr "Aprobar" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_approve_date msgid "Approve Date" -msgstr "Approve Date" +msgstr "Fecha de aprobación" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_approve_move_id msgid "Approve move" -msgstr "Approve move" +msgstr "Aprobar mudanza" #. module: pos_safe_box #: selection:pos.session.validation,state:0 msgid "Approved" -msgstr "Approved" +msgstr "Aprobado" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_cash_amount msgid "Cash Amount" -msgstr "Cash Amount" +msgstr "Importe en efectivo" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form @@ -60,7 +62,7 @@ msgstr "Cerrar" #. module: pos_safe_box #: selection:pos.session.validation,state:0 msgid "Closed" -msgstr "Closed" +msgstr "Cerrado" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_closing_date @@ -70,29 +72,29 @@ msgstr "Fecha de cierre" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_closing_move_id msgid "Closing move" -msgstr "Closing move" +msgstr "Movimiento de cierre" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_safe_box_coin_id #: selection:safe.box.coin,type:0 msgid "Coin" -msgstr "Coin" +msgstr "Moneda" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_coin_amount msgid "Coin Amount" -msgstr "Coin Amount" +msgstr "Importe de monedas" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form msgid "Coins" -msgstr "Coins" +msgstr "Monedas" #. module: pos_safe_box #: code:addons/pos_safe_box/models/pos_session_validation.py:156 #, python-format msgid "Coins and Notes must match cash value" -msgstr "Coins and Notes must match cash value" +msgstr "Las monedas y los billetes deben coincidir con el valor en efectivo" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_create_uid @@ -125,35 +127,35 @@ msgstr "Nombre mostrado" #. module: pos_safe_box #: selection:pos.session.validation,state:0 msgid "Draft" -msgstr "Draft" +msgstr "Borrador" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_id #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_id msgid "ID" -msgstr "ID (identificación)" +msgstr "ID" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_issue_statement_line_ids msgid "Issue Statement Line" -msgstr "Issue Statement Line" +msgstr "Línea de estado de emisión" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form msgid "Issues" -msgstr "Issues" +msgstr "Cuestiones" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation___last_update #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line___last_update msgid "Last Modified on" -msgstr "Última modificación el" +msgstr "Última modificación en" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_uid #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_uid msgid "Last Updated by" -msgstr "Última actualización por" +msgstr "Última actualización de" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_date @@ -179,87 +181,87 @@ msgstr "Nombre" #. module: pos_safe_box #: selection:safe.box.coin,type:0 msgid "Note" -msgstr "Note" +msgstr "Nota" #. module: pos_safe_box #: code:addons/pos_safe_box/models/safe_box_group.py:56 #, python-format msgid "Only one validation session is allowed" -msgstr "Only one validation session is allowed" +msgstr "Solo se permite una sesión de validación" #. module: pos_safe_box #: model:ir.ui.menu,name:pos_safe_box.pos_session_validation_menu msgid "PoS Session validation" -msgstr "PoS Session validation" +msgstr "Validación de poS Session" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_pos_session_validation_id #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_pos_session_validation_id msgid "Pos Session Validation" -msgstr "Pos Session Validation" +msgstr "Validación Session Validation" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_config_form msgid "Safe box" -msgstr "Safe box" +msgstr "Caja fuerte" #. module: pos_safe_box #: model:ir.model,name:pos_safe_box.model_safe_box_coin msgid "Safe box coin" -msgstr "Safe box coin" +msgstr "Moneda caja fuerte" #. module: pos_safe_box #: model:ir.model,name:pos_safe_box.model_safe_box_group msgid "Safe box group" -msgstr "Safe box group" +msgstr "Grupo de caja de seguridad" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_config_safe_box_group_id #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_safe_box_group_id msgid "Safe box system" -msgstr "Safe box system" +msgstr "Sistema de caja de seguridad" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_approve_coin_safe_box_id msgid "Safe box where coins are stored on approval" -msgstr "Safe box where coins are stored on approval" +msgstr "Caja de seguridad donde las monedas se almacenan" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_coin_safe_box_id msgid "Safe box where coins are stored on closure" -msgstr "Safe box where coins are stored on closure" +msgstr "Caja de seguridad donde se guardan las monedas del cierre" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_approve_note_safe_box_id msgid "Safe box where notes are stored on approval" -msgstr "Safe box where notes are stored on approval" +msgstr "Caja de seguridad donde las notas se almacenan" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_safe_box_group_note_safe_box_id msgid "Safe box where notes are stored on closure" -msgstr "Safe box where notes are stored on closure" +msgstr "Caja de seguridad donde se guardan las notas al cierre" #. module: pos_safe_box #: code:addons/pos_safe_box/models/pos_session_validation.py:171 #, python-format msgid "Safe boxes are not configured" -msgstr "Safe boxes are not configured" +msgstr "Las cajas de seguridad no están configuradas" #. module: pos_safe_box #: model:ir.actions.act_window,name:pos_safe_box.pos_session_validation_action #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form msgid "Session Validation" -msgstr "Session Validation" +msgstr "Validacion de sesion" #. module: pos_safe_box #: model:ir.model,name:pos_safe_box.model_pos_session_validation msgid "Session validation" -msgstr "Session validation" +msgstr "Validacion de sesion" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_tree msgid "Session validations" -msgstr "Session validations" +msgstr "Validaciones de sesion" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_pos_session_ids @@ -280,7 +282,7 @@ msgstr "Extracto" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_statement_line_ids msgid "Statement Line" -msgstr "Statement Line" +msgstr "Línea de declaración" #. module: pos_safe_box #: model:ir.ui.view,arch_db:pos_safe_box.view_pos_session_validation_form @@ -316,4 +318,3 @@ msgstr "pos.session" #: model:ir.model,name:pos_safe_box.model_pos_session_validation_line msgid "pos.session.validation.line" msgstr "pos.session.validation.line" - From 3b840da8260850fa47e1c3fb17abc15f484d57b3 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 14 Nov 2018 09:41:58 +0100 Subject: [PATCH 06/23] [I18N] --- pos_safe_box/i18n/es.po | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pos_safe_box/i18n/es.po b/pos_safe_box/i18n/es.po index 8d829a06d..6aac7eabf 100644 --- a/pos_safe_box/i18n/es.po +++ b/pos_safe_box/i18n/es.po @@ -1,21 +1,19 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_safe_box +# * pos_safe_box # msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-07 10:28+0000\n" -"PO-Revision-Date: 2018-11-09 12:28+0100\n" +"POT-Creation-Date: 2018-11-14 08:31+0000\n" +"PO-Revision-Date: 2018-11-14 08:31+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" +"Content-Transfer-Encoding: \n" "Plural-Forms: \n" -"Language: es\n" -"X-Generator: Poedit 2.2\n" #. module: pos_safe_box #: code:addons/pos_safe_box/models/pos_session_validation.py:128 @@ -149,19 +147,19 @@ msgstr "Cuestiones" #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation___last_update #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line___last_update msgid "Last Modified on" -msgstr "Última modificación en" +msgstr "Última modificación el" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_uid #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_uid msgid "Last Updated by" -msgstr "Última actualización de" +msgstr "Última actualización por" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_write_date #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_write_date msgid "Last Updated on" -msgstr "Última actualización en" +msgstr "Última actualización el" #. module: pos_safe_box #: model:ir.model.fields,field_description:pos_safe_box.field_pos_session_validation_line_ids @@ -318,3 +316,4 @@ msgstr "pos.session" #: model:ir.model,name:pos_safe_box.model_pos_session_validation_line msgid "pos.session.validation.line" msgstr "pos.session.validation.line" + From 99ee716f940b1540bc11943fe1e0dc6f3cc17476 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 13 Feb 2019 09:32:51 +0100 Subject: [PATCH 07/23] [FIX] readonly on related --- pos_safe_box/models/pos_session_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 87c383f78..769643ec4 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -56,7 +56,7 @@ class PosSessionValidation(models.Model): ) currency_id = fields.Many2one( 'res.currency', - related='safe_box_group_id.currency_id' + related='safe_box_group_id.currency_id', readonly=True, ) amount = fields.Monetary( currency_field='currency_id', From bd7dc3d30b625ed84ecef4a61a632329f186fe0a Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 9 May 2019 09:22:27 +0200 Subject: [PATCH 08/23] [FIX] Author --- pos_safe_box/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index 9f3743637..ac3b3e3b8 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Safe Box with PoS', 'version': '11.0.1.0.0', - 'author': 'Eficent, Creu Blanca, Odoo Community Association (OCA)', + 'author': 'Eficent, Creu Blanca', 'depends': [ 'point_of_sale', 'safe_box', From 99ee0d6adfba73b03465102b8033f40e4e4b0a83 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 6 Jun 2019 16:52:41 +0200 Subject: [PATCH 09/23] [FIX] dependencies between modules --- pos_safe_box/__manifest__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index ac3b3e3b8..f39110f18 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -7,7 +7,6 @@ 'version': '11.0.1.0.0', 'author': 'Eficent, Creu Blanca', 'depends': [ - 'point_of_sale', 'safe_box', 'pos_close_approval', ], From 7a2a07e5d5bbb39fad2b4d7af03019f15de9f8ac Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 2 Oct 2019 09:47:20 +0200 Subject: [PATCH 10/23] [ADD] pre-commit hooks --- pos_safe_box/__manifest__.py | 35 ++- pos_safe_box/models/pos_config.py | 5 +- pos_safe_box/models/pos_session.py | 10 +- pos_safe_box/models/pos_session_validation.py | 236 +++++++++--------- pos_safe_box/models/safe_box_coin.py | 7 +- pos_safe_box/models/safe_box_group.py | 41 ++- pos_safe_box/tests/test_pos_safe_box.py | 136 +++++----- 7 files changed, 231 insertions(+), 239 deletions(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index f39110f18..c9860cd27 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -3,24 +3,21 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { - 'name': 'Safe Box with PoS', - 'version': '11.0.1.0.0', - 'author': 'Eficent, Creu Blanca', - 'depends': [ - 'safe_box', - 'pos_close_approval', + "name": "Safe Box with PoS", + "version": "11.0.1.0.0", + "author": "Eficent, Creu Blanca", + "depends": ["safe_box", "pos_close_approval"], + "data": [ + "security/ir.model.access.csv", + "data/ir_sequence_data.xml", + "views/pos_session_validation_views.xml", + "views/pos_session_views.xml", + "views/pos_config_views.xml", + "views/safe_box_group_views.xml", + "views/safe_box_coin_views.xml", ], - 'data': [ - 'security/ir.model.access.csv', - 'data/ir_sequence_data.xml', - 'views/pos_session_validation_views.xml', - 'views/pos_session_views.xml', - 'views/pos_config_views.xml', - 'views/safe_box_group_views.xml', - 'views/safe_box_coin_views.xml', - ], - 'website': 'https://github.com/eficent/cb-addons', - 'license': 'LGPL-3', - 'installable': True, - 'auto_install': False, + "website": "https://github.com/eficent/cb-addons", + "license": "LGPL-3", + "installable": True, + "auto_install": False, } diff --git a/pos_safe_box/models/pos_config.py b/pos_safe_box/models/pos_config.py index 9324a0ab8..13db22d87 100644 --- a/pos_safe_box/models/pos_config.py +++ b/pos_safe_box/models/pos_config.py @@ -6,9 +6,8 @@ class PosConfig(models.Model): - _inherit = 'pos.config' + _inherit = "pos.config" safe_box_group_id = fields.Many2one( - 'safe.box.group', - string='Safe box system' + "safe.box.group", string="Safe box system" ) diff --git a/pos_safe_box/models/pos_session.py b/pos_safe_box/models/pos_session.py index 99c5cbcd7..52bb73099 100644 --- a/pos_safe_box/models/pos_session.py +++ b/pos_safe_box/models/pos_session.py @@ -6,11 +6,10 @@ class PosSession(models.Model): - _inherit = 'pos.session' + _inherit = "pos.session" pos_session_validation_id = fields.Many2one( - 'pos.session.validation', - readonly=True, + "pos.session.validation", readonly=True ) @api.multi @@ -19,6 +18,7 @@ def action_pos_session_close(self): for session in self: sbg = session.config_id.safe_box_group_id if sbg: - self.pos_session_validation_id = sbg.\ - get_current_session_validation() + self.pos_session_validation_id = ( + sbg.get_current_session_validation() + ) return res diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 769643ec4..b88aef4c2 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -7,117 +7,101 @@ class PosSessionValidation(models.Model): - _name = 'pos.session.validation' - _description = 'Session validation' + _name = "pos.session.validation" + _description = "Session validation" - name = fields.Char( - default='/', - required=True, - readonly=True - ) - date = fields.Date( - default=lambda self: fields.Date.today(), - readonly=True, - ) + name = fields.Char(default="/", required=True, readonly=True) + date = fields.Date(default=lambda self: fields.Date.today(), readonly=True) safe_box_group_id = fields.Many2one( - 'safe.box.group', - string='Safe box system', + "safe.box.group", + string="Safe box system", required=True, readonly=True, ) pos_session_ids = fields.One2many( - 'pos.session', - inverse_name='pos_session_validation_id', - string='Sessions', + "pos.session", + inverse_name="pos_session_validation_id", + string="Sessions", readonly=True, ) line_ids = fields.One2many( - comodel_name='pos.session.validation.line', - inverse_name='pos_session_validation_id' + comodel_name="pos.session.validation.line", + inverse_name="pos_session_validation_id", + ) + state = fields.Selection( + [("draft", "Draft"), ("closed", "Closed"), ("approved", "Approved")] ) - state = fields.Selection([ - ('draft', 'Draft'), - ('closed', 'Closed'), - ('approved', 'Approved'), - ]) statement_ids = fields.One2many( - comodel_name='account.bank.statement', - compute='_compute_statement_ids', + comodel_name="account.bank.statement", + compute="_compute_statement_ids", readonly=True, ) statement_line_ids = fields.One2many( - comodel_name='account.bank.statement.line', - compute='_compute_statement_ids', + comodel_name="account.bank.statement.line", + compute="_compute_statement_ids", readonly=True, ) issue_statement_line_ids = fields.One2many( - comodel_name='account.bank.statement.line', - compute='_compute_statement_values' + comodel_name="account.bank.statement.line", + compute="_compute_statement_values", ) currency_id = fields.Many2one( - 'res.currency', - related='safe_box_group_id.currency_id', readonly=True, + "res.currency", related="safe_box_group_id.currency_id", readonly=True ) amount = fields.Monetary( - currency_field='currency_id', - compute='_compute_statement_values' + currency_field="currency_id", compute="_compute_statement_values" ) coin_amount = fields.Monetary( - currency_field='currency_id', - compute='_compute_amount' + currency_field="currency_id", compute="_compute_amount" ) cash_amount = fields.Monetary( - currency_field='currency_id', - compute='_compute_statement_values' + currency_field="currency_id", compute="_compute_statement_values" ) closing_move_id = fields.Many2one( - 'safe.box.move', - 'Closing move', - readonly=True, + "safe.box.move", "Closing move", readonly=True ) - closing_date = fields.Datetime(readonly=True,) + closing_date = fields.Datetime(readonly=True) approve_move_id = fields.Many2one( - 'safe.box.move', - 'Approve move', - readonly=True, + "safe.box.move", "Approve move", readonly=True ) - approve_date = fields.Datetime(readonly=True,) + approve_date = fields.Datetime(readonly=True) - @api.depends('pos_session_ids') + @api.depends("pos_session_ids") def _compute_statement_ids(self): for record in self: record.statement_ids = record.pos_session_ids.mapped( - 'statement_ids') - record.statement_line_ids = record.statement_ids.mapped('line_ids') + "statement_ids" + ) + record.statement_line_ids = record.statement_ids.mapped("line_ids") - @api.depends('line_ids') + @api.depends("line_ids") def _compute_amount(self): for record in self: - record.coin_amount = sum(record.line_ids.mapped('amount')) + record.coin_amount = sum(record.line_ids.mapped("amount")) - @api.depends('statement_ids', 'pos_session_ids') + @api.depends("statement_ids", "pos_session_ids") def _compute_statement_values(self): for record in self: statements = record.statement_ids - record.amount = sum(statements.mapped('total_entry_encoding')) - record.cash_amount = sum(statements.filtered( - lambda r: r.journal_id.type == 'cash' - ).mapped('total_entry_encoding')) + record.amount = sum(statements.mapped("total_entry_encoding")) + record.cash_amount = sum( + statements.filtered( + lambda r: r.journal_id.type == "cash" + ).mapped("total_entry_encoding") + ) lines = record.statement_line_ids record.issue_statement_line_ids = lines.filtered( lambda r: not r.invoice_id ) def safe_box_move_vals(self): - return { - 'safe_box_group_id': self.safe_box_group_id.id, - } + return {"safe_box_group_id": self.safe_box_group_id.id} def safe_box_move_line_vals(self, move, safe_box, value): return { - 'safe_box_move_id': move.id, - 'safe_box_id': safe_box, - 'amount': value, + "safe_box_move_id": move.id, + "safe_box_id": safe_box, + "amount": value, } def account_move_vals(self, statement): @@ -125,37 +109,47 @@ def account_move_vals(self, statement): lambda r: r.company_id.id == statement.journal_id.company_id.id ) if not account: - raise ValidationError(_( - 'Account cannot be found for this company')) + raise ValidationError( + _("Account cannot be found for this company") + ) amount = statement.total_entry_encoding if amount > 0: statement_account = statement.journal_id.default_credit_account_id else: statement_account = statement.journal_id.default_debit_account_id return { - 'journal_id': statement.journal_id.id, - 'safe_box_move_id': self.closing_move_id.id, - 'line_ids': [ - (0, 0, { - 'account_id': statement_account.id, - 'credit': amount if amount > 0 else 0, - 'debit': -amount if amount < 0 else 0, - }), - (0, 0, { - 'account_id': account.id, - 'credit': -amount if amount < 0 else 0, - 'debit': amount if amount > 0 else 0, - }) - ] + "journal_id": statement.journal_id.id, + "safe_box_move_id": self.closing_move_id.id, + "line_ids": [ + ( + 0, + 0, + { + "account_id": statement_account.id, + "credit": amount if amount > 0 else 0, + "debit": -amount if amount < 0 else 0, + }, + ), + ( + 0, + 0, + { + "account_id": account.id, + "credit": -amount if amount < 0 else 0, + "debit": amount if amount > 0 else 0, + }, + ), + ], } @api.multi def close(self): self.ensure_one() if self.coin_amount != self.cash_amount: - raise ValidationError(_('Coins and Notes must match cash value')) - self.closing_move_id = self.env['safe.box.move'].create( - self.safe_box_move_vals()) + raise ValidationError(_("Coins and Notes must match cash value")) + self.closing_move_id = self.env["safe.box.move"].create( + self.safe_box_move_vals() + ) lines = {} for line in self.line_ids: if not lines.get(line.safe_box_coin_id.type): @@ -163,25 +157,28 @@ def close(self): lines[line.safe_box_coin_id.type] += line.amount for key in lines.keys(): safe_box = False - if key == 'note': + if key == "note": safe_box = self.safe_box_group_id.note_safe_box_id.id - elif key == 'coin': + elif key == "coin": safe_box = self.safe_box_group_id.coin_safe_box_id.id if not safe_box: - raise ValidationError(_('Safe boxes are not configured')) - self.env['safe.box.move.line'].create(self.safe_box_move_line_vals( - self.closing_move_id, safe_box, lines[key])) + raise ValidationError(_("Safe boxes are not configured")) + self.env["safe.box.move.line"].create( + self.safe_box_move_line_vals( + self.closing_move_id, safe_box, lines[key] + ) + ) for statement in self.statement_ids.filtered( lambda r: ( - r.journal_id.type == 'cash' and - r.total_entry_encoding != 0 + r.journal_id.type == "cash" and r.total_entry_encoding != 0 ) ): - move = self.env['account.move'].create( - self.account_move_vals(statement)) + move = self.env["account.move"].create( + self.account_move_vals(statement) + ) move.post() self.closing_move_id.close() - self.write({'state': 'closed', 'closing_date': fields.Datetime.now()}) + self.write({"state": "closed", "closing_date": fields.Datetime.now()}) @api.multi def approve(self): @@ -196,58 +193,49 @@ def approve(self): value = self.closing_move_id.line_ids.filtered( lambda r: r.safe_box_id.id == initial_safe_box.id ).amount - lines.append({ - 'safe_box_id': end_safe_box.id, - 'amount': value, - }) - lines.append({ - 'safe_box_id': initial_safe_box.id, - 'amount': -value, - }) + lines.append({"safe_box_id": end_safe_box.id, "amount": value}) + lines.append( + {"safe_box_id": initial_safe_box.id, "amount": -value} + ) if len(lines) > 0: - self.approve_move_id = self.env['safe.box.move'].create({ - 'safe_box_group_id': self.safe_box_group_id.id, - 'line_ids': [(0, 0, line) for line in lines] - }) + self.approve_move_id = self.env["safe.box.move"].create( + { + "safe_box_group_id": self.safe_box_group_id.id, + "line_ids": [(0, 0, line) for line in lines], + } + ) self.approve_move_id.close() - self.write({ - 'state': 'approved', 'approve_date': fields.Datetime.now()}) + self.write( + {"state": "approved", "approve_date": fields.Datetime.now()} + ) @api.model def get_name(self, vals): - return self.env['ir.sequence'].next_by_code( - 'pos.session.validation') or '/' + return ( + self.env["ir.sequence"].next_by_code("pos.session.validation") + or "/" + ) @api.model def create(self, vals): - if vals.get('name', '/') == '/': - vals.update({'name': self.get_name(vals)}) + if vals.get("name", "/") == "/": + vals.update({"name": self.get_name(vals)}) return super(PosSessionValidation, self).create(vals) class PosSessionValidationLine(models.Model): - _name = 'pos.session.validation.line' + _name = "pos.session.validation.line" pos_session_validation_id = fields.Many2one( - 'pos.session.validation', - required=True, - readonly=True + "pos.session.validation", required=True, readonly=True ) safe_box_coin_id = fields.Many2one( - 'safe.box.coin', - required=True, - string='Coin', - readonly=True, - ) - value = fields.Integer( - required=True, - default=0 - ) - amount = fields.Float( - compute='_compute_amount' + "safe.box.coin", required=True, string="Coin", readonly=True ) + value = fields.Integer(required=True, default=0) + amount = fields.Float(compute="_compute_amount") - @api.depends('value', 'safe_box_coin_id') + @api.depends("value", "safe_box_coin_id") def _compute_amount(self): for record in self: record.amount = record.safe_box_coin_id.rate * record.value diff --git a/pos_safe_box/models/safe_box_coin.py b/pos_safe_box/models/safe_box_coin.py index 6c4cdbe9e..b42c8c3ea 100644 --- a/pos_safe_box/models/safe_box_coin.py +++ b/pos_safe_box/models/safe_box_coin.py @@ -6,7 +6,8 @@ class SafeBoxCoin(models.Model): - _inherit = 'safe.box.coin' + _inherit = "safe.box.coin" - type = fields.Selection([('coin', 'Coin'), ('note', 'Note')], - default='coin', required=True) + type = fields.Selection( + [("coin", "Coin"), ("note", "Note")], default="coin", required=True + ) diff --git a/pos_safe_box/models/safe_box_group.py b/pos_safe_box/models/safe_box_group.py index 98ffc05d2..5228712da 100644 --- a/pos_safe_box/models/safe_box_group.py +++ b/pos_safe_box/models/safe_box_group.py @@ -7,51 +7,48 @@ class SafeBoxGroup(models.Model): - _inherit = 'safe.box.group' + _inherit = "safe.box.group" coin_safe_box_id = fields.Many2one( - 'safe.box', + "safe.box", domain="[('id', 'in', safe_box_ids)]", - string='Safe box where coins are stored on closure', + string="Safe box where coins are stored on closure", ) approve_coin_safe_box_id = fields.Many2one( - 'safe.box', + "safe.box", domain="[('id', 'in', safe_box_ids)]", - string='Safe box where coins are stored on approval', + string="Safe box where coins are stored on approval", ) note_safe_box_id = fields.Many2one( - 'safe.box', + "safe.box", domain="[('id', 'in', safe_box_ids)]", - string='Safe box where notes are stored on closure', + string="Safe box where notes are stored on closure", ) approve_note_safe_box_id = fields.Many2one( - 'safe.box', + "safe.box", domain="[('id', 'in', safe_box_ids)]", - string='Safe box where notes are stored on approval', + string="Safe box where notes are stored on approval", ) def session_validation_vals(self): return { - 'safe_box_group_id': self.id, - 'state': 'draft', - 'line_ids': [ - (0, 0, { - 'safe_box_coin_id': coin.id - }) for coin in self.coin_ids - ] + "safe_box_group_id": self.id, + "state": "draft", + "line_ids": [ + (0, 0, {"safe_box_coin_id": coin.id}) for coin in self.coin_ids + ], } @api.multi def get_current_session_validation(self): self.ensure_one() - validation = self.env['pos.session.validation'].search([ - ('safe_box_group_id', '=', self.id), - ('state', '=', 'draft') - ]) + validation = self.env["pos.session.validation"].search( + [("safe_box_group_id", "=", self.id), ("state", "=", "draft")] + ) if not validation: - return self.env['pos.session.validation'].create( + return self.env["pos.session.validation"].create( self.session_validation_vals() ) if len(validation.ids) > 1: - raise Warning(_('Only one validation session is allowed')) + raise Warning(_("Only one validation session is allowed")) return validation diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index a941e7dce..654386f19 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -9,54 +9,63 @@ class TestPosSafeBox(TransactionCase): def setUp(self): super(TestPosSafeBox, self).setUp() - self.safe_box_group = self.env['safe.box.group'].create({ - 'name': 'Group', - 'code': 'SB', - 'currency_id': self.ref('base.USD'), - }) - self.coin_01 = self.env['safe.box.coin'].create({ - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'Coin', - 'type': 'coin', - 'rate': 1, - }) - self.coin_02 = self.env['safe.box.coin'].create({ - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'Note', - 'type': 'note', - 'rate': 1, - }) - self.safe_box_01 = self.env['safe.box'].create({ - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'SB 01', - }) - self.safe_box_02 = self.env['safe.box'].create({ - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'SB 02', - }) - self.safe_box_03 = self.env['safe.box'].create({ - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'SB 03', - }) - self.company = self.browse_ref('base.main_company') - self.account_01 = self.env['account.account'].create({ - 'name': 'Account 01', - 'code': '001', - 'company_id': self.company.id, - 'user_type_id': self.ref('account.data_account_type_liquidity'), - 'safe_box_group_id': self.safe_box_group.id, - }) - self.journal = self.env['account.journal'].search([ - ('type', '=', 'cash'), - ('company_id', '=', self.company.id) - ], limit=1) - self.journal.write({'journal_user': True}) - self.pos_config = self.env['pos.config'].new({ - 'company_id': self.company.id, - 'safe_box_group_id': self.safe_box_group.id, - 'name': 'Safe Box PoS', - 'requires_approval': False, - }) + self.safe_box_group = self.env["safe.box.group"].create( + { + "name": "Group", + "code": "SB", + "currency_id": self.ref("base.USD"), + } + ) + self.coin_01 = self.env["safe.box.coin"].create( + { + "safe_box_group_id": self.safe_box_group.id, + "name": "Coin", + "type": "coin", + "rate": 1, + } + ) + self.coin_02 = self.env["safe.box.coin"].create( + { + "safe_box_group_id": self.safe_box_group.id, + "name": "Note", + "type": "note", + "rate": 1, + } + ) + self.safe_box_01 = self.env["safe.box"].create( + {"safe_box_group_id": self.safe_box_group.id, "name": "SB 01"} + ) + self.safe_box_02 = self.env["safe.box"].create( + {"safe_box_group_id": self.safe_box_group.id, "name": "SB 02"} + ) + self.safe_box_03 = self.env["safe.box"].create( + {"safe_box_group_id": self.safe_box_group.id, "name": "SB 03"} + ) + self.company = self.browse_ref("base.main_company") + self.account_01 = self.env["account.account"].create( + { + "name": "Account 01", + "code": "001", + "company_id": self.company.id, + "user_type_id": self.ref( + "account.data_account_type_liquidity" + ), + "safe_box_group_id": self.safe_box_group.id, + } + ) + self.journal = self.env["account.journal"].search( + [("type", "=", "cash"), ("company_id", "=", self.company.id)], + limit=1, + ) + self.journal.write({"journal_user": True}) + self.pos_config = self.env["pos.config"].new( + { + "company_id": self.company.id, + "safe_box_group_id": self.safe_box_group.id, + "name": "Safe Box PoS", + "requires_approval": False, + } + ) self.pos_config = self.pos_config.create(self.pos_config._cache) self.pos_config.journal_ids = self.journal @@ -64,14 +73,11 @@ def test_pos_safe_box(self): self.pos_config.open_session_cb() session = self.pos_config.current_session_id self.assertTrue(session.statement_ids) - self.env['cash.box.journal.in'].with_context( - active_model='pos.session', - active_ids=session.ids - ).create({ - 'journal_id': self.journal.id, - 'name': 'Testing', - 'amount': 100 - }).run() + self.env["cash.box.journal.in"].with_context( + active_model="pos.session", active_ids=session.ids + ).create( + {"journal_id": self.journal.id, "name": "Testing", "amount": 100} + ).run() session.action_pos_session_closing_control() self.assertTrue(session.pos_session_validation_id) validation = session.pos_session_validation_id @@ -79,16 +85,20 @@ def test_pos_safe_box(self): with self.assertRaises(ValidationError): validation.close() validation.line_ids.filtered( - lambda r: r.safe_box_coin_id == self.coin_01).value = 50 + lambda r: r.safe_box_coin_id == self.coin_01 + ).value = 50 validation.line_ids.filtered( - lambda r: r.safe_box_coin_id == self.coin_02).value = 50 + lambda r: r.safe_box_coin_id == self.coin_02 + ).value = 50 with self.assertRaises(ValidationError): validation.close() - self.safe_box_group.write({ - 'coin_safe_box_id': self.safe_box_01.id, - 'note_safe_box_id': self.safe_box_02.id, - 'approve_note_safe_box_id': self.safe_box_03.id - }) + self.safe_box_group.write( + { + "coin_safe_box_id": self.safe_box_01.id, + "note_safe_box_id": self.safe_box_02.id, + "approve_note_safe_box_id": self.safe_box_03.id, + } + ) validation.close() self.assertEqual(self.safe_box_01.amount, 50) self.assertEqual(self.safe_box_02.amount, 50) From ebbf4316af8fef44ab968908ab0122e2ec3f2432 Mon Sep 17 00:00:00 2001 From: Jaime Arroyo Date: Wed, 19 Feb 2020 14:54:45 +0100 Subject: [PATCH 11/23] [12.0][MIG] pos_safe_box --- pos_safe_box/__manifest__.py | 4 ++-- pos_safe_box/tests/test_pos_safe_box.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index c9860cd27..34dcc6d90 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -4,9 +4,9 @@ { "name": "Safe Box with PoS", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "author": "Eficent, Creu Blanca", - "depends": ["safe_box", "pos_close_approval"], + "depends": ["safe_box", "pos_close_approval", "account_cash_invoice"], "data": [ "security/ir.model.access.csv", "data/ir_sequence_data.xml", diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index 654386f19..1558a8c39 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -81,7 +81,6 @@ def test_pos_safe_box(self): session.action_pos_session_closing_control() self.assertTrue(session.pos_session_validation_id) validation = session.pos_session_validation_id - self.assertTrue(validation.line_ids) with self.assertRaises(ValidationError): validation.close() validation.line_ids.filtered( From 36aec41c30c8fef5bd8311b2ea82c4153fd82c1d Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Mon, 24 Feb 2020 13:31:29 +0100 Subject: [PATCH 12/23] [FIX] pos_safe_box: _description Missing --- pos_safe_box/models/pos_session_validation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index b88aef4c2..b7f8bc97d 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -225,6 +225,7 @@ def create(self, vals): class PosSessionValidationLine(models.Model): _name = "pos.session.validation.line" + _description = "Add amount on validation" pos_session_validation_id = fields.Many2one( "pos.session.validation", required=True, readonly=True From c143be9fe42fb105188a5f30ccaccc606657511e Mon Sep 17 00:00:00 2001 From: Jaime Arroyo Date: Wed, 25 Mar 2020 17:16:23 +0100 Subject: [PATCH 13/23] [12.0][FIX] bootrstrap col-xs --- .../models/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 338 bytes .../models/__pycache__/pos_config.cpython-36.pyc | Bin 0 -> 489 bytes .../__pycache__/pos_session.cpython-36.pyc | Bin 0 -> 868 bytes .../pos_session_validation.cpython-36.pyc | Bin 0 -> 7273 bytes .../__pycache__/safe_box_coin.cpython-36.pyc | Bin 0 -> 518 bytes .../__pycache__/safe_box_group.cpython-36.pyc | Bin 0 -> 1798 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pos_safe_box/models/__pycache__/__init__.cpython-36.pyc create mode 100644 pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc create mode 100644 pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc create mode 100644 pos_safe_box/models/__pycache__/pos_session_validation.cpython-36.pyc create mode 100644 pos_safe_box/models/__pycache__/safe_box_coin.cpython-36.pyc create mode 100644 pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc diff --git a/pos_safe_box/models/__pycache__/__init__.cpython-36.pyc b/pos_safe_box/models/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d57ae4f827aa765f82211a0e00655876896a3a3 GIT binary patch literal 338 zcmYk0y-ve05P-pkyc)H?@eY1m;q2J(31j7vPSkEQrfM*si- literal 0 HcmV?d00001 diff --git a/pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc b/pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b9f809a2ca695772846fe5e36b1ede60cdb640b GIT binary patch literal 489 zcmYjNy-ve05VjpBgsSD|1yCoX3?ve)6+%>ksTESU3|MK-O;eIM*sUO4VdWthc_pt* zyaE$;!rw`E`tC>HeRpSrL2vZBzRfT~@93XVgD;G$V-o-YE>MYMT#}ezbd7+3^NhgZ zWaT_LF$Fq9f%{=*Q9!h}$aw)ud!+zgsMMB!?3eh+R5*$;pqK!T9ZpxSr3LyzVh>zH z=;_@Xp~j+GReG?f%TL%)$YW;wQc_?>CnLT{ZV)1xoZjSJqOMgA~Jua literal 0 HcmV?d00001 diff --git a/pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc b/pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c8e7a29eb8a1c4c5435f6ffb92f98ab7d8cb00c GIT binary patch literal 868 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 GenlTA*n~L% literal 0 HcmV?d00001 diff --git a/pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc b/pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fa03a7315029955b3a64ad0d97502a6592b9d9f GIT binary patch literal 1798 zcma)7&u`pB6rLZp*XwT5P*59Cg^Yw6wzRtlE(k4A)go0wYB)p!$*5SaXLjSQ?Qv(k zO|oh)Y_1%*bK%IpG*?dj7joh~Z|t;9gX+~hzvr1ZKfdpKv)^oN1e3q(-!^-M{7YVY z9PsZ!Gv9#`M9`cRG@=EISivJ+IFUo~JImd|i#$pm62XOYLWCpvytm?!FWh}H^j<+e z89J6HRc5_uCUaq|S12KKV`)63w)ab-%dDKGII?|QaPC1fQ!tW5RFH@X8gc2&UBPfI z;r_uRuZz7V?sajmiTy5y{lNIX=!@WlM1j0AABZbra6(oz+7KJC*G)UvPp0y|I(n$p zqFQbmh(=G;(P-Ahej6`u{`$pECU)+GJ6Q=9zsE2x&V(60Uf#x8LWsk|1F2=0s;o3& z0-mXrmLgPTnC8kXv>Y<)2~{LnX+2YGKwsZ&){ySH$=>%A|( zMLJqZjEpoUQ)LX;XCkT3Tr-;FDot{;3r;)9klPR5Tm_C|T~jBuw0@qIvXKkZ13a{U zc2)z2b&SlX%>mbD3kTe|Wa-avuZS^W4rOfl`TOkm4T7-L8hRseklq!rj?@bJF_|-@ z8X`XB!k@7feF?OgN!Ray=dM5m`=s`O&>qOad+O+)YrpObh*tD>$N+l#d&}!UMT_C+ z97BB#Rz9WQ>kr|r12C^p3CmkQmH9DLiww`lhG#g08R$IE)u9wazE0e3vxk8VWQp|^ zL$c+vd=BL$6P+Hc(e_d;fd+j8GAz$!X*raxMi@210aCn+$2Pgv%zYHOGznkCO8EYdri`Bdkt{Ai?c*k<0i(&lX+@U8$g4yRmQgG|*|R5$hI< zyv{TV@imaJJ~b*=!(R*OLo--bK6Oy1@bfQwbHCr@><#| j@+g%Rmf@N_>psFimL~mOd$Imxjo&V^Y;d-1I^h2SP{!^e literal 0 HcmV?d00001 From 885881d0a683f3c9b5901cc0a7cda9cc355e0e88 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 4 Nov 2020 19:27:39 +0100 Subject: [PATCH 14/23] [IMP] pre-commit --- pos_safe_box/data/ir_sequence_data.xml | 22 ++--- pos_safe_box/models/pos_session_validation.py | 2 +- pos_safe_box/models/safe_box_group.py | 7 +- pos_safe_box/tests/test_pos_safe_box.py | 2 +- pos_safe_box/views/pos_config_views.xml | 10 +- .../views/pos_session_validation_views.xml | 93 ++++++++++--------- pos_safe_box/views/pos_session_views.xml | 5 +- pos_safe_box/views/safe_box_coin_views.xml | 11 +-- pos_safe_box/views/safe_box_group_views.xml | 10 +- 9 files changed, 81 insertions(+), 81 deletions(-) diff --git a/pos_safe_box/data/ir_sequence_data.xml b/pos_safe_box/data/ir_sequence_data.xml index dc54fc84d..a93838593 100644 --- a/pos_safe_box/data/ir_sequence_data.xml +++ b/pos_safe_box/data/ir_sequence_data.xml @@ -1,22 +1,18 @@ - - - - Point of Sale session validation - pos.session.validation - SES/%(range_year)s/ - - - - - 4 - - + Point of Sale session validation + pos.session.validation + SES/%(range_year)s/ + + + + + 4 + diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index b7f8bc97d..87eae33dc 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -2,7 +2,7 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError diff --git a/pos_safe_box/models/safe_box_group.py b/pos_safe_box/models/safe_box_group.py index 5228712da..2b78f6c34 100644 --- a/pos_safe_box/models/safe_box_group.py +++ b/pos_safe_box/models/safe_box_group.py @@ -2,8 +2,7 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import api, fields, models, _ -from odoo.exceptions import Warning +from odoo import _, api, exceptions, fields, models class SafeBoxGroup(models.Model): @@ -50,5 +49,7 @@ def get_current_session_validation(self): self.session_validation_vals() ) if len(validation.ids) > 1: - raise Warning(_("Only one validation session is allowed")) + raise exceptions.Warning( + _("Only one validation session is allowed") + ) return validation diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index 1558a8c39..b97214f9b 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -2,8 +2,8 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo.tests.common import TransactionCase from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase class TestPosSafeBox(TransactionCase): diff --git a/pos_safe_box/views/pos_config_views.xml b/pos_safe_box/views/pos_config_views.xml index 5a869e374..d74413da4 100644 --- a/pos_safe_box/views/pos_config_views.xml +++ b/pos_safe_box/views/pos_config_views.xml @@ -3,18 +3,16 @@ pos.config.form.view pos.config - + -
+
-
diff --git a/pos_safe_box/views/pos_session_validation_views.xml b/pos_safe_box/views/pos_session_validation_views.xml index 74258407e..a6316c30e 100644 --- a/pos_safe_box/views/pos_session_validation_views.xml +++ b/pos_safe_box/views/pos_session_validation_views.xml @@ -1,100 +1,109 @@ - pos.session.validation.line.tree pos.session.validation.line - - - - - + + + + + - pos.session.validation.tree pos.session.validation - - - - - - + + + + + + - pos.session.validation.form pos.session.validation
-
-
+
- + - - + + - - - - + + + + - - + + - + - + - + - + - - + Session Validation ir.actions.act_window pos.session.validation form tree,form - - + diff --git a/pos_safe_box/views/pos_session_views.xml b/pos_safe_box/views/pos_session_views.xml index 1edfd5c53..306bb2e1a 100644 --- a/pos_safe_box/views/pos_session_views.xml +++ b/pos_safe_box/views/pos_session_views.xml @@ -3,12 +3,11 @@ pos.session.form.view pos.session - + - + - diff --git a/pos_safe_box/views/safe_box_coin_views.xml b/pos_safe_box/views/safe_box_coin_views.xml index f45b818c1..60536bfd1 100644 --- a/pos_safe_box/views/safe_box_coin_views.xml +++ b/pos_safe_box/views/safe_box_coin_views.xml @@ -1,26 +1,23 @@ - safe.box.coin.form safe.box.coin - + - + - safe.box.coin.tree safe.box.coin - + - + - diff --git a/pos_safe_box/views/safe_box_group_views.xml b/pos_safe_box/views/safe_box_group_views.xml index 689562d6e..22215f070 100644 --- a/pos_safe_box/views/safe_box_group_views.xml +++ b/pos_safe_box/views/safe_box_group_views.xml @@ -3,13 +3,13 @@ safe.box.group.form safe.box.group - + - - - - + + + + From aa8f1d9e643603d7dc6a0505f224faf9a438a2ff Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 2 Jun 2021 16:19:28 +0200 Subject: [PATCH 15/23] [IMP] githubactions: Copy logic from OCA --- pos_safe_box/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index 34dcc6d90..1ee81799a 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -17,7 +17,7 @@ "views/safe_box_coin_views.xml", ], "website": "https://github.com/eficent/cb-addons", - "license": "LGPL-3", + "license": "AGPL-3", "installable": True, "auto_install": False, } From feefe113a86e1ad1471b182db728c17a3dc46095 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Mon, 5 Jul 2021 16:43:55 +0200 Subject: [PATCH 16/23] [MIG] pos_safe_box: Migration to 13.0 --- pos_safe_box/__manifest__.py | 4 ++-- pos_safe_box/models/pos_session.py | 3 +-- pos_safe_box/models/pos_session_validation.py | 2 -- pos_safe_box/models/safe_box_group.py | 3 +-- pos_safe_box/tests/test_pos_safe_box.py | 8 ++------ pos_safe_box/views/pos_session_validation_views.xml | 1 - 6 files changed, 6 insertions(+), 15 deletions(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index 1ee81799a..2e3e52979 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -4,9 +4,9 @@ { "name": "Safe Box with PoS", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "author": "Eficent, Creu Blanca", - "depends": ["safe_box", "pos_close_approval", "account_cash_invoice"], + "depends": ["safe_box", "pos_close_approval", "pos_session_pay_invoice"], "data": [ "security/ir.model.access.csv", "data/ir_sequence_data.xml", diff --git a/pos_safe_box/models/pos_session.py b/pos_safe_box/models/pos_session.py index 52bb73099..4f56354b2 100644 --- a/pos_safe_box/models/pos_session.py +++ b/pos_safe_box/models/pos_session.py @@ -2,7 +2,7 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import api, fields, models +from odoo import fields, models class PosSession(models.Model): @@ -12,7 +12,6 @@ class PosSession(models.Model): "pos.session.validation", readonly=True ) - @api.multi def action_pos_session_close(self): res = super(PosSession, self).action_pos_session_close() for session in self: diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 87eae33dc..7392bcf5b 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -142,7 +142,6 @@ def account_move_vals(self, statement): ], } - @api.multi def close(self): self.ensure_one() if self.coin_amount != self.cash_amount: @@ -180,7 +179,6 @@ def close(self): self.closing_move_id.close() self.write({"state": "closed", "closing_date": fields.Datetime.now()}) - @api.multi def approve(self): self.ensure_one() sbg = self.safe_box_group_id diff --git a/pos_safe_box/models/safe_box_group.py b/pos_safe_box/models/safe_box_group.py index 2b78f6c34..eb24e9134 100644 --- a/pos_safe_box/models/safe_box_group.py +++ b/pos_safe_box/models/safe_box_group.py @@ -2,7 +2,7 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import _, api, exceptions, fields, models +from odoo import _, exceptions, fields, models class SafeBoxGroup(models.Model): @@ -38,7 +38,6 @@ def session_validation_vals(self): ], } - @api.multi def get_current_session_validation(self): self.ensure_one() validation = self.env["pos.session.validation"].search( diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index b97214f9b..928902e33 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -57,7 +57,6 @@ def setUp(self): [("type", "=", "cash"), ("company_id", "=", self.company.id)], limit=1, ) - self.journal.write({"journal_user": True}) self.pos_config = self.env["pos.config"].new( { "company_id": self.company.id, @@ -67,17 +66,14 @@ def setUp(self): } ) self.pos_config = self.pos_config.create(self.pos_config._cache) - self.pos_config.journal_ids = self.journal def test_pos_safe_box(self): self.pos_config.open_session_cb() session = self.pos_config.current_session_id self.assertTrue(session.statement_ids) - self.env["cash.box.journal.in"].with_context( + self.env["cash.box.out"].with_context( active_model="pos.session", active_ids=session.ids - ).create( - {"journal_id": self.journal.id, "name": "Testing", "amount": 100} - ).run() + ).create({"name": "Testing", "amount": 100}).run() session.action_pos_session_closing_control() self.assertTrue(session.pos_session_validation_id) validation = session.pos_session_validation_id diff --git a/pos_safe_box/views/pos_session_validation_views.xml b/pos_safe_box/views/pos_session_validation_views.xml index a6316c30e..ca9e55db2 100644 --- a/pos_safe_box/views/pos_session_validation_views.xml +++ b/pos_safe_box/views/pos_session_validation_views.xml @@ -96,7 +96,6 @@ Session Validation ir.actions.act_window pos.session.validation - form tree,form Date: Mon, 4 Oct 2021 17:32:00 +0200 Subject: [PATCH 17/23] [FIX] pos_sabe_box: amount --- pos_safe_box/models/pos_session_validation.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 7392bcf5b..f47fbbf84 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -79,11 +79,26 @@ def _compute_amount(self): for record in self: record.coin_amount = sum(record.line_ids.mapped("amount")) + def _compute_statement_amount(self): + lines = self.pos_session_ids.mapped("cash_register_id.line_ids") + lines_not_computed = lines.filtered( + lambda r: r.account_id + not in r.statement_id.pos_session_id.payment_method_ids.mapped( + "receivable_account_id" + ) + ) + payments = self.pos_session_ids.mapped("order_ids.payment_ids") + amount = sum(lines_not_computed.mapped("amount")) + sum( + payments.mapped("amount") + ) + return amount + @api.depends("statement_ids", "pos_session_ids") def _compute_statement_values(self): for record in self: statements = record.statement_ids record.amount = sum(statements.mapped("total_entry_encoding")) + record.amount = record._compute_statement_amount() record.cash_amount = sum( statements.filtered( lambda r: r.journal_id.type == "cash" From b4d3f7c904ca0aff8c5ee41691dce4e5421eedb4 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Mon, 13 Dec 2021 17:25:52 +0100 Subject: [PATCH 18/23] [FIX] pos_safe_box: Block approval and close --- pos_safe_box/models/pos_session_validation.py | 4 ++++ pos_safe_box/tests/test_pos_safe_box.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index f47fbbf84..303571696 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -159,6 +159,8 @@ def account_move_vals(self, statement): def close(self): self.ensure_one() + if self.state != "draft": + raise ValidationError(_("You can only approve draft moves")) if self.coin_amount != self.cash_amount: raise ValidationError(_("Coins and Notes must match cash value")) self.closing_move_id = self.env["safe.box.move"].create( @@ -196,6 +198,8 @@ def close(self): def approve(self): self.ensure_one() + if self.state != "closed": + raise ValidationError(_("You can only approve closed moves")) sbg = self.safe_box_group_id lines = [] for initial_safe_box, end_safe_box in [ diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index 928902e33..e0ffad74b 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -98,7 +98,11 @@ def test_pos_safe_box(self): self.assertEqual(self.safe_box_01.amount, 50) self.assertEqual(self.safe_box_02.amount, 50) self.assertEqual(self.safe_box_03.amount, 0) + with self.assertRaises(ValidationError): + validation.close() validation.approve() self.assertEqual(self.safe_box_01.amount, 50) self.assertEqual(self.safe_box_02.amount, 0) self.assertEqual(self.safe_box_03.amount, 50) + with self.assertRaises(ValidationError): + validation.approve() From a34fa5b05ea903bb58726f1dbb97bca2d5ab842f Mon Sep 17 00:00:00 2001 From: Kevin Luna Date: Tue, 18 Oct 2022 17:31:13 +0200 Subject: [PATCH 19/23] [IMP] pos_session_validation: change order to id desc --- pos_safe_box/models/pos_session_validation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 303571696..71a8bc411 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -9,6 +9,7 @@ class PosSessionValidation(models.Model): _name = "pos.session.validation" _description = "Session validation" + _order = "id desc" name = fields.Char(default="/", required=True, readonly=True) date = fields.Date(default=lambda self: fields.Date.today(), readonly=True) From 3620a7dc00613f90eccac9d79c66590508c1e9b2 Mon Sep 17 00:00:00 2001 From: Kevin Luna Date: Mon, 21 Nov 2022 09:32:35 +0100 Subject: [PATCH 20/23] [IMP] pos_safe_box: black, isort, prettier --- pos_safe_box/__manifest__.py | 2 +- pos_safe_box/models/pos_config.py | 4 +- pos_safe_box/models/pos_session.py | 8 +-- pos_safe_box/models/pos_session_validation.py | 51 +++++-------------- pos_safe_box/models/safe_box_group.py | 4 +- pos_safe_box/tests/test_pos_safe_box.py | 4 +- 6 files changed, 20 insertions(+), 53 deletions(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index 2e3e52979..f4328c65c 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -16,7 +16,7 @@ "views/safe_box_group_views.xml", "views/safe_box_coin_views.xml", ], - "website": "https://github.com/eficent/cb-addons", + "website": "https://github.com/tegin/cb-addons", "license": "AGPL-3", "installable": True, "auto_install": False, diff --git a/pos_safe_box/models/pos_config.py b/pos_safe_box/models/pos_config.py index 13db22d87..d7052ade7 100644 --- a/pos_safe_box/models/pos_config.py +++ b/pos_safe_box/models/pos_config.py @@ -8,6 +8,4 @@ class PosConfig(models.Model): _inherit = "pos.config" - safe_box_group_id = fields.Many2one( - "safe.box.group", string="Safe box system" - ) + safe_box_group_id = fields.Many2one("safe.box.group", string="Safe box system") diff --git a/pos_safe_box/models/pos_session.py b/pos_safe_box/models/pos_session.py index 4f56354b2..2a4d03c00 100644 --- a/pos_safe_box/models/pos_session.py +++ b/pos_safe_box/models/pos_session.py @@ -8,16 +8,12 @@ class PosSession(models.Model): _inherit = "pos.session" - pos_session_validation_id = fields.Many2one( - "pos.session.validation", readonly=True - ) + pos_session_validation_id = fields.Many2one("pos.session.validation", readonly=True) def action_pos_session_close(self): res = super(PosSession, self).action_pos_session_close() for session in self: sbg = session.config_id.safe_box_group_id if sbg: - self.pos_session_validation_id = ( - sbg.get_current_session_validation() - ) + self.pos_session_validation_id = sbg.get_current_session_validation() return res diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 71a8bc411..39c17360d 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -58,21 +58,15 @@ class PosSessionValidation(models.Model): cash_amount = fields.Monetary( currency_field="currency_id", compute="_compute_statement_values" ) - closing_move_id = fields.Many2one( - "safe.box.move", "Closing move", readonly=True - ) + closing_move_id = fields.Many2one("safe.box.move", "Closing move", readonly=True) closing_date = fields.Datetime(readonly=True) - approve_move_id = fields.Many2one( - "safe.box.move", "Approve move", readonly=True - ) + approve_move_id = fields.Many2one("safe.box.move", "Approve move", readonly=True) approve_date = fields.Datetime(readonly=True) @api.depends("pos_session_ids") def _compute_statement_ids(self): for record in self: - record.statement_ids = record.pos_session_ids.mapped( - "statement_ids" - ) + record.statement_ids = record.pos_session_ids.mapped("statement_ids") record.statement_line_ids = record.statement_ids.mapped("line_ids") @api.depends("line_ids") @@ -101,14 +95,12 @@ def _compute_statement_values(self): record.amount = sum(statements.mapped("total_entry_encoding")) record.amount = record._compute_statement_amount() record.cash_amount = sum( - statements.filtered( - lambda r: r.journal_id.type == "cash" - ).mapped("total_entry_encoding") + statements.filtered(lambda r: r.journal_id.type == "cash").mapped( + "total_entry_encoding" + ) ) lines = record.statement_line_ids - record.issue_statement_line_ids = lines.filtered( - lambda r: not r.invoice_id - ) + record.issue_statement_line_ids = lines.filtered(lambda r: not r.invoice_id) def safe_box_move_vals(self): return {"safe_box_group_id": self.safe_box_group_id.id} @@ -125,9 +117,7 @@ def account_move_vals(self, statement): lambda r: r.company_id.id == statement.journal_id.company_id.id ) if not account: - raise ValidationError( - _("Account cannot be found for this company") - ) + raise ValidationError(_("Account cannot be found for this company")) amount = statement.total_entry_encoding if amount > 0: statement_account = statement.journal_id.default_credit_account_id @@ -181,18 +171,12 @@ def close(self): if not safe_box: raise ValidationError(_("Safe boxes are not configured")) self.env["safe.box.move.line"].create( - self.safe_box_move_line_vals( - self.closing_move_id, safe_box, lines[key] - ) + self.safe_box_move_line_vals(self.closing_move_id, safe_box, lines[key]) ) for statement in self.statement_ids.filtered( - lambda r: ( - r.journal_id.type == "cash" and r.total_entry_encoding != 0 - ) + lambda r: (r.journal_id.type == "cash" and r.total_entry_encoding != 0) ): - move = self.env["account.move"].create( - self.account_move_vals(statement) - ) + move = self.env["account.move"].create(self.account_move_vals(statement)) move.post() self.closing_move_id.close() self.write({"state": "closed", "closing_date": fields.Datetime.now()}) @@ -212,9 +196,7 @@ def approve(self): lambda r: r.safe_box_id.id == initial_safe_box.id ).amount lines.append({"safe_box_id": end_safe_box.id, "amount": value}) - lines.append( - {"safe_box_id": initial_safe_box.id, "amount": -value} - ) + lines.append({"safe_box_id": initial_safe_box.id, "amount": -value}) if len(lines) > 0: self.approve_move_id = self.env["safe.box.move"].create( { @@ -223,16 +205,11 @@ def approve(self): } ) self.approve_move_id.close() - self.write( - {"state": "approved", "approve_date": fields.Datetime.now()} - ) + self.write({"state": "approved", "approve_date": fields.Datetime.now()}) @api.model def get_name(self, vals): - return ( - self.env["ir.sequence"].next_by_code("pos.session.validation") - or "/" - ) + return self.env["ir.sequence"].next_by_code("pos.session.validation") or "/" @api.model def create(self, vals): diff --git a/pos_safe_box/models/safe_box_group.py b/pos_safe_box/models/safe_box_group.py index eb24e9134..f6ce5ac4e 100644 --- a/pos_safe_box/models/safe_box_group.py +++ b/pos_safe_box/models/safe_box_group.py @@ -48,7 +48,5 @@ def get_current_session_validation(self): self.session_validation_vals() ) if len(validation.ids) > 1: - raise exceptions.Warning( - _("Only one validation session is allowed") - ) + raise exceptions.Warning(_("Only one validation session is allowed")) return validation diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index e0ffad74b..f630566c5 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -47,9 +47,7 @@ def setUp(self): "name": "Account 01", "code": "001", "company_id": self.company.id, - "user_type_id": self.ref( - "account.data_account_type_liquidity" - ), + "user_type_id": self.ref("account.data_account_type_liquidity"), "safe_box_group_id": self.safe_box_group.id, } ) From c3521ef2fee924b540de0ceeda8d5e287fcb550b Mon Sep 17 00:00:00 2001 From: Kevin Luna Date: Mon, 21 Nov 2022 10:34:35 +0100 Subject: [PATCH 21/23] [MIG] pos_safe_box: migration to 14.0 --- pos_safe_box/__manifest__.py | 4 ++-- pos_safe_box/models/pos_session_validation.py | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index f4328c65c..7118637af 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -4,8 +4,8 @@ { "name": "Safe Box with PoS", - "version": "13.0.1.0.0", - "author": "Eficent, Creu Blanca", + "version": "14.0.1.0.0", + "author": "Eficent, CreuBlanca", "depends": ["safe_box", "pos_close_approval", "pos_session_pay_invoice"], "data": [ "security/ir.model.access.csv", diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 39c17360d..8756a2d5c 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -119,10 +119,7 @@ def account_move_vals(self, statement): if not account: raise ValidationError(_("Account cannot be found for this company")) amount = statement.total_entry_encoding - if amount > 0: - statement_account = statement.journal_id.default_credit_account_id - else: - statement_account = statement.journal_id.default_debit_account_id + statement_account = statement.journal_id.default_account_id return { "journal_id": statement.journal_id.id, "safe_box_move_id": self.closing_move_id.id, @@ -177,7 +174,7 @@ def close(self): lambda r: (r.journal_id.type == "cash" and r.total_entry_encoding != 0) ): move = self.env["account.move"].create(self.account_move_vals(statement)) - move.post() + move.action_post() self.closing_move_id.close() self.write({"state": "closed", "closing_date": fields.Datetime.now()}) From 6eb62874325a50cf63dd3e31a4b3fb18c575e340 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 23 Jan 2025 15:27:56 +0100 Subject: [PATCH 22/23] [IMP] pos_safe_box: Black, isort, prettier --- setup/pos_safe_box/odoo/addons/pos_safe_box | 1 + setup/pos_safe_box/setup.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 120000 setup/pos_safe_box/odoo/addons/pos_safe_box create mode 100644 setup/pos_safe_box/setup.py diff --git a/setup/pos_safe_box/odoo/addons/pos_safe_box b/setup/pos_safe_box/odoo/addons/pos_safe_box new file mode 120000 index 000000000..15a3bac65 --- /dev/null +++ b/setup/pos_safe_box/odoo/addons/pos_safe_box @@ -0,0 +1 @@ +../../../../pos_safe_box \ No newline at end of file diff --git a/setup/pos_safe_box/setup.py b/setup/pos_safe_box/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/pos_safe_box/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 237b2604e2ae98de934285c081d2b07614074728 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 23 Jan 2025 16:37:10 +0100 Subject: [PATCH 23/23] [MIG] pos_safe_box: migration to 16.0 --- pos_safe_box/__manifest__.py | 4 +- pos_safe_box/models/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 338 -> 0 bytes .../__pycache__/pos_config.cpython-36.pyc | Bin 489 -> 0 bytes .../__pycache__/pos_session.cpython-36.pyc | Bin 868 -> 0 bytes .../pos_session_validation.cpython-36.pyc | Bin 7273 -> 0 bytes .../__pycache__/safe_box_coin.cpython-36.pyc | Bin 518 -> 0 bytes .../__pycache__/safe_box_group.cpython-36.pyc | Bin 1798 -> 0 bytes pos_safe_box/models/pos_session.py | 6 +- pos_safe_box/models/pos_session_validation.py | 62 +++++----- pos_safe_box/models/res_config_settings.py | 15 +++ pos_safe_box/tests/test_pos_safe_box.py | 114 ++++++++++++------ pos_safe_box/views/pos_config_views.xml | 21 ---- .../views/pos_session_validation_views.xml | 7 +- pos_safe_box/views/res_config_settings.xml | 36 ++++++ 15 files changed, 168 insertions(+), 98 deletions(-) delete mode 100644 pos_safe_box/models/__pycache__/__init__.cpython-36.pyc delete mode 100644 pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc delete mode 100644 pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc delete mode 100644 pos_safe_box/models/__pycache__/pos_session_validation.cpython-36.pyc delete mode 100644 pos_safe_box/models/__pycache__/safe_box_coin.cpython-36.pyc delete mode 100644 pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc create mode 100644 pos_safe_box/models/res_config_settings.py delete mode 100644 pos_safe_box/views/pos_config_views.xml create mode 100644 pos_safe_box/views/res_config_settings.xml diff --git a/pos_safe_box/__manifest__.py b/pos_safe_box/__manifest__.py index 7118637af..6f99c6ec7 100644 --- a/pos_safe_box/__manifest__.py +++ b/pos_safe_box/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Safe Box with PoS", - "version": "14.0.1.0.0", + "version": "16.0.1.0.0", "author": "Eficent, CreuBlanca", "depends": ["safe_box", "pos_close_approval", "pos_session_pay_invoice"], "data": [ @@ -12,7 +12,7 @@ "data/ir_sequence_data.xml", "views/pos_session_validation_views.xml", "views/pos_session_views.xml", - "views/pos_config_views.xml", + "views/res_config_settings.xml", "views/safe_box_group_views.xml", "views/safe_box_coin_views.xml", ], diff --git a/pos_safe_box/models/__init__.py b/pos_safe_box/models/__init__.py index 363c68aae..d4f49dfe8 100644 --- a/pos_safe_box/models/__init__.py +++ b/pos_safe_box/models/__init__.py @@ -7,3 +7,4 @@ from . import pos_session_validation from . import safe_box_group from . import safe_box_coin +from . import res_config_settings diff --git a/pos_safe_box/models/__pycache__/__init__.cpython-36.pyc b/pos_safe_box/models/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 6d57ae4f827aa765f82211a0e00655876896a3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmYk0y-ve05P-pkyc)H?@eY1m;q2J(31j7vPSkEQrfM*si- diff --git a/pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc b/pos_safe_box/models/__pycache__/pos_config.cpython-36.pyc deleted file mode 100644 index 1b9f809a2ca695772846fe5e36b1ede60cdb640b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmYjNy-ve05VjpBgsSD|1yCoX3?ve)6+%>ksTESU3|MK-O;eIM*sUO4VdWthc_pt* zyaE$;!rw`E`tC>HeRpSrL2vZBzRfT~@93XVgD;G$V-o-YE>MYMT#}ezbd7+3^NhgZ zWaT_LF$Fq9f%{=*Q9!h}$aw)ud!+zgsMMB!?3eh+R5*$;pqK!T9ZpxSr3LyzVh>zH z=;_@Xp~j+GReG?f%TL%)$YW;wQc_?>CnLT{ZV)1xoZjSJqOMgA~Jua diff --git a/pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc b/pos_safe_box/models/__pycache__/pos_session.cpython-36.pyc deleted file mode 100644 index 1c8e7a29eb8a1c4c5435f6ffb92f98ab7d8cb00c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 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 GenlTA*n~L% diff --git a/pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc b/pos_safe_box/models/__pycache__/safe_box_group.cpython-36.pyc deleted file mode 100644 index 2fa03a7315029955b3a64ad0d97502a6592b9d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcma)7&u`pB6rLZp*XwT5P*59Cg^Yw6wzRtlE(k4A)go0wYB)p!$*5SaXLjSQ?Qv(k zO|oh)Y_1%*bK%IpG*?dj7joh~Z|t;9gX+~hzvr1ZKfdpKv)^oN1e3q(-!^-M{7YVY z9PsZ!Gv9#`M9`cRG@=EISivJ+IFUo~JImd|i#$pm62XOYLWCpvytm?!FWh}H^j<+e z89J6HRc5_uCUaq|S12KKV`)63w)ab-%dDKGII?|QaPC1fQ!tW5RFH@X8gc2&UBPfI z;r_uRuZz7V?sajmiTy5y{lNIX=!@WlM1j0AABZbra6(oz+7KJC*G)UvPp0y|I(n$p zqFQbmh(=G;(P-Ahej6`u{`$pECU)+GJ6Q=9zsE2x&V(60Uf#x8LWsk|1F2=0s;o3& z0-mXrmLgPTnC8kXv>Y<)2~{LnX+2YGKwsZ&){ySH$=>%A|( zMLJqZjEpoUQ)LX;XCkT3Tr-;FDot{;3r;)9klPR5Tm_C|T~jBuw0@qIvXKkZ13a{U zc2)z2b&SlX%>mbD3kTe|Wa-avuZS^W4rOfl`TOkm4T7-L8hRseklq!rj?@bJF_|-@ z8X`XB!k@7feF?OgN!Ray=dM5m`=s`O&>qOad+O+)YrpObh*tD>$N+l#d&}!UMT_C+ z97BB#Rz9WQ>kr|r12C^p3CmkQmH9DLiww`lhG#g08R$IE)u9wazE0e3vxk8VWQp|^ zL$c+vd=BL$6P+Hc(e_d;fd+j8GAz$!X*raxMi@210aCn+$2Pgv%zYHOGznkCO8EYdri`Bdkt{Ai?c*k<0i(&lX+@U8$g4yRmQgG|*|R5$hI< zyv{TV@imaJJ~b*=!(R*OLo--bK6Oy1@bfQwbHCr@><#| j@+g%Rmf@N_>psFimL~mOd$Imxjo&V^Y;d-1I^h2SP{!^e diff --git a/pos_safe_box/models/pos_session.py b/pos_safe_box/models/pos_session.py index 2a4d03c00..cdf3bcf66 100644 --- a/pos_safe_box/models/pos_session.py +++ b/pos_safe_box/models/pos_session.py @@ -10,9 +10,9 @@ class PosSession(models.Model): pos_session_validation_id = fields.Many2one("pos.session.validation", readonly=True) - def action_pos_session_close(self): - res = super(PosSession, self).action_pos_session_close() - for session in self: + def action_pos_session_close(self, *args, **kwargs): + res = super(PosSession, self).action_pos_session_close(*args, **kwargs) + for session in self.filtered(lambda r: r.state == "closed"): sbg = session.config_id.safe_box_group_id if sbg: self.pos_session_validation_id = sbg.get_current_session_validation() diff --git a/pos_safe_box/models/pos_session_validation.py b/pos_safe_box/models/pos_session_validation.py index 8756a2d5c..cd04e2709 100644 --- a/pos_safe_box/models/pos_session_validation.py +++ b/pos_safe_box/models/pos_session_validation.py @@ -2,7 +2,7 @@ # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import _, api, fields, models +from odoo import _, api, fields, models, tools from odoo.exceptions import ValidationError @@ -32,14 +32,9 @@ class PosSessionValidation(models.Model): state = fields.Selection( [("draft", "Draft"), ("closed", "Closed"), ("approved", "Approved")] ) - statement_ids = fields.One2many( - comodel_name="account.bank.statement", - compute="_compute_statement_ids", - readonly=True, - ) statement_line_ids = fields.One2many( comodel_name="account.bank.statement.line", - compute="_compute_statement_ids", + compute="_compute_statement_line_ids", readonly=True, ) issue_statement_line_ids = fields.One2many( @@ -64,10 +59,11 @@ class PosSessionValidation(models.Model): approve_date = fields.Datetime(readonly=True) @api.depends("pos_session_ids") - def _compute_statement_ids(self): + def _compute_statement_line_ids(self): for record in self: - record.statement_ids = record.pos_session_ids.mapped("statement_ids") - record.statement_line_ids = record.statement_ids.mapped("line_ids") + record.statement_line_ids = record.pos_session_ids.mapped( + "statement_line_ids" + ) @api.depends("line_ids") def _compute_amount(self): @@ -75,12 +71,10 @@ def _compute_amount(self): record.coin_amount = sum(record.line_ids.mapped("amount")) def _compute_statement_amount(self): - lines = self.pos_session_ids.mapped("cash_register_id.line_ids") + lines = self.pos_session_ids.mapped("statement_line_ids") lines_not_computed = lines.filtered( lambda r: r.account_id - not in r.statement_id.pos_session_id.payment_method_ids.mapped( - "receivable_account_id" - ) + not in r.pos_session_id.payment_method_ids.mapped("receivable_account_id") ) payments = self.pos_session_ids.mapped("order_ids.payment_ids") amount = sum(lines_not_computed.mapped("amount")) + sum( @@ -88,16 +82,15 @@ def _compute_statement_amount(self): ) return amount - @api.depends("statement_ids", "pos_session_ids") + @api.depends("statement_line_ids", "pos_session_ids") def _compute_statement_values(self): for record in self: - statements = record.statement_ids - record.amount = sum(statements.mapped("total_entry_encoding")) + record.amount = sum(record.statement_line_ids.mapped("amount")) record.amount = record._compute_statement_amount() record.cash_amount = sum( - statements.filtered(lambda r: r.journal_id.type == "cash").mapped( - "total_entry_encoding" - ) + record.statement_line_ids.filtered( + lambda r: r.journal_id.type == "cash" + ).mapped("amount") ) lines = record.statement_line_ids record.issue_statement_line_ids = lines.filtered(lambda r: not r.invoice_id) @@ -112,16 +105,15 @@ def safe_box_move_line_vals(self, move, safe_box, value): "amount": value, } - def account_move_vals(self, statement): + def account_move_vals(self, journal, amount): account = self.safe_box_group_id.account_ids.filtered( - lambda r: r.company_id.id == statement.journal_id.company_id.id + lambda r: r.company_id.id == journal.company_id.id ) if not account: raise ValidationError(_("Account cannot be found for this company")) - amount = statement.total_entry_encoding - statement_account = statement.journal_id.default_account_id + statement_account = journal.default_account_id return { - "journal_id": statement.journal_id.id, + "journal_id": journal.id, "safe_box_move_id": self.closing_move_id.id, "line_ids": [ ( @@ -170,10 +162,24 @@ def close(self): self.env["safe.box.move.line"].create( self.safe_box_move_line_vals(self.closing_move_id, safe_box, lines[key]) ) - for statement in self.statement_ids.filtered( - lambda r: (r.journal_id.type == "cash" and r.total_entry_encoding != 0) + for journal in self.statement_line_ids.journal_id.filtered( + lambda r: (r.type == "cash") ): - move = self.env["account.move"].create(self.account_move_vals(statement)) + amount = sum( + self.statement_line_ids.filtered( + lambda r: r.journal_id == journal + ).mapped("amount") + ) + if tools.float_is_zero( + amount, + precision_rounding=( + journal.currency_id or journal.company_id.currency_id + ).rounding, + ): + continue + move = self.env["account.move"].create( + self.account_move_vals(journal, amount) + ) move.action_post() self.closing_move_id.close() self.write({"state": "closed", "closing_date": fields.Datetime.now()}) diff --git a/pos_safe_box/models/res_config_settings.py b/pos_safe_box/models/res_config_settings.py new file mode 100644 index 000000000..1a087e7fb --- /dev/null +++ b/pos_safe_box/models/res_config_settings.py @@ -0,0 +1,15 @@ +# Copyright 2025 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = "res.config.settings" + + pos_safe_box_group_id = fields.Many2one( + related="pos_config_id.safe_box_group_id", + string="Safe box system", + readonly=False, + ) diff --git a/pos_safe_box/tests/test_pos_safe_box.py b/pos_safe_box/tests/test_pos_safe_box.py index f630566c5..dade47a8d 100644 --- a/pos_safe_box/tests/test_pos_safe_box.py +++ b/pos_safe_box/tests/test_pos_safe_box.py @@ -1,78 +1,114 @@ # Copyright 2017 Creu Blanca # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). - +import odoo from odoo.exceptions import ValidationError -from odoo.tests.common import TransactionCase +from odoo.tests import Form + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT +from odoo.addons.point_of_sale.tests.common import TestPointOfSaleCommon -class TestPosSafeBox(TransactionCase): - def setUp(self): - super(TestPosSafeBox, self).setUp() - self.safe_box_group = self.env["safe.box.group"].create( +@odoo.tests.tagged("post_install", "-at_install") +class TestPosSafeBox(TestPointOfSaleCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.pos_config.cash_control = True + cls.safe_box_group = cls.env["safe.box.group"].create( { "name": "Group", "code": "SB", - "currency_id": self.ref("base.USD"), + "currency_id": cls.env.ref("base.USD").id, } ) - self.coin_01 = self.env["safe.box.coin"].create( + cls.coin_01 = cls.env["safe.box.coin"].create( { - "safe_box_group_id": self.safe_box_group.id, + "safe_box_group_id": cls.safe_box_group.id, "name": "Coin", "type": "coin", "rate": 1, } ) - self.coin_02 = self.env["safe.box.coin"].create( + cls.coin_02 = cls.env["safe.box.coin"].create( { - "safe_box_group_id": self.safe_box_group.id, + "safe_box_group_id": cls.safe_box_group.id, "name": "Note", "type": "note", "rate": 1, } ) - self.safe_box_01 = self.env["safe.box"].create( - {"safe_box_group_id": self.safe_box_group.id, "name": "SB 01"} + cls.safe_box_01 = cls.env["safe.box"].create( + {"safe_box_group_id": cls.safe_box_group.id, "name": "SB 01"} ) - self.safe_box_02 = self.env["safe.box"].create( - {"safe_box_group_id": self.safe_box_group.id, "name": "SB 02"} + cls.safe_box_02 = cls.env["safe.box"].create( + {"safe_box_group_id": cls.safe_box_group.id, "name": "SB 02"} ) - self.safe_box_03 = self.env["safe.box"].create( - {"safe_box_group_id": self.safe_box_group.id, "name": "SB 03"} + cls.safe_box_03 = cls.env["safe.box"].create( + {"safe_box_group_id": cls.safe_box_group.id, "name": "SB 03"} ) - self.company = self.browse_ref("base.main_company") - self.account_01 = self.env["account.account"].create( - { - "name": "Account 01", - "code": "001", - "company_id": self.company.id, - "user_type_id": self.ref("account.data_account_type_liquidity"), - "safe_box_group_id": self.safe_box_group.id, - } + cls.account_01 = ( + cls.env["account.account"] + .sudo() + .create( + { + "name": "Account 01", + "code": "001", + "company_id": cls.company.id, + "account_type": "asset_cash", + "safe_box_group_id": cls.safe_box_group.id, + } + ) ) - self.journal = self.env["account.journal"].search( - [("type", "=", "cash"), ("company_id", "=", self.company.id)], + cls.journal = cls.env["account.journal"].search( + [("type", "=", "cash"), ("company_id", "=", cls.company.id)], limit=1, ) - self.pos_config = self.env["pos.config"].new( + cls.pos_config.safe_box_group_id = cls.safe_box_group + cls.invoice_out = cls.env["account.move"].create( { - "company_id": self.company.id, - "safe_box_group_id": self.safe_box_group.id, - "name": "Safe Box PoS", - "requires_approval": False, + "partner_id": cls.partner4.id, + "company_id": cls.company.id, + "move_type": "out_invoice", + "date": "2016-03-12", + "invoice_date": "2016-03-12", + "invoice_line_ids": [ + ( + 0, + 0, + { + "product_id": cls.product3.id, + "name": "Producto de prueba", + "quantity": 1.0, + "price_unit": 100.0, + "tax_ids": [], + }, + ) + ], } ) - self.pos_config = self.pos_config.create(self.pos_config._cache) + cls.invoice_out.action_post() def test_pos_safe_box(self): - self.pos_config.open_session_cb() + self.pos_config._action_to_open_ui() session = self.pos_config.current_session_id - self.assertTrue(session.statement_ids) - self.env["cash.box.out"].with_context( - active_model="pos.session", active_ids=session.ids - ).create({"name": "Testing", "amount": 100}).run() + session.action_pos_session_open() + wizard_context = session.button_show_wizard_pay_out_invoice()["context"] + cash_in = self.env["cash.pay.invoice"].with_context(**wizard_context) + with Form(cash_in) as form: + form.invoice_id = self.invoice_out + self.assertEqual(form.amount, 100) + cash_in.browse(form.id).action_pay_invoice() + + # Set it as rescue in order to avoid extra moves + session.rescue = True + session.cash_register_balance_end_real = session.cash_register_balance_end + session.cash_register_difference = 0.0 + session.action_pos_session_closing_control() + session.flush_recordset() + self.assertEqual(session.state, "closed") self.assertTrue(session.pos_session_validation_id) validation = session.pos_session_validation_id with self.assertRaises(ValidationError): diff --git a/pos_safe_box/views/pos_config_views.xml b/pos_safe_box/views/pos_config_views.xml deleted file mode 100644 index d74413da4..000000000 --- a/pos_safe_box/views/pos_config_views.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - pos.config.form.view - pos.config - - - -
-
- -
-
-
-
-
-
-
-
diff --git a/pos_safe_box/views/pos_session_validation_views.xml b/pos_safe_box/views/pos_session_validation_views.xml index ca9e55db2..4156e7594 100644 --- a/pos_safe_box/views/pos_session_validation_views.xml +++ b/pos_safe_box/views/pos_session_validation_views.xml @@ -4,7 +4,7 @@ pos.session.validation.line.tree pos.session.validation.line - + @@ -16,7 +16,7 @@ pos.session.validation.tree pos.session.validation - + @@ -81,9 +81,6 @@ options="{'no_delete': True, 'delete': False}" /> - - - diff --git a/pos_safe_box/views/res_config_settings.xml b/pos_safe_box/views/res_config_settings.xml new file mode 100644 index 000000000..b9f8f09e9 --- /dev/null +++ b/pos_safe_box/views/res_config_settings.xml @@ -0,0 +1,36 @@ + + + + + + res.config.settings + + + +
+
+
+
+
+
+
+
+
+ + + +