{% extends "ui/templates/base/layout.html" %} {% block content %}

GST Return Reconciliation

Download GST returns through the lightweight operator agent, store them in the configured client local storage, and reconcile against Accounting Mirror.

Back to Accounting
{% if message %}
{{ message }}
{% endif %} {% if error %}
{{ error }}
{% endif %}
{% if selected_client and selected_registration %}

1. Automatic GST Download

The lightweight GST Operator Agent runs only on this workstation. It opens visible Chrome/Edge, autofills the selected Credential Vault username/password, and waits for you to complete CAPTCHA/OTP. It does not run Tally or hold the client storage.

GST Operator Agent: Windows protocol launcher v{{ operator_agent_version }} Download / Clean Install Agent

No browser-to-localhost connection is required. When you start a GST download, Windows opens the installed agent through arrrgst://. Chrome/Edge may ask once for permission to open the ARRR GST Operator Agent.

{% if credentials|length==1 %}

The only eligible GST Portal credential has been selected automatically.

{% endif %}
Returns to download
Configured Storage Agent: {{ 'Online' if node_online else 'Offline' }}

For Full Financial Year, the job processes April through March and reports progress month by month. The custom protocol contains only a short-lived signed job token. GST username/password are redeemed directly by the agent and are never placed in this page's HTML or protocol URL.

2. Manual Import Fallback

If a GST portal download cannot be automated, keep the workflow moving by importing the portal JSON/ZIP files. They use the same client GST storage hierarchy and the same reconciliation engine.

3. Reconcile Stored Data

Sales: Accounting Mirror vs GSTR-1. Purchases: Accounting Mirror vs GSTR-2B. ITC: GSTR-2B vs GSTR-3B. Analysis reads only stored client data, so download and reconciliation remain independent.

{% set a=request.session.get('gst_reconciliation_result') or {} %} {% if a %} {% set s=a.get('sales_reconciliation',{}).get('counts',{}) %}{% set p=a.get('purchase_reconciliation',{}).get('counts',{}) %}

Reconciliation Summary — {{ a.get('period','') }}

Sales vs GSTR-1

Books {{ s.get('books',0) }} · Portal {{ s.get('portal',0) }} · Matched {{ s.get('matched',0) }} · Missing in portal {{ s.get('missing_in_portal',0) }} · Missing in books {{ s.get('missing_in_books',0) }} · Value mismatch {{ s.get('value_mismatch',0) }}

Purchases vs GSTR-2B

Books {{ p.get('books',0) }} · 2B {{ p.get('portal',0) }} · Matched {{ p.get('matched',0) }} · Missing in 2B {{ p.get('missing_in_portal',0) }} · Missing in books {{ p.get('missing_in_books',0) }} · Value mismatch {{ p.get('value_mismatch',0) }}

ITC: GSTR-2B vs GSTR-3B

{% for tax,row in a.get('itc_reconciliation',{}).items() %}{% endfor %}
TaxGSTR-2BGSTR-3BDifference
{{ tax }}{{ '%.2f'|format(row.get('gstr2b',0)) }}{{ '%.2f'|format(row.get('gstr3b',0)) }}{{ '%.2f'|format(row.get('difference',0)) }}
{% endif %} {% endif %}
{% endblock %}