mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-24 23:49:19 +00:00
Merge branch 'version-13-pre-release' into version-13
This commit is contained in:
@@ -7,7 +7,7 @@ import frappe
|
|||||||
|
|
||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
|
|
||||||
__version__ = '13.15.1'
|
__version__ = '13.15.2'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@@ -257,20 +257,18 @@ doc_events = {
|
|||||||
"validate": "erpnext.regional.india.utils.validate_tax_category"
|
"validate": "erpnext.regional.india.utils.validate_tax_category"
|
||||||
},
|
},
|
||||||
"Sales Invoice": {
|
"Sales Invoice": {
|
||||||
"after_insert": "erpnext.regional.saudi_arabia.utils.create_qr_code",
|
|
||||||
"on_submit": [
|
"on_submit": [
|
||||||
"erpnext.regional.create_transaction_log",
|
"erpnext.regional.create_transaction_log",
|
||||||
"erpnext.regional.italy.utils.sales_invoice_on_submit",
|
"erpnext.regional.italy.utils.sales_invoice_on_submit",
|
||||||
|
"erpnext.regional.saudi_arabia.utils.create_qr_code",
|
||||||
"erpnext.erpnext_integrations.taxjar_integration.create_transaction"
|
"erpnext.erpnext_integrations.taxjar_integration.create_transaction"
|
||||||
],
|
],
|
||||||
"on_cancel": [
|
"on_cancel": [
|
||||||
"erpnext.regional.italy.utils.sales_invoice_on_cancel",
|
"erpnext.regional.italy.utils.sales_invoice_on_cancel",
|
||||||
"erpnext.erpnext_integrations.taxjar_integration.delete_transaction"
|
"erpnext.erpnext_integrations.taxjar_integration.delete_transaction",
|
||||||
],
|
|
||||||
"on_trash": [
|
|
||||||
"erpnext.regional.check_deletion_permission",
|
|
||||||
"erpnext.regional.saudi_arabia.utils.delete_qr_code_file"
|
"erpnext.regional.saudi_arabia.utils.delete_qr_code_file"
|
||||||
],
|
],
|
||||||
|
"on_trash": "erpnext.regional.check_deletion_permission",
|
||||||
"validate": [
|
"validate": [
|
||||||
"erpnext.regional.india.utils.validate_document_name",
|
"erpnext.regional.india.utils.validate_document_name",
|
||||||
"erpnext.regional.india.utils.update_taxable_values"
|
"erpnext.regional.india.utils.update_taxable_values"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,10 @@
|
|||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
|
from base64 import b64encode
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from frappe.utils.data import add_to_date, get_time, getdate
|
||||||
from pyqrcode import create as qr_create
|
from pyqrcode import create as qr_create
|
||||||
|
|
||||||
from erpnext import get_region
|
from erpnext import get_region
|
||||||
@@ -28,24 +31,74 @@ def create_qr_code(doc, method):
|
|||||||
|
|
||||||
for field in meta.get_image_fields():
|
for field in meta.get_image_fields():
|
||||||
if field.fieldname == 'qr_code':
|
if field.fieldname == 'qr_code':
|
||||||
from urllib.parse import urlencode
|
''' TLV conversion for
|
||||||
|
1. Seller's Name
|
||||||
|
2. VAT Number
|
||||||
|
3. Time Stamp
|
||||||
|
4. Invoice Amount
|
||||||
|
5. VAT Amount
|
||||||
|
'''
|
||||||
|
tlv_array = []
|
||||||
|
# Sellers Name
|
||||||
|
|
||||||
# Creating public url to print format
|
seller_name = frappe.db.get_value(
|
||||||
default_print_format = frappe.db.get_value('Property Setter', dict(property='default_print_format', doc_type=doc.doctype), "value")
|
'Company',
|
||||||
|
doc.company,
|
||||||
|
'company_name_in_arabic')
|
||||||
|
|
||||||
# System Language
|
if not seller_name:
|
||||||
language = frappe.get_system_settings('language')
|
frappe.throw(_('Arabic name missing for {} in the company document').format(doc.company))
|
||||||
|
|
||||||
params = urlencode({
|
tag = bytes([1]).hex()
|
||||||
'format': default_print_format or 'Standard',
|
length = bytes([len(seller_name.encode('utf-8'))]).hex()
|
||||||
'_lang': language,
|
value = seller_name.encode('utf-8').hex()
|
||||||
'key': doc.get_signature()
|
tlv_array.append(''.join([tag, length, value]))
|
||||||
})
|
|
||||||
|
# VAT Number
|
||||||
|
tax_id = frappe.db.get_value('Company', doc.company, 'tax_id')
|
||||||
|
if not tax_id:
|
||||||
|
frappe.throw(_('Tax ID missing for {} in the company document').format(doc.company))
|
||||||
|
|
||||||
|
tag = bytes([2]).hex()
|
||||||
|
length = bytes([len(tax_id)]).hex()
|
||||||
|
value = tax_id.encode('utf-8').hex()
|
||||||
|
tlv_array.append(''.join([tag, length, value]))
|
||||||
|
|
||||||
|
# Time Stamp
|
||||||
|
posting_date = getdate(doc.posting_date)
|
||||||
|
time = get_time(doc.posting_time)
|
||||||
|
seconds = time.hour * 60 * 60 + time.minute * 60 + time.second
|
||||||
|
time_stamp = add_to_date(posting_date, seconds=seconds)
|
||||||
|
time_stamp = time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
|
||||||
|
tag = bytes([3]).hex()
|
||||||
|
length = bytes([len(time_stamp)]).hex()
|
||||||
|
value = time_stamp.encode('utf-8').hex()
|
||||||
|
tlv_array.append(''.join([tag, length, value]))
|
||||||
|
|
||||||
|
# Invoice Amount
|
||||||
|
invoice_amount = str(doc.total)
|
||||||
|
tag = bytes([4]).hex()
|
||||||
|
length = bytes([len(invoice_amount)]).hex()
|
||||||
|
value = invoice_amount.encode('utf-8').hex()
|
||||||
|
tlv_array.append(''.join([tag, length, value]))
|
||||||
|
|
||||||
|
# VAT Amount
|
||||||
|
vat_amount = str(doc.total_taxes_and_charges)
|
||||||
|
|
||||||
|
tag = bytes([5]).hex()
|
||||||
|
length = bytes([len(vat_amount)]).hex()
|
||||||
|
value = vat_amount.encode('utf-8').hex()
|
||||||
|
tlv_array.append(''.join([tag, length, value]))
|
||||||
|
|
||||||
|
# Joining bytes into one
|
||||||
|
tlv_buff = ''.join(tlv_array)
|
||||||
|
|
||||||
|
# base64 conversion for QR Code
|
||||||
|
base64_string = b64encode(bytes.fromhex(tlv_buff)).decode()
|
||||||
|
|
||||||
# creating qr code for the url
|
|
||||||
url = f"{ frappe.utils.get_url() }/{ doc.doctype }/{ doc.name }?{ params }"
|
|
||||||
qr_image = io.BytesIO()
|
qr_image = io.BytesIO()
|
||||||
url = qr_create(url, error='L')
|
url = qr_create(base64_string, error='L')
|
||||||
url.png(qr_image, scale=2, quiet_zone=1)
|
url.png(qr_image, scale=2, quiet_zone=1)
|
||||||
|
|
||||||
# making file
|
# making file
|
||||||
|
|||||||
Reference in New Issue
Block a user