tallyprime-sdk 0.2.1

Rust SDK for TallyPrime XML/HTTP integration with typed APIs for masters, vouchers, and financial reports.
Documentation
use crate::errors::Result;
use serde_json::Value;

use super::XmlBuilder;

impl XmlBuilder {
    /// Build an All Masters import request that creates a ledger.
    pub fn create_ledger_request(ledger_map: &serde_json::Map<String, Value>) -> Result<String> {
        XmlBuilder::create_all_masters_import_request(|writer| {
            XmlBuilder::write_start_tag_with_attrs(writer, "LEDGER", &[("Action", "Create")])?;
            XmlBuilder::write_simple_if(writer, ledger_map, "NAME")?;
            XmlBuilder::write_parent_tag(
                writer,
                ledger_map.get("PARENT").and_then(|v| v.as_str()),
                false,
            )?;
            if let Some(v) = ledger_map.get("OPENINGBALANCE") {
                XmlBuilder::write_simple(writer, "OPENINGBALANCE", v)?;
            }
            for key in [
                "INCOMETAXNUMBER",
                "GSTAPPLICABLE",
                "APPROPRIATEFOR",
                "GSTAPPROPRIATETO",
                "EXCISEALLOCTYPE",
                "GSTTYPEOFSUPPLY",
                "GSTDUTYHEAD",
                "RATEOFTAXCALCULATION",
                "TAXTYPE",
                "BILLCREDITPERIOD",
                "ISBILLWISEON",
                "ISCREDITDAYSCHKON",
            ] {
                XmlBuilder::write_simple_if(writer, ledger_map, key)?;
            }

            if let Some(v) = ledger_map
                .get("LEDMAILINGDETAILS.LIST")
                .and_then(|v| v.as_object())
            {
                XmlBuilder::write_start_tag(writer, "LEDMAILINGDETAILS.LIST")?;
                for key in [
                    "APPLICABLEFROM",
                    "MAILINGNAME",
                    "COUNTRY",
                    "STATE",
                    "PINCODE",
                ] {
                    if key == "COUNTRY" || key == "STATE" || key == "PINCODE" {
                        continue;
                    }
                    XmlBuilder::write_simple_if(writer, v, key)?;
                }
                if let Some(addr_list) = v.get("ADDRESS.LIST").and_then(|x| x.as_array()) {
                    XmlBuilder::write_start_tag_with_attrs(
                        writer,
                        "ADDRESS.LIST",
                        &[("TYPE", "String")],
                    )?;
                    for item in addr_list {
                        if let Some(obj) = item.as_object() {
                            XmlBuilder::write_simple_if(writer, obj, "ADDRESS")?;
                        }
                    }
                    XmlBuilder::write_end_tag(writer, "ADDRESS.LIST")?;
                }
                for key in ["COUNTRY", "STATE", "PINCODE"] {
                    XmlBuilder::write_simple_if(writer, v, key)?;
                }
                XmlBuilder::write_end_tag(writer, "LEDMAILINGDETAILS.LIST")?;
            }

            for key in [
                "BANKDETAILS",
                "IFSCODE",
                "BANKACCHOLDERNAME",
                "SWIFTCODE",
                "BRANCHNAME",
                "BANKBSRCODE",
                "ODLIMIT",
            ] {
                XmlBuilder::write_simple_if(writer, ledger_map, key)?;
            }

            if let Some(v) = ledger_map
                .get("LEDGSTREGDETAILS.LIST")
                .and_then(|v| v.as_object())
            {
                XmlBuilder::write_start_tag(writer, "LEDGSTREGDETAILS.LIST")?;
                for key in [
                    "APPLICABLEFROM",
                    "GSTREGISTRATIONTYPE",
                    "GSTIN",
                    "PLACEOFSUPPLY",
                    "TRANSPORTERID",
                    "ISOTHTERRITORYASSESSEE",
                    "CONSIDERPURCHASEFOREXPORT",
                    "ISTRANSPORTER",
                    "ISCOMMONPARTY",
                ] {
                    XmlBuilder::write_simple_if(writer, v, key)?;
                }
                XmlBuilder::write_end_tag(writer, "LEDGSTREGDETAILS.LIST")?;
            }

            if let Some(v) = ledger_map.get("PAYMENTDETAILS").and_then(|v| v.as_object()) {
                XmlBuilder::write_start_tag(writer, "PAYMENTDETAILS.LIST")?;
                for key in [
                    "PAYMENTFAVOURING",
                    "TRANSACTIONNAME",
                    "SETASDEFAULT",
                    "DEFAULTTRANSACTIONTYPE",
                    "CHEQUECROSSCOMMENT",
                    "VIRTUALPAYMENTADDRESS",
                    "IFSCODE",
                    "BANKNAME",
                    "ACCOUNTNUMBER",
                ] {
                    XmlBuilder::write_simple_if(writer, v, key)?;
                }
                if let Some(ben) = v.get("BENEFICIARYCODEDETAILS").and_then(|x| x.as_object()) {
                    XmlBuilder::write_start_tag(writer, "BENEFICIARYCODEDETAILS.LIST")?;
                    XmlBuilder::write_simple_if(writer, ben, "BENEFICIARYCODE")?;
                    XmlBuilder::write_end_tag(writer, "BENEFICIARYCODEDETAILS.LIST")?;
                }
                XmlBuilder::write_end_tag(writer, "PAYMENTDETAILS.LIST")?;
            }

            for key in ["ISTDSAPPLICABLE", "TDSDEDUCTEETYPE", "DEDUCTINSAMEVCH"] {
                XmlBuilder::write_simple_if(writer, ledger_map, key)?;
            }
            if let Some(v) = ledger_map.get("TDSAPPLICABLE") {
                XmlBuilder::write_simple(writer, "TDSAPPLICABLE", v)?;
            }
            XmlBuilder::write_tds_category_details_block(
                writer,
                ledger_map
                    .get("TDSCATEGORYDETAILS.LIST")
                    .and_then(|v| v.as_object()),
            )?;

            for key in ["VATDEALERNATURE", "ROUNDINGMETHOD", "ROUNDINGLIMIT"] {
                XmlBuilder::write_simple_if(writer, ledger_map, key)?;
            }

            XmlBuilder::write_hsn_details_block(
                writer,
                ledger_map
                    .get("HSNDETAILS.LIST")
                    .and_then(|v| v.as_object()),
                &[
                    "APPLICABLEFROM",
                    "SRCOFHSNDETAILS",
                    "HSNCODE",
                    "HSN",
                    "HSNCLASSIFICATIONNAME",
                ],
            )?;
            XmlBuilder::write_gst_details_block(
                writer,
                ledger_map
                    .get("GSTDETAILS.LIST")
                    .and_then(|v| v.as_object()),
                &[
                    "APPLICABLEFROM",
                    "HSNMASTERNAME",
                    "TAXABILITY",
                    "SRCOFGSTDETAILS",
                ],
                true,
                true,
            )?;

            if let Some(Value::String(name)) = ledger_map.get("NAME") {
                XmlBuilder::write_language_name_list(
                    writer,
                    name,
                    ledger_map.get("ALIAS"),
                    false,
                    false,
                )?;
            }
            XmlBuilder::write_end_tag(writer, "LEDGER")
        })
    }
}