From 224efeddb245644a1444101ec161e28a7add7c82 Mon Sep 17 00:00:00 2001 From: miguelpadin Date: Thu, 29 Apr 2021 17:46:37 +0200 Subject: [PATCH] [IMP] pms-l10n-es: generate traveller report Co-authored-by: braisab --- pms_l10n_es/__init__.py | 1 + pms_l10n_es/__manifest__.py | 6 ++ pms_l10n_es/data/cron_jobs.xml | 21 +++++ pms_l10n_es/data/pms_sequence.xml | 12 +++ pms_l10n_es/models/__init__.py | 1 + pms_l10n_es/models/pms_checkin_partner.py | 25 ++++-- pms_l10n_es/models/pms_property.py | 18 ++++ pms_l10n_es/security/ir.model.access.csv | 2 + .../views/pms_checkin_partner_views.xml | 8 +- pms_l10n_es/views/pms_property_views.xml | 20 +++++ pms_l10n_es/wizards/__init__.py | 1 + pms_l10n_es/wizards/traveller_report.py | 86 +++++++++++++++++++ pms_l10n_es/wizards/traveller_report.xml | 48 +++++++++++ 13 files changed, 240 insertions(+), 9 deletions(-) create mode 100644 pms_l10n_es/data/cron_jobs.xml create mode 100644 pms_l10n_es/data/pms_sequence.xml create mode 100644 pms_l10n_es/models/pms_property.py create mode 100644 pms_l10n_es/security/ir.model.access.csv create mode 100644 pms_l10n_es/views/pms_property_views.xml create mode 100644 pms_l10n_es/wizards/__init__.py create mode 100644 pms_l10n_es/wizards/traveller_report.py create mode 100644 pms_l10n_es/wizards/traveller_report.xml diff --git a/pms_l10n_es/__init__.py b/pms_l10n_es/__init__.py index 0650744f6..aee8895e7 100644 --- a/pms_l10n_es/__init__.py +++ b/pms_l10n_es/__init__.py @@ -1 +1,2 @@ from . import models +from . import wizards diff --git a/pms_l10n_es/__manifest__.py b/pms_l10n_es/__manifest__.py index 912abc329..61a59521a 100644 --- a/pms_l10n_es/__manifest__.py +++ b/pms_l10n_es/__manifest__.py @@ -15,10 +15,16 @@ "partner_second_lastname", "partner_contact_gender", "partner_contact_birthdate", + "partner_contact_nationality", ], "data": [ + "data/cron_jobs.xml", + "data/pms_sequence.xml", + "security/ir.model.access.csv", "views/pms_checkin_partner_views.xml", + "views/pms_property_views.xml", "views/res_partner_views.xml", + "wizards/traveller_report.xml", ], "installable": True, } diff --git a/pms_l10n_es/data/cron_jobs.xml b/pms_l10n_es/data/cron_jobs.xml new file mode 100644 index 000000000..76f00dc0a --- /dev/null +++ b/pms_l10n_es/data/cron_jobs.xml @@ -0,0 +1,21 @@ + + + + + Automatic Send Traveller Report + + 1 + + days + -1 + + code + + + model.generate_file() + + + diff --git a/pms_l10n_es/data/pms_sequence.xml b/pms_l10n_es/data/pms_sequence.xml new file mode 100644 index 000000000..f88b48920 --- /dev/null +++ b/pms_l10n_es/data/pms_sequence.xml @@ -0,0 +1,12 @@ + + + + + PMS L10N Traveller Report + traveller.report.wizard + 3 + 1 + 1 + + + diff --git a/pms_l10n_es/models/__init__.py b/pms_l10n_es/models/__init__.py index 4354d9499..ebd8614e3 100644 --- a/pms_l10n_es/models/__init__.py +++ b/pms_l10n_es/models/__init__.py @@ -1,2 +1,3 @@ from . import res_partner from . import pms_checkin_partner +from . import pms_property diff --git a/pms_l10n_es/models/pms_checkin_partner.py b/pms_l10n_es/models/pms_checkin_partner.py index 81fd7be26..1cc4c9a31 100644 --- a/pms_l10n_es/models/pms_checkin_partner.py +++ b/pms_l10n_es/models/pms_checkin_partner.py @@ -62,12 +62,13 @@ class PmsCheckinPartner(models.Model): store=True, readonly=False, ) - - @api.depends("partner_id", "partner_id.lastname") - def _compute_lastname(self): - for record in self: - if not record.lastname: - record.lastname = record.partner_id.lastname + nationality_id = fields.Many2one( + string="Nationality ID", + compute="_compute_nationality", + comodel_name="res.country", + store=True, + readonly=False, + ) @api.depends("partner_id", "partner_id.firstname") def _compute_firstname(self): @@ -75,6 +76,12 @@ class PmsCheckinPartner(models.Model): if not record.firstname: record.firstname = record.partner_id.firstname + @api.depends("partner_id", "partner_id.lastname") + def _compute_lastname(self): + for record in self: + if not record.lastname: + record.lastname = record.partner_id.lastname + @api.depends("partner_id", "partner_id.lastname2") def _compute_lastname2(self): for record in self: @@ -113,6 +120,12 @@ class PmsCheckinPartner(models.Model): if not record.gender: record.gender = record.partner_id.gender + @api.depends("partner_id", "partner_id.lastname") + def _compute_nationality(self): + for record in self: + if not record.nationality_id: + record.nationality_id = record.partner_id.nationality_id + @api.model def _checkin_mandatory_fields(self, depends=False): mandatory_fields = super(PmsCheckinPartner, self)._checkin_mandatory_fields( diff --git a/pms_l10n_es/models/pms_property.py b/pms_l10n_es/models/pms_property.py new file mode 100644 index 000000000..4901deaaa --- /dev/null +++ b/pms_l10n_es/models/pms_property.py @@ -0,0 +1,18 @@ +from odoo import _, fields, models + + +class PmsProperty(models.Model): + _inherit = "pms.property" + + police_type = fields.Selection( + [ + ("guardia_civil", "Guardia Civil"), + ("policia_nacional","PolicĂ­a Nacional"), + ("ertxaintxa", "Ertxaintxa"), + ("mossos", "Mossos_d'esquadra") + ], + string="Police Type", + default="guardia_civil") + police_number = fields.Char("Police Number", size=10) + police_user = fields.Char("Police User") + police_pass = fields.Char("Police Password") diff --git a/pms_l10n_es/security/ir.model.access.csv b/pms_l10n_es/security/ir.model.access.csv new file mode 100644 index 000000000..d8d1060d6 --- /dev/null +++ b/pms_l10n_es/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +user_access_traveller_report_wizard,user_access_traveller_report_wizard,model_traveller_report_wizard,pms.group_pms_user,1,1,1,1 diff --git a/pms_l10n_es/views/pms_checkin_partner_views.xml b/pms_l10n_es/views/pms_checkin_partner_views.xml index 8eefdeef2..96a1f4de6 100644 --- a/pms_l10n_es/views/pms_checkin_partner_views.xml +++ b/pms_l10n_es/views/pms_checkin_partner_views.xml @@ -7,12 +7,14 @@ + + @@ -32,6 +34,7 @@ + @@ -51,6 +54,7 @@ + @@ -70,11 +74,11 @@ + - Checkin partner view tree Spain pms.checkin.partner @@ -93,6 +97,4 @@ - - diff --git a/pms_l10n_es/views/pms_property_views.xml b/pms_l10n_es/views/pms_property_views.xml new file mode 100644 index 000000000..52aeaf8c7 --- /dev/null +++ b/pms_l10n_es/views/pms_property_views.xml @@ -0,0 +1,20 @@ + + + + + + Property Form l10n_es + pms.property + + + + + + + + + + + + + diff --git a/pms_l10n_es/wizards/__init__.py b/pms_l10n_es/wizards/__init__.py new file mode 100644 index 000000000..1a18223f3 --- /dev/null +++ b/pms_l10n_es/wizards/__init__.py @@ -0,0 +1 @@ +from . import traveller_report diff --git a/pms_l10n_es/wizards/traveller_report.py b/pms_l10n_es/wizards/traveller_report.py new file mode 100644 index 000000000..4a79a9cce --- /dev/null +++ b/pms_l10n_es/wizards/traveller_report.py @@ -0,0 +1,86 @@ +import base64 +import datetime +from datetime import date +from odoo import _, api, fields, models +import requests + + +class TravellerReport(models.TransientModel): + _name = "traveller.report.wizard" + _description = "Traveller Report" + + txt_filename = fields.Char() + txt_binary = fields.Binary() + txt_message = fields.Char() + + def generate_file(self): + date_start = str(date.today()) + " 0:00:00" + date_end = str(date.today()) + " 23:59:59" + lines = self.env["pms.checkin.partner"].search( + [ + ("state", "=", "onboard"), + ("arrival", ">=", date_start), + ("arrival", "<=", date_end), + ] + ) + if not lines: + return + pms_property = self.env["pms.property"].search( + [("id", "=", self.env.user.get_active_property_ids()[0])] + ) + if pms_property.police_number and pms_property.name: + content = "1|" + pms_property.police_number.upper() + "|" + pms_property.name.upper() + content += "|" + content += datetime.datetime.now().strftime("%Y%m%d|%H%M") + content += "|" + str(len(lines)) + for line in lines: + if line.document_type == "D": + content += "\n2|" + line.document_number.upper() + "||" + else: + content += "\n2||" + line.document_number.upper() + "|" + content += line.document_type + "|" + content += line.document_expedition_date.strftime("%Y%m%d") + "|" + content += line.lastname.upper() + "|" + if line.lastname2: + content += line.lastname2.upper() + content += "|" + line.firstname.upper() + "|" + if line.gender == "female": + content += "F|" + else: + content += "M|" + content += line.birthdate_date.strftime("%Y%m%d") + "|" + # REVIEW: nationality_id must be nationality + content += line.nationality_id.name.upper() + "|" + content += line.arrival.strftime("%Y%m%d") + "|" + sequence_num = self.env['ir.sequence'].next_by_code("traveller.report.wizard") + txt_binary = self.env["traveller.report.wizard"].create( + { + "txt_filename": pms_property.police_number + "." + sequence_num, + "txt_binary": base64.b64encode(str.encode(content)), + "txt_message": content, + } + ) + return { + "name": _("Download File"), + "res_id": txt_binary.id, + "res_model": "traveller.report.wizard", + "target": "new", + "type": "ir.actions.act_window", + "view_id": self.env.ref("pms_l10n_es.traveller_report_wizard").id, + "view_mode": "form", + "view_type": "form", + } + + def send_guardia_civil_report(self): + pms_property = self.env["pms.property"].search( + [("id", "=", self.env.user.get_active_property_ids()[0])] + ) + user = pms_property.police_user + password = pms_property.police_pass + if user and password: + data = [self.txt_binary] + requests.post( + 'https://usuario:password@hospederias.guardiacivil.es/hospederias/servlet/ControlRecepcionFichero', + auth=(user, password), + data=data + ) diff --git a/pms_l10n_es/wizards/traveller_report.xml b/pms_l10n_es/wizards/traveller_report.xml new file mode 100644 index 000000000..5bf2313fd --- /dev/null +++ b/pms_l10n_es/wizards/traveller_report.xml @@ -0,0 +1,48 @@ + + + + Traveller Report + traveller.report.wizard + +
+ +
+
+ +
+

+
+
+
+
+
+
+ + Traveller Report + ir.actions.act_window + traveller.report.wizard + + form + new + + +