php - 在现有发票中添加新发票行不起作用

标签 php mysql quickbooks

我在从 Mysql 数据库的现有发票中添加新发票行时遇到问题。 我已将发票从 quickbook 同步到 MySql。双向同步在 quickbook 和 mysql 之间工作。 问题是当我在 qb_invoice_invoicline 表中添加一个新的发票行时,它不与 Quickbook 同步。

我在 qb_invoice 表中收到以下错误。
qbsql_last_errnum 320
last_error_msg
找不到请求中指定的对象“64-1518123234”。(这里的 64-1518123234 是 qb_invoice_invoiceline.TxnLineID 库中的值)。
如果我将此字段留空,则同步时会出现解析错误。

以下是我用来同步的代码。

<?php


error_reporting(E_ERROR | E_PARSE);
ini_set('display_errors', 1);

require_once dirname(__FILE__) . '/QuickBooks.php';
require_once 'Common/Constants.php';
require_once 'Common/Utility.php';
require_once 'Common/Hook.php';

if (function_exists('date_default_timezone_set'))
{
    date_default_timezone_set(TIMEZONE);
}

if(!isset($_GET['companyId'])) {
    trigger_error('Error! Parameter "CompanyId" missing in API.', E_USER_ERROR);
    return;
}

$companyId = $_GET['companyId'];
$companyConfig = file_get_contents('config.json');
$companyData = json_decode($companyConfig, true);

if(!isset($companyData['company'][$companyId])) {
    trigger_error('Error! Company detail not found in config file.', E_USER_ERROR);
    return;
}

// The username and password the Web Connector will use to connect with
$username = $companyData['company'][$companyId]['web_connector_username'];
$password = $companyData['company'][$companyId]['web_connector_password'];

// get Company Database credentials
$db = $companyData['company'][$companyId];


$dsn = 'mysqli://' . $db['username'] . ':' . $db['password'] . '@' . $db['host'] . '/' . $db['db_name'];

// If the database has not been initialized, we need to initialize it (create
//  schema and set up the username/password, etc.)
if (!QuickBooks_Utilities::initialized($dsn))
{
    header('Content-Type: text/plain');

    // It takes a really long time to build the schema...
    set_time_limit(0);

    $driver_options = array(
    );

    $init_options = array(
        'quickbooks_sql_enabled' => true,
    );

    QuickBooks_Utilities::initialize($dsn, $driver_options, $init_options);
    QuickBooks_Utilities::createUser($dsn, $username, $password);

    exit;
}

$mode = QuickBooks_WebConnector_Server_SQL::MODE_READWRITE;     

$conflicts = QuickBooks_WebConnector_Server_SQL::CONFLICT_LOG;

$delete = QuickBooks_WebConnector_Server_SQL::DELETE_FLAG;      // Just flag it as deleted

$hook_obj = Hook::getInstance($companyId);
$hooks = array(


    QuickBooks_SQL::HOOK_SQL_INSERT => array(
        'preHookHandler',
        array( $hook_obj, 'insertHook' ),
    ),

     QuickBooks_SQL::HOOK_SQL_UPDATE => array(
         'preHookHandler',
        array( $hook_obj, 'updateHook' ),
     ),
);


function preHookHandler($requestID, $user, $hook, &$err, $hook_data, $callback_config)
{
    return true;
}


$soap_options = array();

$handler_options = array(
    'deny_concurrent_logins' => false,
    'deny_reallyfast_logins' => false,
);

$driver_options = array();

$ops = array(
    QUICKBOOKS_OBJECT_ACCOUNT,
    QUICKBOOKS_OBJECT_SALESTAXITEM,
    QUICKBOOKS_OBJECT_SALESTAXCODE,
    QUICKBOOKS_OBJECT_CUSTOMER,
    QUICKBOOKS_OBJECT_VENDOR,

    QUICKBOOKS_OBJECT_INVENTORYITEM,

    QUICKBOOKS_OBJECT_TEMPLATE,

    QUICKBOOKS_OBJECT_CUSTOMERTYPE,
    QUICKBOOKS_OBJECT_VENDORTYPE,
    QUICKBOOKS_OBJECT_ESTIMATE,
    QUICKBOOKS_OBJECT_INVOICE,
    QUICKBOOKS_OBJECT_CLASS,

    QUICKBOOKS_OBJECT_UNITOFMEASURESET,
    QUICKBOOKS_ADD_UNITOFMEASURESET,
    QUICKBOOKS_MOD_UNITOFMEASURESET,
    QUICKBOOKS_QUERY_UNITOFMEASURESET,
    QUICKBOOKS_IMPORT_UNITOFMEASURESET,

    QUICKBOOKS_OBJECT_STANDARDTERMS,
    QUICKBOOKS_OBJECT_INVENTORYITEM,
    QUICKBOOKS_OBJECT_NONINVENTORYITEM,
    QUICKBOOKS_OBJECT_SERVICEITEM,
    QUICKBOOKS_OBJECT_SHIPMETHOD,
    QUICKBOOKS_OBJECT_PAYMENTMETHOD,
    QUICKBOOKS_OBJECT_TERMS,
    QUICKBOOKS_OBJECT_PRICELEVEL,
    QUICKBOOKS_OBJECT_ITEM,

    QUICKBOOKS_ADD_SERVICEITEM,
    QUICKBOOKS_MOD_SERVICEITEM,
    QUICKBOOKS_QUERY_SERVICEITEM,
    QUICKBOOKS_IMPORT_SERVICEITEM,

    QUICKBOOKS_OBJECT_RECEIVEPAYMENT,
    QUICKBOOKS_ADD_RECEIVE_PAYMENT,
    QUICKBOOKS_MOD_RECEIVE_PAYMENT,
    QUICKBOOKS_QUERY_RECEIVE_PAYMENT,
    QUICKBOOKS_IMPORT_RECEIVE_PAYMENT,
    QUICKBOOKS_DERIVE_RECEIVE_PAYMENT,

    QUICKBOOKS_OBJECT_PAYMENTMETHOD,

    QUICKBOOKS_OBJECT_COMPANY,
    QUICKBOOKS_OBJECT_HOST,
    QUICKBOOKS_OBJECT_PREFERENCES,

    QUICKBOOKS_QUERY_DELETEDTRANSACTIONS,
    QUICKBOOKS_OBJECT_SALESREP,
    QUICKBOOKS_OBJECT_DATAEXT,
    QUICKBOOKS_ADD_DATAEXT,
    QUICKBOOKS_MOD_DATAEXT,
    QUICKBOOKS_OBJECT_DATAEXTDEF,
    QUICKBOOKS_ADD_DATAEXTDEF,
    QUICKBOOKS_MOD_DATAEXTDEF
);

$ops_misc = array(      // For fetching inventory levels, deleted transactions, etc.
    QUICKBOOKS_DERIVE_INVENTORYLEVELS,
    QUICKBOOKS_QUERY_DELETEDLISTS,
    QUICKBOOKS_QUERY_DELETEDTRANSACTIONS
    // 'nothing',
);

//
$sql_options = array(
    'only_import' => $ops,
    'only_add' => $ops,
    'only_modify' => $ops,
    'only_misc' => $ops_misc,
);

//
$callback_options = array();

$Server = new QuickBooks_WebConnector_Server_SQL(
    $dsn,
    '1 minute',
    $mode,
    $conflicts,
    $delete,
    $username,
    array(),
    array(),
    $hooks,
    QUICKBOOKS_LOG_DEVELOP,
    QUICKBOOKS_SOAPSERVER_BUILTIN,
    QUICKBOOKS_WSDL,
    $soap_options,
    $handler_options,
    $driver_options,
    $sql_options,
    $callback_options);
$Server->handle(true, true);



总结一下问题,(qb_invoice_invoiceline.TxnLineID) 列中应该有什么值来添加新的发票行?

最佳答案

如果您只想添加一行,请将所有新行项目的 TxnLineID 设置为 -1。

例如,如果您的发票包含 ID 为 A/B/C 的行项目,并且您想追加另一行,您的模组应该类似于:

...
<InvoiceLineMod><TxnLineID>A</TxnLineID><InvoiceLineMod>
<InvoiceLineMod><TxnLineID>B</TxnLineID><InvoiceLineMod>
<InvoiceLineMod><TxnLineID>C</TxnLineID><InvoiceLineMod>
<InvoiceLineMod>
  <TxnLineID>-1</TxnLineID>
 < ... other required values... >
<InvoiceLineMod>
...

如果你想删除B行,发送

<InvoiceLineMod><TxnLineID>A</TxnLineID><InvoiceLineMod>
<InvoiceLineMod><TxnLineID>C</TxnLineID><InvoiceLineMod>

关于php - 在现有发票中添加新发票行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403262/

相关文章:

PHP如何动态实例化一个类

php - 如何在codeigniter中更新数据库

c# - Azure Web应用程序问题: System. Runtime.InteropServices.COMException 80040154类未注册

php - PHP获取对象标识符

php - 检索 mysql 中最后更新的列

php - 如何将 https 源的下载传递到 http 连接?

java - sql insert语句设置行成比例

mysql - perl脚本同时连接两个数据库

c# - 如何在通过 QuickBooks Online API 添加客户之前检查客户是否存在?

c# - 为什么我的 C# 应用程序不能在不同的机器上执行?