feat(e-invoicing): dispatch address (#28084)

diff --git a/erpnext/accounts/print_format/gst_e_invoice/gst_e_invoice.html b/erpnext/accounts/print_format/gst_e_invoice/gst_e_invoice.html
index 7643eca..e658049 100644
--- a/erpnext/accounts/print_format/gst_e_invoice/gst_e_invoice.html
+++ b/erpnext/accounts/print_format/gst_e_invoice/gst_e_invoice.html
@@ -68,7 +68,7 @@
 
 			{%- if einvoice.ShipDtls -%}
 				{%- set shipping = einvoice.ShipDtls -%}
-				<h5 style="margin-bottom: 5px;">Shipping</h5>
+				<h5 style="margin-bottom: 5px;">Shipped From</h5>
 				<p>{{ shipping.Gstin }}</p>
 				<p>{{ shipping.LglNm }}</p>
 				<p>{{ shipping.Addr1 }}</p>
@@ -86,6 +86,17 @@
 			{%- if buyer.Addr2 -%} <p>{{ buyer.Addr2 }}</p> {% endif %}
 			<p>{{ buyer.Loc }}</p>
 			<p>{{ frappe.db.get_value("Address", doc.customer_address, "gst_state") }} - {{ buyer.Pin }}</p>
+
+			{%- if einvoice.DispDtls -%}
+				{%- set dispatch = einvoice.DispDtls -%}
+				<h5 style="margin-bottom: 5px;">Dispatched From</h5>
+				{%- if dispatch.Gstin -%} <p>{{ dispatch.Gstin }}</p> {% endif %}
+				<p>{{ dispatch.LglNm }}</p>
+				<p>{{ dispatch.Addr1 }}</p>
+				{%- if dispatch.Addr2 -%} <p>{{ dispatch.Addr2 }}</p> {% endif %}
+				<p>{{ dispatch.Loc }}</p>
+				<p>{{ frappe.db.get_value("Address", doc.dispatch_address_name, "gst_state") }} - {{ dispatch.Pin }}</p>
+			{% endif %}
 		</div>
 	</div>
 	<div style="overflow-x: auto;">
diff --git a/erpnext/regional/india/e_invoice/einv_template.json b/erpnext/regional/india/e_invoice/einv_template.json
index 60f490d..c2a28f2 100644
--- a/erpnext/regional/india/e_invoice/einv_template.json
+++ b/erpnext/regional/india/e_invoice/einv_template.json
@@ -38,7 +38,7 @@
         "Pos": "{buyer_details.place_of_supply}"
     }},
     "DispDtls": {{
-        "Nm": "{dispatch_details.company_name}",
+        "Nm": "{dispatch_details.legal_name}",
         "Addr1": "{dispatch_details.address_line1}",
         "Addr2": "{dispatch_details.address_line2}",
         "Loc": "{dispatch_details.location}",
diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py
index 6cc54cb..6532cf8 100644
--- a/erpnext/regional/india/e_invoice/utils.py
+++ b/erpnext/regional/india/e_invoice/utils.py
@@ -123,8 +123,8 @@
 		invoice_date=invoice_date
 	))
 
-def validate_address_fields(address, is_shipping_address):
-	if ((not address.gstin and not is_shipping_address)
+def validate_address_fields(address, skip_gstin_validation):
+	if ((not address.gstin and not skip_gstin_validation)
 		or not address.city
 		or not address.pincode
 		or not address.address_title
@@ -136,10 +136,10 @@
 			title=_('Missing Address Fields')
 		)
 
-def get_party_details(address_name, is_shipping_address=False):
+def get_party_details(address_name, skip_gstin_validation=False):
 	addr = frappe.get_doc('Address', address_name)
 
-	validate_address_fields(addr, is_shipping_address)
+	validate_address_fields(addr, skip_gstin_validation)
 
 	if addr.gst_state_number == 97:
 		# according to einvoice standard
@@ -431,7 +431,11 @@
 		if invoice.gst_category == 'Overseas':
 			shipping_details = get_overseas_address_details(invoice.shipping_address_name)
 		else:
-			shipping_details = get_party_details(invoice.shipping_address_name, is_shipping_address=True)
+			shipping_details = get_party_details(invoice.shipping_address_name, skip_gstin_validation=True)
+
+	dispatch_details = frappe._dict({})
+	if invoice.dispatch_address_name:
+		dispatch_details = get_party_details(invoice.dispatch_address_name, skip_gstin_validation=True)
 
 	if invoice.is_pos and invoice.base_paid_amount:
 		payment_details = get_payment_details(invoice)
@@ -443,7 +447,7 @@
 		eway_bill_details = get_eway_bill_details(invoice)
 
 	# not yet implemented
-	dispatch_details = period_details = export_details = frappe._dict({})
+	period_details = export_details = frappe._dict({})
 
 	einvoice = schema.format(
 		transaction_details=transaction_details, doc_details=doc_details, dispatch_details=dispatch_details,