summaryrefslogtreecommitdiff
path: root/addons/l10n_fr_pos_cert
diff options
context:
space:
mode:
authorFlorian Gilbert <flg@odoo.com>2019-08-22 10:03:26 +0000
committerFlorian Gilbert <flg@odoo.com>2019-09-25 11:26:02 +0000
commitab483a3a6610a09391ec00e9c1c49489ca4a4f12 (patch)
tree0882cebae27345110d8049970e37eaa3fea11991 /addons/l10n_fr_pos_cert
parent02dfe1e8e789ee783f58f667efdf47c017585298 (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__.py4
-rw-r--r--addons/l10n_fr_pos_cert/__manifest__.py4
-rw-r--r--addons/l10n_fr_pos_cert/data/pos_inalterability.xml18
-rw-r--r--addons/l10n_fr_pos_cert/models/pos.py61
-rw-r--r--addons/l10n_fr_pos_cert/models/res_company.py19
-rw-r--r--addons/l10n_fr_pos_cert/views/account_views.xml2
-rw-r--r--addons/l10n_fr_pos_cert/views/pos_inalterability_menuitem.xml4
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