Skip to content

Commit 328e58d

Browse files
authored
Merge pull request #842 from OpenSPP/fix-scan-id-documents
[FIX] scan id
2 parents 6874ee5 + f20de02 commit 328e58d

2 files changed

Lines changed: 146 additions & 28 deletions

File tree

spp_scan_id_document/model/registrant.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import json
22
import logging
33

4-
from odoo import api, fields, models
4+
from odoo import _, api, fields, models
5+
from odoo.exceptions import UserError
56

67
_logger = logging.getLogger(__name__)
78

@@ -20,17 +21,78 @@ def scan_id_document_details_vals(self, details):
2021
if self.addl_name:
2122
name += f"{self.addl_name} "
2223

24+
gender = None
25+
26+
if details.get("gender"):
27+
details_gender = details.get("gender")
28+
gender = self.env["gender.type"].search(
29+
["|", ("code", "=", details_gender), ("value", "=", details_gender)], limit=1
30+
)
31+
32+
# If still not found, log a warning and raise an error
33+
if not gender:
34+
message = _("Gender '%s' not found. Please create the gender first.") % details_gender
35+
raise UserError(message)
36+
37+
document_type = None
38+
if details.get("document_type"):
39+
details_document_type = details.get("document_type")
40+
document_type = self.env["g2p.id.type"].search([("name", "=", details_document_type)], limit=1)
41+
if not document_type:
42+
message = (
43+
_("Document type '%s' not found. Please create the document type first.") % details_document_type
44+
)
45+
raise UserError(message)
46+
47+
document_number = details.get("document_number", None)
48+
document_expiry_date = details.get("expiry_date", None)
49+
if document_expiry_date:
50+
self._validate_scan_dates(document_expiry_date, "expiry_date")
51+
52+
birth_date = details.get("birth_date", None)
53+
if birth_date:
54+
self._validate_scan_dates(birth_date, "birth_date")
55+
2356
vals = {
2457
"family_name": details.get("family_name"),
2558
"given_name": details.get("given_name"),
2659
"name": name,
2760
"birthdate": details.get("birth_date"),
28-
"gender": details.get("gender"),
61+
"gender": gender.id if gender else False,
2962
"id_document_details": "",
3063
"birth_place": details.get("birth_place_city", None),
3164
}
65+
if document_type:
66+
vals.update(
67+
{
68+
"reg_ids": [
69+
(
70+
0,
71+
0,
72+
{
73+
"id_type": document_type.id,
74+
"value": document_number,
75+
"expiry_date": document_expiry_date,
76+
},
77+
)
78+
]
79+
}
80+
)
81+
3282
return vals
3383

84+
def _validate_scan_dates(self, scanned_date, field_name):
85+
if scanned_date:
86+
try:
87+
# Try to parse the date in YYYY-MM-DD format
88+
parsed_date = fields.Date.from_string(scanned_date)
89+
return parsed_date
90+
except ValueError as err:
91+
raise UserError(
92+
_("Invalid date format for %s: %s. Expected format is YYYY-MM-DD.") % (field_name, scanned_date)
93+
) from err
94+
return
95+
3496
@api.onchange("id_document_details")
3597
def on_scan_id_document_details(self):
3698
try:
@@ -42,6 +104,8 @@ def on_scan_id_document_details(self):
42104
vals.update({"image_1920": details["image"]})
43105

44106
self.update(vals)
107+
except UserError:
108+
raise
45109
except Exception as e:
46110
_logger.error(e)
47111

Lines changed: 80 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from odoo.exceptions import UserError
12
from odoo.tests.common import TransactionCase
23

34

@@ -21,17 +22,18 @@ def setUpClass(cls):
2122
}
2223
)
2324

24-
def test_on_scan_id_document_details_success(self):
25+
def test_01_on_scan_id_document_details(self):
2526
self.applicant.id_document_details = (
2627
"{"
2728
'"photo": "",'
2829
'"given_name": "Blue",'
2930
'"family_name": "Red",'
3031
'"birth_date": "1970-06-18",'
31-
'"document_type": "Passport",'
32+
'"document_type": "PassportTest",'
3233
'"document_number": "162401579884",'
33-
'"expiry_date": "06/18/2025",'
34+
'"expiry_date": "2025-10-10",'
3435
'"nationality": "Philippines",'
36+
'"gender": "MaleTest",'
3537
'"birth_place_city": "Caloocan",'
3638
'"image": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz'
3739
"AAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9"
@@ -45,19 +47,40 @@ def test_on_scan_id_document_details_success(self):
4547
"}"
4648
)
4749

50+
# Should raise a user error since gender type does not exist
51+
with self.assertRaises(UserError):
52+
self.applicant.on_scan_id_document_details()
53+
54+
# Create the gender type
55+
gender_type = self.env["gender.type"].search(
56+
["|", ("code", "=", "MaleTest"), ("value", "=", "MaleTest")], limit=1
57+
)
58+
if not gender_type:
59+
self.env["gender.type"].create({"code": "MaleTest", "value": "MaleTest"})
60+
61+
# Should still raise a user error since document type does not exist
62+
with self.assertRaises(UserError):
63+
self.applicant.on_scan_id_document_details()
64+
65+
# Create the document type
66+
doc_type = self.env["g2p.id.type"].search([("name", "=", "PassportTest")], limit=1)
67+
if not doc_type:
68+
self.env["g2p.id.type"].create({"name": "PassportTest"})
69+
70+
# Now it should work
4871
self.applicant.on_scan_id_document_details()
4972

5073
self.assertEqual(self.applicant.family_name, "Red")
5174
self.assertEqual(self.applicant.given_name, "Blue")
5275

53-
def test_on_scan_id_document_details_failure(self):
76+
def test_02_on_scan_id_document_details_failure(self):
5477
# Invalid JSON
5578
self.applicant.id_document_details = """{
5679
"photo": "",
5780
"given_name": "Blue",
5881
"family_name": "Red",
5982
"birth_date": "1970-06-18",
60-
"document_type": "Passport",
83+
"document_type": "PassportTest",
6184
"document_number": "162401579884",
6285
"expiry_date": "06/18/2025",
6386
"nationality": "Philippines",
@@ -69,35 +92,66 @@ def test_on_scan_id_document_details_failure(self):
6992
self.assertEqual(self.applicant.given_name, "Chin")
7093
self.assertEqual(self.applicant.id_document_details, "")
7194

72-
def test_scan_id_document_details_vals(self):
95+
def test_03_scan_id_document_details_vals(self):
7396
details = {
7497
"photo": "",
7598
"given_name": "Blue",
7699
"family_name": "Red",
77100
"birth_date": "1970-06-18",
78-
"gender": "Male",
79-
"document_type": "Passport",
101+
"gender": "MaleTest",
102+
"document_type": "PassportTest",
80103
"document_number": "162401579884",
81-
"expiry_date": "06/18/2025",
104+
"expiry_date": "2025-06-18",
82105
"nationality": "Philippines",
83106
"birth_place_city": "Caloocan",
84107
}
85-
108+
# create the gender type and document type
109+
gender_male = self.env["gender.type"].search([("code", "=", "MaleTest")], limit=1)
110+
if not gender_male:
111+
gender_male = self.env["gender.type"].create({"code": "MaleTest", "value": "MaleTest"})
112+
doc_type_passport = self.env["g2p.id.type"].search([("name", "=", "PassportTest")], limit=1)
113+
if not doc_type_passport:
114+
doc_type_passport = self.env["g2p.id.type"].create({"name": "PassportTest"})
86115
vals = self.applicant.scan_id_document_details_vals(details)
87116

88-
self.assertEqual(
89-
[
90-
details["family_name"],
91-
details["given_name"],
92-
details["birth_date"],
93-
details["gender"],
94-
details["birth_place_city"],
95-
],
96-
[
97-
vals.get("family_name"),
98-
vals.get("given_name"),
99-
vals.get("birthdate"),
100-
vals.get("gender"),
101-
vals.get("birth_place"),
102-
],
103-
)
117+
self.assertEqual(vals.get("family_name"), details["family_name"])
118+
self.assertEqual(vals.get("given_name"), details["given_name"])
119+
self.assertEqual(vals.get("birthdate"), details["birth_date"])
120+
self.assertEqual(vals.get("birth_place"), details["birth_place_city"])
121+
self.assertEqual(vals.get("gender"), gender_male.id)
122+
123+
self.assertIn("reg_ids", vals)
124+
self.assertEqual(len(vals["reg_ids"]), 1)
125+
126+
reg_id_command = vals["reg_ids"][0]
127+
self.assertEqual(reg_id_command[0], 0)
128+
self.assertEqual(reg_id_command[1], 0)
129+
130+
reg_id_vals = reg_id_command[2]
131+
self.assertEqual(reg_id_vals.get("id_type"), doc_type_passport.id)
132+
self.assertEqual(reg_id_vals.get("value"), details["document_number"])
133+
self.assertEqual(reg_id_vals.get("expiry_date"), details["expiry_date"])
134+
135+
def test_04_scan_id_document_details_vals_invalid_date(self):
136+
details = {
137+
"photo": "",
138+
"given_name": "Blue",
139+
"family_name": "Red",
140+
"birth_date": "1970-06-18",
141+
"gender": "MaleTest",
142+
"document_type": "PassportTest",
143+
"document_number": "162401579884",
144+
"expiry_date": "06/18/2025",
145+
"nationality": "Philippines",
146+
"birth_place_city": "Caloocan",
147+
}
148+
# create the gender type and document type
149+
gender_male = self.env["gender.type"].search([("code", "=", "Male")], limit=1)
150+
if not gender_male:
151+
gender_male = self.env["gender.type"].create({"code": "MaleTest", "value": "MaleTest"})
152+
doc_type_passport = self.env["g2p.id.type"].search([("name", "=", "PassportTest")], limit=1)
153+
if not doc_type_passport:
154+
doc_type_passport = self.env["g2p.id.type"].create({"name": "PassportTest"})
155+
156+
with self.assertRaises(UserError):
157+
self.applicant.scan_id_document_details_vals(details)

0 commit comments

Comments
 (0)