tallyprime-sdk 0.1.3

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 {
    pub fn create_item_invoice_request(vch: &serde_json::Map<String, Value>) -> Result<String> {
        let name = vch
            .get("VOUCHERTYPENAME")
            .and_then(|s| s.as_str())
            .unwrap_or("Sales");
        XmlBuilder::create_all_masters_import_request(|writer| {
            XmlBuilder::write_start_tag_with_attrs(
                writer,
                "VOUCHER",
                &[
                    ("VCHTYPE", name),
                    ("ACTION", "Create"),
                    ("OBJVIEW", "Invoice Voucher View"),
                ],
            )?;
            for tag in [
                "DATE",
                "VCHENTRYMODE",
                "VOUCHERNUMBER",
                "NARRATION",
                "REFERENCE",
                "REFERENCEDATE",
                "BASICSHIPDOCUMENTNO",
                "BASICSHIPPEDBY",
                "BASICFINALDESTINATION",
                "EICHECKPOST",
                "BILLOFLADINGNO",
                "BILLOFLADINGDATE",
                "BASICSHIPVESSELNO",
            ] {
                XmlBuilder::write_simple_if(writer, vch, tag)?;
            }
            if let Some(inv) = vch
                .get("ALLINVENTORYENTRIES.LIST")
                .and_then(|x| x.as_object())
            {
                XmlBuilder::write_start_tag(writer, "ALLINVENTORYENTRIES.LIST")?;
                for tag in [
                    "STOCKITEMNAME",
                    "ISDEEMEDPOSITIVE",
                    "RATE",
                    "AMOUNT",
                    "ACTUALQTY",
                    "BILLEDQTY",
                ] {
                    XmlBuilder::write_simple_if(writer, inv, tag)?;
                }
                if let Some(acc) = inv
                    .get("ACCOUNTINGALLOCATIONS.LIST")
                    .and_then(|x| x.as_object())
                {
                    XmlBuilder::write_start_tag(writer, "ACCOUNTINGALLOCATIONS.LIST")?;
                    for tag in ["LEDGERNAME", "ISDEEMEDPOSITIVE", "AMOUNT"] {
                        XmlBuilder::write_simple_if(writer, acc, tag)?;
                    }
                    XmlBuilder::write_end_tag(writer, "ACCOUNTINGALLOCATIONS.LIST")?;
                }
                XmlBuilder::write_end_tag(writer, "ALLINVENTORYENTRIES.LIST")?;
            }
            if let Some(party) = vch.get("LEDGERENTRIES.LIST").and_then(|x| x.as_object()) {
                XmlBuilder::write_start_tag(writer, "LEDGERENTRIES.LIST")?;
                for tag in ["LEDGERNAME", "ISDEEMEDPOSITIVE", "AMOUNT", "ISPARTYLEDGER"] {
                    XmlBuilder::write_simple_if(writer, party, tag)?;
                }
                XmlBuilder::write_end_tag(writer, "LEDGERENTRIES.LIST")?;
            }
            if let Some(del) = vch.get("INVOICEDELNOTES.LIST").and_then(|x| x.as_object()) {
                XmlBuilder::write_start_tag(writer, "INVOICEDELNOTES.LIST")?;
                for tag in ["BASICSHIPPINGDATE", "BASICSHIPDELIVERYNOTE"] {
                    XmlBuilder::write_simple_if(writer, del, tag)?;
                }
                XmlBuilder::write_end_tag(writer, "INVOICEDELNOTES.LIST")?;
            }
            XmlBuilder::write_end_tag(writer, "VOUCHER")
        })
    }
}