Skip to content

Commit fc4a99a

Browse files
authored
Merge pull request #1 from redocmx/feat/addenda
Feat/addenda
2 parents c946002 + e401b5a commit fc4a99a

File tree

5 files changed

+76
-30
lines changed

5 files changed

+76
-30
lines changed

redocmx/addenda.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from .file import File
2+
3+
class Addenda(File):
4+
def __init__(self):
5+
super().__init__()
6+
7+
def replace_values(self, content, options=None):
8+
if not options:
9+
return content
10+
11+
for key, value in options.items():
12+
content = content.replace(key, value)
13+
14+
return content
15+
16+
def get_file_content(self, replace_values):
17+
file = self.get_file()
18+
file_content = file['content']
19+
20+
return self.replace_values(file_content, replace_values)

redocmx/cfdi.py

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,42 @@
11
from .pdf import Pdf
22
from .service import Service
3-
from pathlib import Path
3+
from .file import File
4+
from .addenda import Addenda
45

5-
class Cfdi:
6+
class Cfdi(File):
67
def __init__(self):
8+
super().__init__()
79
self.pdf = None
810
self.addenda = None
9-
self.file_path = None
10-
self.file_content = None
11+
self.addenda_replace_values = None
1112
self.service = Service.get_instance()
1213

13-
def from_file(self, file_path):
14-
self.file_path = file_path
15-
return self
14+
def set_addenda(self, addenda, replace_values=None):
15+
if addenda and not isinstance(addenda, Addenda):
16+
raise TypeError('addenda must be an instance of Addenda.')
17+
if replace_values and not isinstance(replace_values, dict):
18+
raise TypeError('Addenda replace values must be a valid key-value object.')
1619

17-
def from_string(self, file_content):
18-
self.file_content = file_content
19-
return self
20+
self.addenda = addenda
21+
self.addenda_replace_values = replace_values
2022

2123
def to_pdf(self, payload={}):
2224
if self.pdf:
2325
return self.pdf
26+
27+
if not isinstance(payload, dict):
28+
raise TypeError('toPdf function only accepts an object as a parameter.')
2429

25-
file_content = self._get_xml_content()
26-
payload['format'] = 'pdf'
30+
file = self.get_file()
2731

2832
if self.addenda:
29-
payload['addenda'] = self.addenda
33+
addenda_content = self.addenda.get_file_content(self.addenda_replace_values)
34+
payload['addenda'] = addenda_content
3035

31-
result = self.service.cfdis_convert(file_content, payload)
36+
payload['format'] = 'pdf'
37+
38+
result = self.service.cfdis_convert(file['content'], payload)
3239
self.pdf = Pdf(result)
3340

3441
return self.pdf
3542

36-
def _get_xml_content(self):
37-
if self.file_content:
38-
return self.file_content
39-
elif self.file_path:
40-
path = Path(self.file_path)
41-
if not path.exists() or not path.is_file():
42-
raise FileNotFoundError(f"Failed to read XML content from file: {self.file_path}. The file does not exist.")
43-
return path.read_text()
44-
else:
45-
raise ValueError("XML content for the CFDI must be provided.")
46-
47-
def set_addenda(self, addenda):
48-
if not isinstance(addenda, str):
49-
raise TypeError("setAddenda function only accepts a string parameter.")
50-
self.addenda = addenda

redocmx/file.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from pathlib import Path
2+
3+
class File:
4+
def __init__(self):
5+
self.file_path = None
6+
self.file_content = None
7+
8+
def from_file(self, file_path):
9+
self.file_path = file_path
10+
return self
11+
12+
def from_string(self, file_content):
13+
self.file_content = file_content
14+
return self
15+
16+
def get_file(self):
17+
if self.file_content:
18+
return { 'content': self.file_content }
19+
20+
elif self.file_path:
21+
path = Path(self.file_path)
22+
if not path.exists() or not path.is_file():
23+
raise FileNotFoundError(f"Failed to read XML content from file: {self.file_path}. The file does not exist.")
24+
25+
self.file_content = path.read_text()
26+
return { 'content': self.file_content }
27+
else:
28+
raise ValueError(f"Failed to load file {self.__class__.__name__}, you must use from_file or from_string.")
29+

redocmx/redoc.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .service import Service
22
from .cfdi import Cfdi
3+
from .addenda import Addenda
34

45
class RedocmxClient:
56
def __init__(self, api_key=None):
@@ -9,3 +10,7 @@ def __init__(self, api_key=None):
910
@property
1011
def cfdi(self):
1112
return Cfdi()
13+
14+
@property
15+
def addenda(self):
16+
return Addenda()

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='redocmx',
5-
version='0.0.1',
5+
version='0.0.2',
66
author='redoc.mx',
77
author_email='soporte@redoc.mx',
88
packages=find_packages(),

0 commit comments

Comments
 (0)