tallyprime-sdk 0.2.1

Rust SDK for TallyPrime XML/HTTP integration with typed APIs for masters, vouchers, and financial reports.
Documentation
mod common;

use common::{
    active_company_label, create_client_from_env, format_yyyymmdd, resolve_financial_period,
};

fn main() {
    let client = create_client_from_env();
    let company = active_company_label(&client);
    let (from_date, to_date) = resolve_financial_period();

    let computation = client
        .get_gst_computation(Some(&from_date), Some(&to_date))
        .unwrap_or_else(|err| {
            eprintln!("Failed to fetch GST Computation: {err}");
            std::process::exit(1);
        });

    println!(
        "GST Computation for {} from {} to {}",
        company,
        format_yyyymmdd(&from_date),
        format_yyyymmdd(&to_date)
    );
    if let Some(name_field) = &computation.name_field {
        println!("Name field: {name_field}");
    }
    println!("Found {} computation row(s)", computation.entries.len());
    for row in &computation.entries {
        println!(
            "{} | taxable {:?} | IGST {:?} | CGST {:?} | SGST {:?} | cess {:?} | tax {:?}",
            row.particulars,
            row.taxable_value,
            row.igst,
            row.cgst,
            row.sgst,
            row.cess,
            row.total_tax
        );
    }

    let gstr1 = client
        .get_gstr1(&from_date, &to_date)
        .unwrap_or_else(|err| {
            eprintln!("Failed to build GSTR-1 summary: {err}");
            std::process::exit(1);
        });

    println!();
    println!(
        "GSTR-1 (voucher-derived) for {} from {} to {}",
        company,
        format_yyyymmdd(&from_date),
        format_yyyymmdd(&to_date)
    );
    println!("Source: {:?}", gstr1.source);
    println!("Company GSTIN: {:?}", gstr1.company_gstin);
    println!(
        "B2B={} B2CL={} B2CS={} CDNR={} HSN={} docs={}",
        gstr1.b2b.len(),
        gstr1.b2cl.len(),
        gstr1.b2cs.len(),
        gstr1.cdnr.len(),
        gstr1.hsn.len(),
        gstr1.documents.len()
    );

    for inv in &gstr1.b2b {
        println!(
            "B2B | {} | {:?} | {} | taxable {:.2} | tax {:.2}",
            inv.party_gstin,
            inv.invoice_number,
            format_yyyymmdd(&inv.invoice_date),
            inv.taxes.taxable_value,
            inv.taxes.total_tax()
        );
    }
    for inv in &gstr1.b2cl {
        println!(
            "B2CL | {:?} | {:?} | taxable {:.2}",
            inv.party_name, inv.invoice_number, inv.taxes.taxable_value
        );
    }
    for row in &gstr1.b2cs {
        println!(
            "B2CS | pos {:?} | rate {:?} | invoices {} | taxable {:.2}",
            row.place_of_supply, row.rate, row.invoice_count, row.taxes.taxable_value
        );
    }
    for note in &gstr1.cdnr {
        println!(
            "CDNR | {:?} | {:?} | {} | taxable {:.2}",
            note.party_gstin, note.note_number, note.note_type, note.taxes.taxable_value
        );
    }
    for hsn in &gstr1.hsn {
        println!(
            "HSN | {} | {:?} | qty {:?} | taxable {:.2}",
            hsn.hsn_code, hsn.description, hsn.total_quantity, hsn.taxes.taxable_value
        );
    }
}