Skip to content

Commit 0b9d717

Browse files
committed
ADDED: business logic complete with user report. waiting for last corrections.
1 parent 8e423f1 commit 0b9d717

11 files changed

Lines changed: 380 additions & 168 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,6 @@ cython_debug/
175175

176176
# own rules
177177
*.zip
178-
output.zip
178+
output.zip
179+
demo
180+
demo/

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
pypdf
2-
PyPDF2 # This does not work for extracting text in some cases
3-
pandas
1+
pypdf~=5.5.0
2+
PyPDF2~=3.0.1
3+
pandas~=2.0.3
44
openpyxl
55
PyCryptodome
66
Office365-REST-Python-Client
7-
pyfiglet
7+
pyfiglet~=0.8.post1

src/arguments.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
def get_compact_init():
12-
return {DocType.SALARY: False, DocType.PROOFS: False, DocType.CONTRACT: False, DocType.RNT: False}
12+
return {DocType.SALARY: False, DocType.PROOFS: False, DocType.CONTRACT: False, DocType.RNT: False, DocType.RLC: False}
1313

1414

1515
def parse_date(value, formatting="%Y_%m"):
@@ -62,9 +62,10 @@ def parse_arguments(valid_nafs):
6262
parser.add_argument("-e", "--end", type=parse_date, required=True, help="End date (YYYY-MM)")
6363
parser.add_argument("-a", "--author", type=parse_author, required=True, help="author's email doing request")
6464

65-
parser.add_argument("-c", "--compact", type=parse_compact, required=False, default=get_compact_init(), help="Comma separated list of values "
66-
"that indicate "
67-
"which documents need to be merged in one signle PDF in the output. Possible values are: " + ",".join([dt.value.__str__() for dt in DocType]))
65+
parser.add_argument("-c", "--compact", type=parse_compact, required=False, default=get_compact_init(),
66+
help="Comma separated list of values that indicate which documents need to be merged in one "
67+
"single PDF in the output. Possible values are: " +
68+
",".join([dt.value.__str__() for dt in DocType]))
6869

6970
args = parser.parse_args()
7071

src/data.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,22 @@
33
'''
44
import os
55
from datetime import datetime
6-
from typing import Dict, Tuple
6+
from typing import Dict, Tuple, List
77

88
from defines import SalaryType
99
import logger
1010

1111

12-
def get_monthly_result_structure(begin: datetime, end: datetime) -> Dict[str, Tuple[bool, bool, bool]]:
12+
def get_rlc_monthly_result_structure(begin: datetime, end: datetime, result_structure=None) -> Dict[str, List[bool]]:
1313
result = {}
1414
current = datetime(begin.year, begin.month, 1)
1515

1616
while current <= end:
1717
key = datetime.strptime(str(current.year * 100 + current.month), "%Y%m")
18-
result[key] = [False, False, False] # Monthly salary found, RLC L00N found, RLC L00P found
18+
if result_structure is None:
19+
result[key] = [False, False, False]
20+
else:
21+
result[key] = result_structure # Monthly salary found, RLC L00N found, RLC L00P found
1922
# Move to next month
2023
if current.month == 12:
2124
current = datetime(current.year + 1, 1, 1)
@@ -25,8 +28,10 @@ def get_monthly_result_structure(begin: datetime, end: datetime) -> Dict[str, Tu
2528
return result
2629

2730

31+
32+
2833
def parse_salary_type(salary_file_path):
29-
custom_logger = logger.get_process_logger(logger.base_logger, "Salaries and RLCs")
34+
custom_logger = logger.get_process_logger(logger.get_logger_instance(), "Salaries and RLCs")
3035
parsed = salary_file_path[::-1].split("/")[0][::-1].split(".")[0].split("_")[1]
3136
custom_logger.debug("Data parsed from filename is: " + parsed)
3237
t = SalaryType(parsed)

src/defines.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,15 @@ class DocType(Enum):
3737
RNT = "RNT"
3838
PROOFS = "proofs"
3939

40-
4140
def from_string(value: str):
4241
_aliases = {
4342
DocType.SALARY: {"salary", "salaries", "SALARY", "Salary", "payslip"},
4443
DocType.CONTRACT: {"contract", "CONTRACT", "Contract", "agreement"},
4544
DocType.RLC: {"RLC", "rlc", "R.L.C."},
4645
DocType.RNT: {"RNT", "rnt", "R.N.T."},
46+
DocType.PROOFS: {"proof", "bankproof", "proofs", "bankproofs"}
4747
}
4848
for doctype in _aliases:
49-
print("value is " + value.__str__())
50-
5149
if value.strip() in _aliases[doctype]:
5250
return doctype
5351
raise ValueError(f"Unknown document type: {value}")

src/filesystem.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def compute_paths(args):
6060

6161
USER_REPORT_FILE = os.path.join(CURRENT_JUSTIFICATION_FOLDER, NOW + "_" +
6262
args.naf.__str__()
63-
+ "_" + NAF_TO_NAME[args.naf] + "_" +
63+
+ "_" + NAF_TO_NAME[args.naf].replace(" ", "_") + "_" +
6464
args.begin.strftime("%Y-%m") + "-" + args.end.strftime("%Y-%m") + ".log.txt")
6565
return CURRENT_USER_FOLDER, CURRENT_JUSTIFICATION_FOLDER, USER_REPORT_FILE, ADMIN_LOG_PATH, SUPERVISOR_LOG_PATH
6666

src/logger.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,86 +21,90 @@ def format(self, record):
2121
return f"{color}{message}{RESET_CODE}"
2222

2323

24-
def get_logger(user_report_file, admin_log_file, supervisor_log_file, name="justicier", debug_mode=False):
24+
def get_raw_logger(user_report_file, admin_log_file, supervisor_log_file, name="raw", debug_mode=False):
2525
logger = logging.getLogger(name)
2626
logger.setLevel(logging.DEBUG)
2727

2828
if logger.handlers:
2929
return logger # Prevent re-adding handlers
3030

31-
# Formatters
32-
plain_formatter = logging.Formatter('%(asctime)s - %(process_name)s - %(levelname)s - %(message)s')
33-
color_formatter = ColorFormatter('%(asctime)s - %(process_name)s - %(levelname)s - %(message)s')
34-
3531
# User log (INFO+)
3632
user_handler = logging.FileHandler(user_report_file)
3733
user_handler.setLevel(logging.INFO)
38-
user_handler.setFormatter(plain_formatter)
34+
user_handler.setFormatter(None)
3935

4036
# Admin/system log (DEBUG+ if debug_mode, else ERROR+)
4137
admin_handler = logging.FileHandler(admin_log_file)
4238
admin_handler.setLevel(logging.DEBUG if debug_mode else logging.ERROR)
43-
admin_handler.setFormatter(plain_formatter)
39+
admin_handler.setFormatter(None)
4440

4541
# Console log (DEBUG+ if debug_mode, else WARNING+), with colors
4642
console_handler = logging.StreamHandler(sys.stdout)
4743
console_handler.setLevel(logging.DEBUG if debug_mode else logging.WARNING)
48-
console_handler.setFormatter(color_formatter)
44+
console_handler.setFormatter(None)
4945

5046
# Supervisor log
5147
supervisor_handler = logging.FileHandler(supervisor_log_file)
5248
supervisor_handler.setLevel(logging.INFO)
53-
supervisor_handler.setFormatter(color_formatter)
49+
supervisor_handler.setFormatter(None)
5450

5551
for handler in [user_handler, admin_handler, console_handler, supervisor_handler]:
5652
logger.addHandler(handler)
5753

5854
return logger
5955

6056

61-
def get_raw_logger(user_report_file, admin_log_file, supervisor_log_file, name="raw", debug_mode=False):
57+
def unformatted_logger(logger):
58+
for h in logger.handlers:
59+
h.setFormatter(None)
60+
return logger
61+
62+
63+
def get_logger_instance():
64+
return base_logger
65+
66+
67+
def get_process_logger(base_logger, process_name):
68+
return logging.LoggerAdapter(base_logger, {'process_name': process_name})
69+
70+
71+
def get_logger(user_report_file, admin_log_file, supervisor_log_file, name="justicier", debug_mode=False):
6272
logger = logging.getLogger(name)
6373
logger.setLevel(logging.DEBUG)
6474

6575
if logger.handlers:
6676
return logger # Prevent re-adding handlers
6777

78+
# Formatters
79+
plain_formatter = logging.Formatter('%(asctime)s - %(process_name)s - %(levelname)s - %(message)s')
80+
color_formatter = ColorFormatter('%(asctime)s - %(process_name)s - %(levelname)s - %(message)s')
81+
6882
# User log (INFO+)
6983
user_handler = logging.FileHandler(user_report_file)
7084
user_handler.setLevel(logging.INFO)
71-
user_handler.setFormatter(None)
85+
user_handler.setFormatter(plain_formatter)
7286

7387
# Admin/system log (DEBUG+ if debug_mode, else ERROR+)
7488
admin_handler = logging.FileHandler(admin_log_file)
7589
admin_handler.setLevel(logging.DEBUG if debug_mode else logging.ERROR)
76-
admin_handler.setFormatter(None)
90+
admin_handler.setFormatter(plain_formatter)
7791

7892
# Console log (DEBUG+ if debug_mode, else WARNING+), with colors
7993
console_handler = logging.StreamHandler(sys.stdout)
8094
console_handler.setLevel(logging.DEBUG if debug_mode else logging.WARNING)
81-
console_handler.setFormatter(None)
95+
console_handler.setFormatter(color_formatter)
8296

8397
# Supervisor log
8498
supervisor_handler = logging.FileHandler(supervisor_log_file)
8599
supervisor_handler.setLevel(logging.INFO)
86-
supervisor_handler.setFormatter(None)
100+
supervisor_handler.setFormatter(color_formatter)
87101

88102
for handler in [user_handler, admin_handler, console_handler, supervisor_handler]:
89103
logger.addHandler(handler)
90104

91105
return logger
92106

93107

94-
def get_process_logger(base_logger, process_name):
95-
return logging.LoggerAdapter(base_logger, {'process_name': process_name})
96-
97-
98-
def unformatted_logger(logger):
99-
for h in logger.handlers:
100-
h.setFormatter(None)
101-
return logger
102-
103-
104108
def set_logger(logger_instance):
105109
global base_logger
106110
base_logger = logger_instance

0 commit comments

Comments
 (0)