sbt-idp/cope2n-ai-fi/common/json2xml.py
2023-11-30 18:22:16 +07:00

196 lines
7.1 KiB
Python
Executable File

import xml.etree.ElementTree as ET
from datetime import datetime
ET.register_namespace('', "http://www.w3.org/2000/09/xmldsig#")
xml_template3 = """
<HDon>
<DLHDon>
<TTChung>
<PBan>None</PBan>
<THDon>None</THDon>
<KHMSHDon>None</KHMSHDon>
<KHHDon>None</KHHDon>
<SHDon>None</SHDon>
<NLap>None</NLap>
<DVTTe>None</DVTTe>
<TGia>None</TGia>
<HTTToan>None</HTTToan>
<MSTTCGP>None</MSTTCGP>
</TTChung>
<NDHDon>
<NBan>
<Ten>None</Ten>
<MST>None</MST>
<DChi>None</DChi>
<SDThoai>None</SDThoai>
</NBan>
<NMua>
<Ten>None</Ten>
<MST>None</MST>
<DChi>None</DChi>
<SDThoai>None</SDThoai>
<HVTNMHang>None</HVTNMHang>
</NMua>
<DSHHDVu>
<HHDVu>
<TChat>None</TChat>
<STT>None</STT>
<THHDVu>None</THHDVu>
<DVTinh>None</DVTinh>
<SLuong>None</SLuong>
<DGia>None</DGia>
<TLCKhau>None</TLCKhau>
<STCKhau>None</STCKhau>
<ThTien>None</ThTien>
<TSuat>None</TSuat>
</HHDVu>
</DSHHDVu>
<TToan>
<THTTLTSuat>
<LTSuat>
<TSuat>None</TSuat>
<ThTien>None</ThTien>
<TThue>None</TThue>
</LTSuat>
</THTTLTSuat>
<TgTCThue>None</TgTCThue>
<TgTThue>None</TgTThue>
<TTCKTMai>None</TTCKTMai>
<TgTTTBSo>None</TgTTTBSo>
<TgTTTBChu>None</TgTTTBChu>
</TToan>
</NDHDon>
</DLHDon>
<MCCQT Id="None">None</MCCQT>
<DLQRCode>None</DLQRCode>
</HDon>
"""
def replace_xml_values(xml_str, replacement_dict):
""" replace xml values
Args:
xml_str (_type_): _description_
replacement_dict (_type_): _description_
Returns:
_type_: _description_
"""
try:
root = ET.fromstring(xml_str)
for key, value in replacement_dict.items():
if not value:
continue
if key == "TToan":
ttoan_element = root.find(".//TToan")
tsuat_element = ttoan_element.find(".//TgTThue")
tthue_element = ttoan_element.find(".//TgTTTBSo")
tthuebchu_element = ttoan_element.find(".//TgTTTBChu")
if value["TgTThue"]:
tsuat_element.text = value["TgTThue"]
if value["TgTTTBSo"]:
tthue_element.text = value["TgTTTBSo"]
if value["TgTTTBChu"]:
tthuebchu_element.text = value["TgTTTBChu"]
elif key == "NMua":
nmua_element = root.find(".//NMua")
for key_ in ["DChi", "SDThoai", "MST", "Ten", "HVTNMHang"]:
if value.get(key_, None):
nmua_element_key = nmua_element.find(f".//{key_}")
nmua_element_key.text = value[key_]
elif key == "NBan":
nban_element = root.find(".//NBan")
for key_ in ["DChi", "SDThoai", "MST", "Ten"]:
if value.get(key_, None):
nban_element_key = nban_element.find(f".//{key_}")
nban_element_key.text = value[key_]
elif key == "HHDVu":
dshhdvu_element = root.find(".//DSHHDVu")
hhdvu_template = root.find(".//HHDVu")
if hhdvu_template is not None and dshhdvu_element is not None:
dshhdvu_element.remove(hhdvu_template) # Remove the template
for hhdvu_data in value:
hhdvu_element = ET.SubElement(dshhdvu_element, "HHDVu")
for h_key, h_value in hhdvu_data.items():
h_element = ET.SubElement(hhdvu_element, h_key)
h_element.text = h_value if h_value is not None else "None"
elif key == "NLap":
nlap_element = root.find(".//NLap")
if nlap_element is not None:
# Convert the date to yyyy-mm-dd format
try:
date_obj = datetime.strptime(value, "%d/%m/%Y")
formatted_date = date_obj.strftime("%Y-%m-%d")
nlap_element.text = formatted_date
except ValueError:
print(f"Invalid date format for {key}: {value}")
nlap_element.text = value
else:
element = root.find(f".//{key}")
if element is not None:
element.text = value
ET.register_namespace("", "http://www.w3.org/2000/09/xmldsig#")
return ET.tostring(root, encoding="unicode")
except ET.ParseError as e:
print(f"Error parsing XML: {e}")
return None
def convert_key_names(original_dict):
"""_summary_
Args:
original_dict (_type_): _description_
Returns:
_type_: _description_
"""
key_mapping = {
"table": "HHDVu",
"Mặt hàng": "THHDVu",
"Đơn vị tính": "DVTinh",
"Số lượng": "SLuong",
"Đơn giá": "DGia",
"Doanh số mua chưa có thuế": "ThTien",
"buyer_address_value": "NMua.DChi",
'buyer_company_name_value': 'NMua.Ten',
'buyer_personal_name_value': 'NMua.HVTNMHang',
'buyer_tax_code_value': 'NMua.MST',
'buyer_tel_value': 'NMua.SDThoai',
'seller_address_value': 'NBan.DChi',
'seller_company_name_value': 'NBan.Ten',
'seller_tax_code_value': 'NBan.MST',
'seller_tel_value': 'NBan.SDThoai',
'date_value': 'NLap',
'form_value': 'KHMSHDon',
'no_value': 'SHDon',
'serial_value': 'KHHDon',
'tax_amount_value': 'TToan.TgTThue',
'total_in_words_value': 'TToan.TgTTTBChu',
'total_value': 'TToan.TgTTTBSo'
}
converted_dict = {}
for key, value in original_dict.items():
new_key = key_mapping.get(key, key)
if "." in new_key:
parts = new_key.split(".")
current_dict = converted_dict
for i, part in enumerate(parts):
if i == len(parts) - 1:
current_dict[part] = value
else:
current_dict.setdefault(part, {})
current_dict = current_dict[part]
else:
if key == "table":
lconverted_table_values = []
for table_value in value:
converted_table_value = convert_key_names(table_value)
lconverted_table_values.append(converted_table_value)
converted_dict[new_key] = lconverted_table_values
else:
converted_dict[new_key] = value
return converted_dict