diff options
| author | Florian Gilbert <flg@odoo.com> | 2019-08-22 10:03:26 +0000 |
|---|---|---|
| committer | Florian Gilbert <flg@odoo.com> | 2019-09-25 11:26:02 +0000 |
| commit | ab483a3a6610a09391ec00e9c1c49489ca4a4f12 (patch) | |
| tree | 0882cebae27345110d8049970e37eaa3fea11991 /addons/l10n_fr_pos_cert | |
| parent | 02dfe1e8e789ee783f58f667efdf47c017585298 (diff) | |
[IMP] account: Add restrict mode and normal mode for account move.
This commit deletes account_cancel module and squash it into account.
The 'update_posted' field is changed by 'restrict_mode_hash_table' field.
If 'restrict_mode_hash_table' is true, you have a hash chain on your account journal.
These hash chains prove the inalterability of your accounting.
l10n_fr_certification module is deleted and all hashing method are moved in account module.
Now, you can download a PDF report about your inalterability in the company settings.
If you have l10n_fr or l10n_post_cert installed you have more information on this report
like the inalterability of pos orders, etc.
Task ID: 2039160
Diffstat (limited to 'addons/l10n_fr_pos_cert')
| -rw-r--r-- | addons/l10n_fr_pos_cert/__init__.py | 4 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/__manifest__.py | 4 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/data/pos_inalterability.xml | 18 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/models/pos.py | 61 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/models/res_company.py | 19 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/views/account_views.xml | 2 | ||||
| -rw-r--r-- | addons/l10n_fr_pos_cert/views/pos_inalterability_menuitem.xml | 4 |
7 files changed, 27 insertions, 85 deletions
diff --git a/addons/l10n_fr_pos_cert/__init__.py b/addons/l10n_fr_pos_cert/__init__.py index eae875db876..4059582d30c 100644 --- a/addons/l10n_fr_pos_cert/__init__.py +++ b/addons/l10n_fr_pos_cert/__init__.py @@ -3,7 +3,6 @@ from . import models from odoo import api, SUPERUSER_ID -from ..l10n_fr_certification.models.res_company import UNALTERABLE_COUNTRIES def _setup_inalterability(cr, registry): @@ -11,7 +10,6 @@ def _setup_inalterability(cr, registry): # enable ping for this module env['publisher_warranty.contract'].update_notification(cron_mode=True) - fr_companies = env['res.company'].search([('partner_id.country_id.code', 'in', UNALTERABLE_COUNTRIES)]) + fr_companies = env['res.company'].search([('partner_id.country_id.code', 'in', env['res.company']._get_unalterable_country())]) if fr_companies: - # create the securisation sequence per company fr_companies._create_secure_sequence(['l10n_fr_pos_cert_sequence_id']) diff --git a/addons/l10n_fr_pos_cert/__manifest__.py b/addons/l10n_fr_pos_cert/__manifest__.py index 385cd2a1438..521c19a6783 100644 --- a/addons/l10n_fr_pos_cert/__manifest__.py +++ b/addons/l10n_fr_pos_cert/__manifest__.py @@ -23,10 +23,10 @@ The module adds following features: """, 'depends': ['l10n_fr_sale_closing', 'point_of_sale'], 'installable': True, - 'auto_install': False, + 'auto_install': True, 'application': False, 'data': [ - 'data/pos_inalterability.xml', + 'views/pos_inalterability_menuitem.xml', 'views/account_views.xml', ], 'post_init_hook': '_setup_inalterability', diff --git a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml b/addons/l10n_fr_pos_cert/data/pos_inalterability.xml deleted file mode 100644 index 39d1f59c699..00000000000 --- a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml +++ /dev/null @@ -1,18 +0,0 @@ -<odoo> - - <menuitem id="pos_fr_statements_menu" name="French Statements" parent="point_of_sale.menu_point_rep" sequence="9" /> - - <menuitem action="l10n_fr_sale_closing.action_list_view_account_sale_closing" id="menu_account_closing" parent="pos_fr_statements_menu" sequence="90"/> - - <record model="ir.actions.server" id="action_check_hash_integrity_pos_orders"> - <field name="name">Pos Orders Inalterability Check</field> - <field name="model_id" ref="point_of_sale.model_pos_order"/> - <field name="type">ir.actions.server</field> - <field name="state">code</field> - <field name="code"> -action = env['pos.order']._check_hash_integrity(env.company.id) - </field> - </record> - - <menuitem action="action_check_hash_integrity_pos_orders" id="menu_check_pos_order_integrity" parent="pos_fr_statements_menu" sequence="90"/> -</odoo>
\ No newline at end of file diff --git a/addons/l10n_fr_pos_cert/models/pos.py b/addons/l10n_fr_pos_cert/models/pos.py index 43aa57453d4..8f53c3dd1ef 100644 --- a/addons/l10n_fr_pos_cert/models/pos.py +++ b/addons/l10n_fr_pos_cert/models/pos.py @@ -3,7 +3,6 @@ from datetime import datetime, timedelta from hashlib import sha256 from json import dumps -import pytz from odoo import models, api, fields from odoo.fields import Datetime @@ -11,19 +10,6 @@ from odoo.tools.translate import _, _lt from odoo.exceptions import UserError -def ctx_tz(record, field): - res_lang = None - ctx = record._context - tz_name = pytz.timezone(ctx.get('tz') or record.env.user.tz) - timestamp = Datetime.from_string(record[field]) - if ctx.get('lang'): - res_lang = record.env['res.lang']._lang_get(ctx['lang']) - if res_lang: - timestamp = pytz.utc.localize(timestamp, is_dst=False) - return datetime.strftime(timestamp.astimezone(tz_name), res_lang.date_format + ' ' + res_lang.time_format) - return Datetime.context_timestamp(record, timestamp) - - class pos_config(models.Model): _inherit = 'pos.config' @@ -91,7 +77,7 @@ class pos_order(models.Model): if obj._fields[field_str].type == 'many2one': field_value = field_value.id if obj._fields[field_str].type in ['many2many', 'one2many']: - field_value = field_value.ids + field_value = field_value.sorted().ids return str(field_value) for order in self: @@ -134,51 +120,6 @@ class pos_order(models.Model): res |= super(pos_order, order).write(vals_hashing) return res - @api.model - def _check_hash_integrity(self, company_id): - """Checks that all posted or invoiced pos orders have still the same data as when they were posted - and raises an error with the result. - """ - def build_order_info(order): - entry_reference = _('(Receipt ref.: %s)') - order_reference_string = order.pos_reference and entry_reference % order.pos_reference or '' - return [ctx_tz(order, 'date_order'), order.l10n_fr_secure_sequence_number, order.name, order_reference_string, ctx_tz(order, 'write_date')] - - orders = self.search([('state', 'in', ['paid', 'done', 'invoiced']), - ('company_id', '=', company_id), - ('l10n_fr_secure_sequence_number', '!=', 0)], - order="l10n_fr_secure_sequence_number ASC") - - if not orders: - raise UserError(_('There isn\'t any order flagged for data inalterability yet for the company %s. This mechanism only runs for point of sale orders generated after the installation of the module France - Certification CGI 286 I-3 bis. - POS') % self.env.company.name) - previous_hash = u'' - start_order_info = [] - for order in orders: - if order.l10n_fr_hash != order._compute_hash(previous_hash=previous_hash): - raise UserError(_('Corrupted data on point of sale order with id %s.') % order.id) - previous_hash = order.l10n_fr_hash - - orders_sorted_date = orders.sorted(lambda o: o.date_order) - start_order_info = build_order_info(orders_sorted_date[0]) - end_order_info = build_order_info(orders_sorted_date[-1]) - - report_dict = {'start_order_name': start_order_info[2], - 'start_order_ref': start_order_info[3], - 'start_order_date': start_order_info[0], - 'end_order_name': end_order_info[2], - 'end_order_ref': end_order_info[3], - 'end_order_date': end_order_info[0]} - - # Raise on success - raise UserError(_('''Successful test ! - - The point of sale orders are guaranteed to be in their original and inalterable state - From: %(start_order_name)s %(start_order_ref)s recorded on %(start_order_date)s - To: %(end_order_name)s %(end_order_ref)s recorded on %(end_order_date)s - - For this report to be legally meaningful, please download your certification from your customer account on Odoo.com (Only for Odoo Enterprise users).''' - ) % report_dict) - class PosOrderLine(models.Model): _inherit = "pos.order.line" diff --git a/addons/l10n_fr_pos_cert/models/res_company.py b/addons/l10n_fr_pos_cert/models/res_company.py index 651c5815148..74dae578af3 100644 --- a/addons/l10n_fr_pos_cert/models/res_company.py +++ b/addons/l10n_fr_pos_cert/models/res_company.py @@ -1,6 +1,23 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import models, api, fields +from odoo import models, api, fields, _ +from odoo.exceptions import UserError +from datetime import datetime +from odoo.fields import Datetime +import pytz + + +def ctx_tz(record, field): + res_lang = None + ctx = record._context + tz_name = pytz.timezone(ctx.get('tz') or record.env.user.tz) + timestamp = Datetime.from_string(record[field]) + if ctx.get('lang'): + res_lang = record.env['res.lang']._lang_get(ctx['lang']) + if res_lang: + timestamp = pytz.utc.localize(timestamp, is_dst=False) + return datetime.strftime(timestamp.astimezone(tz_name), res_lang.date_format + ' ' + res_lang.time_format) + return Datetime.context_timestamp(record, timestamp) class ResCompany(models.Model): diff --git a/addons/l10n_fr_pos_cert/views/account_views.xml b/addons/l10n_fr_pos_cert/views/account_views.xml index bfe6100061f..27d4d2e9d9b 100644 --- a/addons/l10n_fr_pos_cert/views/account_views.xml +++ b/addons/l10n_fr_pos_cert/views/account_views.xml @@ -23,4 +23,4 @@ </field> </record> -</odoo>
\ No newline at end of file +</odoo> diff --git a/addons/l10n_fr_pos_cert/views/pos_inalterability_menuitem.xml b/addons/l10n_fr_pos_cert/views/pos_inalterability_menuitem.xml new file mode 100644 index 00000000000..4f05afcb99f --- /dev/null +++ b/addons/l10n_fr_pos_cert/views/pos_inalterability_menuitem.xml @@ -0,0 +1,4 @@ +<odoo> + <menuitem id="pos_fr_statements_menu" name="French Statements" parent="point_of_sale.menu_point_rep" sequence="9" /> + <menuitem action="l10n_fr.action_list_view_account_sale_closing" id="menu_account_closing" parent="pos_fr_statements_menu" sequence="90"/> +</odoo>
\ No newline at end of file |
