mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]14.0-pms_api_rest: service OCR supplier generic
This commit is contained in:
@@ -5,7 +5,9 @@ from odoo.addons.datamodel.core import Datamodel
|
||||
|
||||
class PmsOcrInput(Datamodel):
|
||||
_name = "pms.ocr.input"
|
||||
imageBase64 = fields.String(required=True, allow_none=False)
|
||||
imageBase64Front = fields.String(required=True, allow_none=False)
|
||||
imageBase64Back = fields.String(required=False, allow_none=False)
|
||||
pmsPropertyId = fields.Integer(required=True, allow_none=False)
|
||||
|
||||
|
||||
class PmsOcrCheckinResult(Datamodel):
|
||||
@@ -24,3 +26,5 @@ class PmsOcrCheckinResult(Datamodel):
|
||||
residenceStreet = fields.String(required=False, allow_none=True)
|
||||
residenceCity = fields.String(required=False, allow_none=True)
|
||||
countryState = fields.Integer(required=False, allow_none=True)
|
||||
documentCountryId = fields.Integer(required=False, allow_none=True)
|
||||
zip = fields.String(required=False, allow_none=True)
|
||||
|
||||
@@ -31,3 +31,4 @@ class PmsPropertyInfo(Datamodel):
|
||||
simpleFutureColor = fields.String(required=False, allow_none=True)
|
||||
language = fields.String(required=True, allow_none=False)
|
||||
hotelImageUrl = fields.String(required=False, allow_none=True)
|
||||
isUsedOCR = fields.Boolean(required=True, allow_none=False)
|
||||
|
||||
@@ -111,6 +111,12 @@ class PmsProperty(models.Model):
|
||||
inverse_name="pms_property_id",
|
||||
)
|
||||
|
||||
ocr_checkin_supplier = fields.Selection(
|
||||
string="OCR Checkin Supplier",
|
||||
help="Select ocr supplier for checkin documents",
|
||||
selection=[],
|
||||
)
|
||||
|
||||
# PUSH API NOTIFICATIONS
|
||||
def get_payload_avail(self, avails, client):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -44,3 +44,4 @@ from . import pms_avail_service
|
||||
from . import pms_user_service
|
||||
from . import pms_dashboard_service
|
||||
from . import feed_post_service
|
||||
from . import ocr_document_service
|
||||
|
||||
259
pms_api_rest/services/ocr_document_service.py
Normal file
259
pms_api_rest/services/ocr_document_service.py
Normal file
@@ -0,0 +1,259 @@
|
||||
from datetime import date, datetime
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from regula.documentreader.webclient import (
|
||||
DocumentReaderApi,
|
||||
ProcessParams,
|
||||
RecognitionRequest,
|
||||
Result,
|
||||
Scenario,
|
||||
TextFieldType,
|
||||
)
|
||||
|
||||
from odoo.addons.base_rest import restapi
|
||||
from odoo.addons.base_rest_datamodel.restapi import Datamodel
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
|
||||
class PmsOcr(Component):
|
||||
_inherit = "base.rest.service"
|
||||
_name = "ocr.document.service"
|
||||
_usage = "ocr-document"
|
||||
_collection = "pms.services"
|
||||
|
||||
@restapi.method(
|
||||
[
|
||||
(
|
||||
[
|
||||
"/",
|
||||
],
|
||||
"POST",
|
||||
)
|
||||
],
|
||||
input_param=Datamodel("pms.ocr.input"),
|
||||
output_param=Datamodel("pms.ocr.checkin.result", is_list=False),
|
||||
auth="jwt_api_pms",
|
||||
)
|
||||
def process_ocr_document(self, input_param):
|
||||
pms_property = self.env['pms.property'].browse(input_param.pmsPropertyId)
|
||||
ocr_find_method_name = '_%s_document_process' % pms_property.ocr_checkin_supplier
|
||||
checkin_data_dict = hasattr(self, ocr_find_method_name)(
|
||||
input_param.imageBase64Front,
|
||||
input_param.imageBase64Back
|
||||
)
|
||||
PmsOcrCheckinResult = self.env.datamodels["pms.ocr.checkin.result"]
|
||||
|
||||
return PmsOcrCheckinResult(
|
||||
nationality=checkin_data_dict.get('nationality') or None,
|
||||
countryId=checkin_data_dict.get('country_id') or None,
|
||||
firstname=checkin_data_dict.get('firstname') or None,
|
||||
lastname=checkin_data_dict.get('lastname') or None,
|
||||
lastname2=checkin_data_dict.get('lastname2') or None,
|
||||
gender=checkin_data_dict.get('gender') or None,
|
||||
birthdate=checkin_data_dict.get('gender') or None,
|
||||
documentType=checkin_data_dict.get('document_type') or None,
|
||||
documentExpeditionDate=checkin_data_dict.get('document_expedition_date') or None,
|
||||
documentSupportNumber=checkin_data_dict.get('document_support_number') or None,
|
||||
documentNumber=checkin_data_dict.get('document_number') or None,
|
||||
residenceStreet=checkin_data_dict.get('residence_street') or None,
|
||||
residenceCity=checkin_data_dict.get('residence_city') or None,
|
||||
countryState=checkin_data_dict.get('country_state') or None,
|
||||
documentCountryId=checkin_data_dict.get('document_country_id') or None,
|
||||
zip=checkin_data_dict.get('zip') or None
|
||||
)
|
||||
|
||||
def process_nationality(
|
||||
self, nationality, nationality_code, nationality_code_numeric
|
||||
):
|
||||
country_id = False
|
||||
country = False
|
||||
if nationality_code_numeric and nationality_code_numeric.value != "":
|
||||
country = self.env["res.country"].search(
|
||||
[("code_numeric", "=", nationality_code_numeric.value)]
|
||||
)
|
||||
elif nationality_code and nationality_code.value != "":
|
||||
country = self.env["res.country"].search(
|
||||
[("code_alpha3", "=", nationality_code.value)]
|
||||
)
|
||||
elif nationality and nationality.value != "":
|
||||
country = self.env["res.country"].search([("name", "=", nationality.value)])
|
||||
|
||||
if country:
|
||||
country_id = country.id
|
||||
|
||||
return country_id
|
||||
|
||||
def process_address(
|
||||
self,
|
||||
id_country_spain,
|
||||
country_id,
|
||||
address_street,
|
||||
address_city,
|
||||
address_area,
|
||||
address,
|
||||
):
|
||||
res_address_street = False
|
||||
res_address_city = False
|
||||
res_address_area = False
|
||||
state = False
|
||||
if country_id == id_country_spain:
|
||||
if address_street and address_street.value != "":
|
||||
res_address_street = address_street.value
|
||||
if address_city and address_city.value != "":
|
||||
res_address_city = address_city.value
|
||||
if address_area and address_area.value != "":
|
||||
res_address_area = address_area.value
|
||||
if (
|
||||
address
|
||||
and address != ""
|
||||
and not (all([address_street, address_city, address_area]))
|
||||
):
|
||||
address = address.value.replace("^", " ")
|
||||
address_list = address.split(" ")
|
||||
if not res_address_area:
|
||||
res_address_area = address_list[-1]
|
||||
if not res_address_city:
|
||||
res_address_city = address_list[-2]
|
||||
if not res_address_street:
|
||||
res_address_street = address.replace(
|
||||
res_address_area, "", 1
|
||||
).replace(res_address_city, "", 1)
|
||||
if res_address_area:
|
||||
state = self.env["res.country.state"].search(
|
||||
[("name", "ilike", res_address_area)]
|
||||
)
|
||||
if state and len(state) == 1:
|
||||
state = state.id
|
||||
else:
|
||||
if address and address.value != "":
|
||||
res_address_street = address.value.replace("^", " ")
|
||||
return res_address_street, res_address_city, state
|
||||
|
||||
def process_name(
|
||||
self,
|
||||
id_country_spain,
|
||||
country_id,
|
||||
given_names,
|
||||
first_surname,
|
||||
second_surname,
|
||||
surname,
|
||||
surname_and_given_names,
|
||||
):
|
||||
firstname = False
|
||||
lastname = False
|
||||
lastname2 = False
|
||||
|
||||
if surname_and_given_names.value and surname_and_given_names.value != "":
|
||||
surname_and_given_names = surname_and_given_names.value.replace("^", " ")
|
||||
|
||||
if given_names and given_names.value != "":
|
||||
firstname = given_names.value
|
||||
|
||||
if first_surname and first_surname.value != "":
|
||||
lastname = first_surname.value
|
||||
|
||||
if second_surname and second_surname.value != "":
|
||||
lastname2 = second_surname.value
|
||||
|
||||
if country_id == id_country_spain and not (
|
||||
all([firstname, lastname, lastname2])
|
||||
):
|
||||
if surname and surname.value != "":
|
||||
lastname = lastname if lastname else surname.value.split(" ")[0]
|
||||
lastname2 = lastname2 if lastname2 else surname.value.split(" ")[1:][0]
|
||||
if (
|
||||
surname_and_given_names
|
||||
and surname_and_given_names != ""
|
||||
and not firstname
|
||||
):
|
||||
firstname = surname_and_given_names.replace(
|
||||
lastname, "", 1
|
||||
).replace(lastname2, "", 1)
|
||||
elif surname_and_given_names and surname_and_given_names != "":
|
||||
lastname = (
|
||||
lastname if lastname else surname_and_given_names.split(" ")[0]
|
||||
)
|
||||
lastname2 = (
|
||||
lastname2 if lastname2 else surname_and_given_names.split(" ")[1]
|
||||
)
|
||||
firstname = (
|
||||
firstname
|
||||
if firstname
|
||||
else surname_and_given_names.replace(lastname, "", 1).replace(
|
||||
lastname2, "", 1
|
||||
)
|
||||
)
|
||||
elif (
|
||||
country_id
|
||||
and country_id != id_country_spain
|
||||
and not (all([firstname, lastname]))
|
||||
):
|
||||
if surname and surname.value != "":
|
||||
lastname = lastname if lastname else surname.value
|
||||
if (
|
||||
surname_and_given_names
|
||||
and surname_and_given_names != ""
|
||||
and not firstname
|
||||
):
|
||||
firstname = surname_and_given_names.replace(lastname, "", 1)
|
||||
elif surname_and_given_names and surname_and_given_names != "":
|
||||
lastname = (
|
||||
lastname if lastname else surname_and_given_names.split(" ")[0]
|
||||
)
|
||||
firstname = (
|
||||
firstname
|
||||
if firstname
|
||||
else surname_and_given_names.replace(lastname, "", 1)
|
||||
)
|
||||
return firstname, lastname, lastname2
|
||||
|
||||
def calc_expedition_date(
|
||||
self, document_class_code, date_of_expiry, age, date_of_birth
|
||||
):
|
||||
result = False
|
||||
person_age = False
|
||||
if age and age.value != "":
|
||||
person_age = int(age.value)
|
||||
elif date_of_birth and date_of_birth.value != "":
|
||||
date_of_birth = datetime.strptime(
|
||||
date_of_birth.value.replace("-", "/"), "%Y/%m/%d"
|
||||
).date()
|
||||
person_age = relativedelta(date.today(), date_of_birth).years
|
||||
if date_of_expiry and date_of_expiry.value != "" and person_age:
|
||||
date_of_expiry = datetime.strptime(
|
||||
date_of_expiry.value.replace("-", "/"), "%Y/%m/%d"
|
||||
).date()
|
||||
if person_age < 30:
|
||||
result = date_of_expiry - relativedelta(years=5)
|
||||
elif (
|
||||
person_age >= 30
|
||||
and document_class_code
|
||||
and document_class_code.value == "P"
|
||||
):
|
||||
result = date_of_expiry - relativedelta(years=10)
|
||||
elif 30 <= person_age < 70:
|
||||
result = date_of_expiry - relativedelta(years=10)
|
||||
return result.isoformat() if result else False
|
||||
|
||||
def proccess_document_number(
|
||||
self,
|
||||
id_country_spain,
|
||||
country_id,
|
||||
document_class_code,
|
||||
document_number,
|
||||
personal_number,
|
||||
):
|
||||
res_support_number = False
|
||||
res_document_number = False
|
||||
if personal_number and personal_number.value != "":
|
||||
res_document_number = personal_number.value
|
||||
if document_number and document_number.value != "":
|
||||
res_support_number = document_number.value
|
||||
if (
|
||||
country_id == id_country_spain
|
||||
and document_class_code
|
||||
and document_class_code.value != "P"
|
||||
):
|
||||
return res_support_number, res_document_number
|
||||
else:
|
||||
return False, res_support_number
|
||||
@@ -62,6 +62,7 @@ class PmsPropertyService(Component):
|
||||
simpleInColor=prop.simple_in_color,
|
||||
simpleFutureColor=prop.simple_future_color,
|
||||
language=prop.lang,
|
||||
isUsedOCR=True if prop.ocr_checkin_supplier else False,
|
||||
hotelImageUrl=url_image_pms_api_rest(
|
||||
"pms.property", prop.id, "hotel_image_pms_api_rest"
|
||||
),
|
||||
@@ -104,6 +105,7 @@ class PmsPropertyService(Component):
|
||||
toAssignReservationColor=pms_property.to_assign_reservation_color,
|
||||
pendingPaymentReservationColor=pms_property.pending_payment_reservation_color,
|
||||
language=pms_property.lang,
|
||||
isUsedOCR=True if pms_property.ocr_checkin_supplier else False,
|
||||
)
|
||||
|
||||
return res
|
||||
|
||||
Reference in New Issue
Block a user