Customised Sales GST Invoice

Dear All,

I have managed to create customized sales GST invoice similar to tally format

@centaur helped me a lot with this customisation, thank you very much for you

I am posting the code which i have used it may be helpful for who looking similar kind

Thanks
Santhosh

<center><h3>TAX INVOICE</h3><center>
<table width=100% height=100% border=1>
   <tr>
       <td width=30% rowspan=3>
           <strong>{{ doc.company or "" }}</strong><br>
           {{ frappe.db.get_value("Company", doc.company, "registration_details") or "" }}
       </td>
       <td width=25%>
           Invoice No.<br>
           <b>{{ doc.name }}</b>
       </td>
       <td width=25%>
           Dated<br>
	   <b>{{ frappe.utils.formatdate(doc.posting_date) }}</b>
       </td>
   </tr>
       <td width=25%>
           Delivery Note<br>
	   <b>&nbsp;</b>
       </td>
       <td width=25%>
           Mode of Payment<br>
           <b>{{ doc.mode_of_payment or " " }}<b></b><br>
	   <b>&nbsp;</b>
       </td>
   </tr>
   <tr>
       <td width=25%>
           Supplier's Ref.<br>
	   <b>&nbsp;</b>
       </td>
       <td width=25%>
           Other Reference(s)<br>
	   <b>&nbsp;</b>
       </td>
   </tr>
   <tr>
       <td width=50% rowspan=4>
           <i>Customer</i><br>
           <strong>{{ doc.customer_name or "" }}</strong><br>
	   {{ doc.address_display or "" }}
       </td>
       <td width=25%>
           PO No.<br>
           <b>{{ doc.po_no or " " }}<b></b><br>
	   <b>&nbsp;</b>
       </td>
       <td width=25%>
           Dated<br>
           <b>{{ frappe.utils.formatdate(doc.po_date) }}</b>
	   <b>&nbsp;</b>
       </td>
   </tr>
   <tr>
       <td width=25%>
           Despatch Document No.<br>
	   <b>&nbsp;</b>
       </td>
       <td width=25%>
           Dated<br>
	   <b>&nbsp;</b>
       </td>
   </tr>
   <tr>
       <td width=25%>
           Mode of Transport<br>
           <b></b>{{ doc.mode_of_transport or " " }}<b></b><br>
	   <b>&nbsp;</b>
       </td>
       <td width=25%>
           Shipping Address<br>
           {{ doc.shipping_address_name or " " }}<br>
	   <b>&nbsp;</b>
       </td>
   </tr>
   <tr>
       <td width=25% height=25 colspan=2>
           Terms of Delivery<br>
            {{ doc.tc_name or " " }}<br>
	   <b>&nbsp;</b>
       </td>
   </tr>
</table>
<TABLE cellpadding=0 cellspacing=0 width=100% border=1>
<TR>
<tbody>
	<tr>
		<th>SR</th>
		<th>DISCRIPTION</th>
		<th>HSN/ASN</th>
		<th class="text-right">QTY</th>
		<th class="text-right">UNIT RATE</th>
		<th class="text-right">TAXABLE AMOUNT</th>
	</tr>
	{% set cgst_rate = [] -%}
	 {% set sgst_rate = [] -%}
	 {% set igst_rate = [] -%}
	{% set cgst_account_head = [] -%}
	 {% set sgst_account_head = [] -%}
	 {% set igst_account_head = [] -%}
	{% set tot_cgst_amount = [] %}
	{% set tot_sgst_amount = [] %}
	{% set grand_total = {"qty":0.0, "amount":0.0, "cgst_amt":0.0, "sgst_amt":0.0, "igst_amt":0.0} %}
	{%- for row in doc.taxes -%}
  	   {% if 'CGST' in row.account_head -%}
		{% set _ = cgst_account_head.append(row.account_head) %}
		{% set _ = cgst_rate.append(row.rate) %}
	   {%- endif -%}
	   {% if 'SGST' in row.account_head -%}
		 {% set _ = sgst_account_head.append(row.account_head) %}
		{% set _ = sgst_rate.append(row.rate) %}	
	   {%- endif -%}
	   {% if 'IGST' in row.account_head -%}
		{% set _ = igst_account_head.append(row.account_head) %}
		{% set _ = igst_rate.append(row.rate) %}
	   {%- endif -%}
	{%- endfor -%}
{%- for row in doc.items -%}
	<tr>
	        {% set cgst_amt = [] -%}
	 	 {% set sgst_amt = [] -%}
		 {% set igst_amt = [] -%}
		 {% set it_cgst_rate = [] -%}
	 	 {% set it_sgst_rate = [] -%}
		 {% set it_igst_rate = [] -%}
		 {% set rate_found_item = 0 -%}
	      {%- set item_record = frappe.get_doc("Item", row.item_code) -%}
		{% for item_tax in item_record.taxes %}
		  {% if item_tax.tax_type == igst_account_head[0] %}	
			{% set _ = it_igst_rate.append(item_tax.tax_rate) %}
			{% set _ = igst_amt.append(row.amount * it_igst_rate[0] / 100) -%}
			{% set rate_found_item = 1 -%}
		{% endif %}		
		{% if item_tax.tax_type == sgst_account_head[0] %}
			
			{% set _ = it_sgst_rate.append(item_tax.tax_rate) %}
			{% set _ = sgst_amt.append(row.amount * it_sgst_rate[0] / 100) -%}
			{% set rate_found_item = 1 -%}
		{% endif %}	
		{% if item_tax.tax_type == cgst_account_head[0] %}
			{% set _ = it_cgst_rate.append(item_tax.tax_rate) %}
			{% set _ = cgst_amt.append(row.amount * it_cgst_rate[0] / 100) -%}
			{% set rate_found_item = 1 -%}
		{% endif %}		
	{% endfor %}	
  	{% if rate_found_item == 0 %}

		{% if cgst_rate[0] -%}
		   {% set _ = cgst_amt.append((row.amount * cgst_rate[0])/100) -%}
		   {% set _= it_cgst_rate.append(cgst_rate[0]) -%}
		   {% set rate_found_inv = 1 -%}
	       	{%- endif -%}
		{% if sgst_rate[0] -%}
		   {% set _ = sgst_amt.append((row.amount * sgst_rate[0])/100) -%}
		   {% set _= it_sgst_rate.append(sgst_rate[0]) -%}
		   
	       	{%- endif -%}
		{% if igst_rate[0] -%}
		   {% set _ = igst_amt.append((row.amount * igst_rate[0])/100) -%}
		   {% set _= it_igst_rate.append(igst_rate[0]) -%}
		   {% set rate_found_inv = 1 -%}
	       	{%- endif -%}
	{% endif %}
	{% if not it_cgst_rate[0] %}
		{% set _ = it_cgst_rate.append(0) %}
		{% set _ = cgst_amt.append(0) %}
	{% endif %}
	{% if not it_sgst_rate[0] %}
		{% set _ = it_sgst_rate.append(0) %}
		{% set _ = sgst_amt.append(0) %}
	{% endif %}
	{% if not it_igst_rate[0] %}
		{% set _ = it_igst_rate.append(0) %}
		{% set _ = igst_amt.append(0) %}
	{% endif %}
	{% set temp_cgst_amt = grand_total["cgst_amt"] + cgst_amt[0] %}
	{% set temp_sgst_amt = grand_total["sgst_amt"] + sgst_amt[0] %}
	{% set temp_igst_amt = grand_total["igst_amt"] + igst_amt[0] %}
	{% set temp_qty = grand_total["qty"] + row.qty %}
	{% set temp_amount = grand_total["amount"] + row.amount %}
	{% set check = grand_total.update({"qty": temp_qty, "amount": temp_amount, "cgst_amt":temp_cgst_amt, "sgst_amt":temp_sgst_amt, "igst_amt":temp_igst_amt}) %}
	
		<td style="width: 5%;"><font size = "1">{{ row.idx }}</font></td>
		<td style="width: 25%;"><font size = "1">
			{% if row.item_code != row.item_name -%}
			<b>{{ row.item_code}}</b><br>
			{%- endif %}
                            {{ row.item_name }}
		</font></td>
		<td style="width: 10%;"><font size = "1">{{ row.gst_hsn_code }}</font></td>
		<td style="width: 10%; text-align: left;"><font size = "1">{{ row.qty }}<br><small>{{ row.uom or row.stock_uom }}</small> </font></td>
		<td style="width: 10%; text-align: right;"><font size = "1">{{
			row.get_formatted("rate", doc) }}</font></td>
		<td style=display:none;"width: 11%; text-align: right;"><font size = "1">{{
			"₹ {:,.2f}".format(cgst_amt[0])  }}<br><small>{{
			it_cgst_rate[0] }}%</small></font></td>
		<td style=display:none;"width: 11%; text-align: right;"><font size = "1">{{
			"₹ {:,.2f}".format(sgst_amt[0])  }}<br><small>{{
			it_sgst_rate[0] }}%</small></font></td>
		<td style=display:none;"width: 11%; text-align: right;"><font size = "1">{{
			"₹ {:,.2f}".format(igst_amt[0])  }}<br><small>{{
			it_igst_rate[0] }}%</small></font></td>
		<td style="width: 11%; text-align: right;"><font size = "1">{{
			row.get_formatted("amount", doc) }}</font></td>
</tr>
{% set trate = "" %}
{% endfor %}

<!-- {% set loop = 10 - doc.items|length  %}
{% for i in range(loop) %}
<TR>
	<TD>&nbsp;</TD>
	<TD>&nbsp;</TD>
	<TD>&nbsp;</TD>
	<TD>&nbsp;</TD>
	<TD>&nbsp;</TD>
</TR>
{% endfor %} -->
</TABLE>

<TABLE cellpadding=0 cellspacing=0 width=100% border=1>
<TR>
        <TD rowspan=3 >
            Amount in Words<br>
            <B>{{ doc.base_in_words }}</B>
        </TD>
	<TD WIDTH=13% align=right><B>SUB TOTAL</B></TD>
	<TD WIDTH=20% align=right><B>{{ doc.get_formatted("total", doc) }}</B></TD>
<TR>
    

    <TD align=right><B>CGST - 9%</B></TD>
    <TD WIDTH=20% align=right><B>{{ "₹ {:,.2f}".format(grand_total["cgst_amt"])  }}</B></TD>

</TR>

<TR>

    <TD align=right><B>SGST - 9%</B></TD>
    <TD WIDTH=20% align=right><B>{{ "₹ {:,.2f}".format(grand_total["sgst_amt"])  }}</B></TD>

</TR>

<TR>

	<TD WIDTH=60% align=right><B><TD align=right><B>TOTAL</B></TD>
	<TD WIDTH=60% align=right><B>{{ doc.get_formatted("grand_total", doc) }}</B></TD>
</TR>
<TR>
	<TD colspan=2 height=120>{{ doc.remarks }}</B></TD>
	<TD align=right colspan=3>
            <B>for {{ doc.company }}</B>
            <div style="position: relative; height: 100px; border: solid; border-style: none;">
               <div style="position: absolute; height: 10px; border: solid; bottom: 0; right: 0;  left: 0; border-style: none;">
                  Authorised Signatory
               </div>
            </div>
        </TD>![sample-santhosh_page-0001|353x500](upload://gPzfoM72tK3HPw2a6kv7kWCawTB.jpeg) 
</TR>
</TABLE>![sample-santhosh_page-0001|353x500](upload://gPzfoM72tK3HPw2a6kv7kWCawTB.jpeg)
1 Like

You need to change the below

<td style=display:none;"width: 11%; text-align: right;">

to

<td style="display:none;">

1 Like

@Santhosh_Aerotek

Which query are you using to get data populated in this custom print format?

Regards,