代码之家  ›  专栏  ›  技术社区  ›  Yishai

QuickBooks发票修改与创建具有不同的地址行为,如何补偿?

  •  2
  • Yishai  · 技术社区  · 15 年前

    我正在编写一个函数来获取一个定义格式的发票文件,并通过QBXML将其导入到QuickBooks中。其中一个要求是可以重新导入同一发票号,而不是修改现有发票号,而不是创建具有相同编号的新发票号。

    我的问题是QuickBooks如何处理地址。我得到的地址可以是任何格式(在6个不同的内容中),而不保证符合该地区的正确地址格式。

    因此,创建发票非常简单,我在XML标记中指定了账单地址addr1到addr5,而quickbooks没有任何问题。 然而 它不将地址存储为原始文本,而是试图解析城市、州邮政编码和国家。

    发票修改,给定相同的地址信息,将不会解析出城市状态和邮政编码,而是保持地址行的完整性,并且保持城市状态和邮政编码不变,在发票上创建一个重复行,一个是自由格式的文本,另一个是城市、州和邮政编码的组合。解决方法是在发票修改时明确设置城市、州、邮政编码和备注为空。然而,这并没有完全解决这个问题。

    有时,QuickBooks会正确解析地址,并在下一行添加一个随机数字(在“注释”选项卡上进行内部表示)。

    有时QuickBooks会拒绝该地址,甚至认为它在创建时接受了它。我假设是因为它试图解析一个5行地址,并且在修改时,因为城市状态和邮政编码没有位置,所以它没有存储它们的位置。

    现在我唯一的解决方案是让地址保持不变,并告诉用户,由于QuickBooks的限制,无法在重新导入发票时修改地址,只能修改发票行。

    以前有人遇到过这种情况吗?如果有,你有更好的工作吗?你知道一个地址解析器,它可以合理地近似QuickBooks的功能,这样我就可以在创建时以一致的方式向它发送城市状态和邮政编码了吗?

    现在,在某种程度上(除了最后一个),quickbooks给了我一个响应,告诉我它在create上解析了什么,所以我理论上可以存储它来知道我在处理什么,但是除了编写一些耗时的地址解析例程之外,还有什么解决方案可以让quickbooks从new重新解析地址。

    这是请求和响应。请注意,发票创建是相同的,我删除了一些标识信息,但字段长度保持不变。

    请求:

    <?xml version="1.0" encoding="UTF-8"?>  <?qbxml version="7.0"?>
    <QBXML>
    <QBXMLMsgsRq newMessageSetID="243f42acf4011139b7a" onError="stopOnError">
        <InvoiceModRq>
            <InvoiceMod>
                <TxnID>4E64-1242411202</TxnID>
                <EditSequence>1242411202</EditSequence>
                <CustomerRef>
                    <ListID>80000012-1242156814</ListID>
                </CustomerRef>
                <ARAccountRef>
                    <FullName>Accounts Receivable</FullName>
                </ARAccountRef>
                <TxnDate>2009-04-01</TxnDate>
                <RefNumber>M-053491</RefNumber>
                <BillAddress>
                    <Addr1>S &amp; S ACME CO., INC.</Addr1>
                    <Addr2>MR. ABC ABCDEF</Addr2>
                    <Addr3>981 ABCD 761 ST</Addr3>
                    <Addr4>ABABC, AA 99999-3584</Addr4>
                    <Addr5>USA</Addr5>
                    <City/>
                    <State/>
                    <PostalCode/>
                    <Country/>
                    <Note/>
                </BillAddress>
                <TermsRef>
                    <FullName>NET 30</FullName>
                </TermsRef>
                <DueDate>2009-05-01</DueDate>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc/>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>ABCDEFG ABC $3,000.00 *</Desc>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc/>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>FOR:</Desc>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <ItemRef>
                        <FullName>ANFEE</FullName>
                    </ItemRef>
                    <Desc>1 . #9999 S &amp; S ABCD CO., INC., ABCDE, AA *</Desc>
                    <Amount>123456.72</Amount>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc/>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>PLEASE NOTE: Blahh Someone sellificant repeats on July 31st, 2009.</Desc>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>Sellifcan of your Someone Ssellificant to Jan. 31st, 2011 is contingent upon</Desc>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>your satisfying all open invoices and all other/different issues.</Desc>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc/>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc/>
                </InvoiceLineMod>
                <InvoiceLineMod>
                    <TxnLineID>-1</TxnLineID>
                    <Desc>* PLUS expenses for some amount of service described here.</Desc>
                </InvoiceLineMod>
            </InvoiceMod>
        </InvoiceModRq>
    </QBXMLMsgsRq>
    </QBXML>
    

    回应:

        <?xml version="1.0" ?> <QBXML>
    <QBXMLMsgsRs newMessageSetID="243f42acf4011139b7a">
    <InvoiceModRs statusCode="3210" statusSeverity="Error"
                  statusMessage="The &quot;address&quot; field has an invalid value &quot;&quot;.  QuickBooks error message: The parameter is incorrect. "/>
    </QBXMLMsgsRs>
    </QBXML> 
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Yishai    15 年前

    另一个可能的解决方法是双重更新发票。先把地址填一下。第二种是发送五行,不提及城市州邮政等,就像创建时那样。

    我没有测试这个(用户接受地址不会改变,所以我不会尝试),但我把它作为一个想法放在这里,如果有人有类似的问题,他们可以尝试它,如果它起作用的话,可以在这里评论。