Платеж не создается

Мои платежи не отображаются в QuickBooks.

Я могу успешно создавать и обновлять клиентов. Я также могу успешно создавать и обновлять счета. Я не могу создавать платежи. Но в том-то и дело, что когда я выполняю команду "Обновить" на моем платёжном объекте, я получаю верный идентификатор и домен (NG). Я проверил файл журнала синхронизации (IntuitSyncManagerLogger.log) после запуска синхронизации, но в нем нет сообщений об ошибках. Все выглядит нормально, в QuickBooks нет оплаты, связанной со счетом.

Я полагаю, что я устанавливаю все обязательные поля, но я не уверен насчет двух из них.

1) PaymentLine имеет поле с именем TxnId. Я устанавливаю его в качестве идентификатора и домена InvoiceHeader, но не уверен, правильно ли это.

2) Есть еще одно обязательное поле (согласно документации), но я оставляю это поле пустым, так как не знаю, чем его заполнять. Это поле DiscountAccountId. Я не хочу скидку, связанную со счетом.

Вот мой код...

SqlConnection connection = new SqlConnection(m_connectionString);
connection.Open();

SqlCommand cmd = new SqlCommand("dbo.Intuit_GetPayment", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@glmvSyncId", SqlDbType.Int).Value = glmvSyncId;

SqlDataReader rdr = cmd.ExecuteReader();
rdr.Read();

Intuit.Ipp.Data.Qbd.PaymentHeader paymentHeader = new Intuit.Ipp.Data.Qbd.PaymentHeader();
paymentHeader.ARAccountId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
    Value = "37"
};
paymentHeader.ARAccountName = "Accounts Receivable";
paymentHeader.DepositToAccountId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
    Value = "35"
};
paymentHeader.DepositToAccountName = "Undeposited Funds";
paymentHeader.CustomerId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = (rdr["cust_iddomain"].ToString() == "QB" ? Intuit.Ipp.Data.Qbd.idDomainEnum.QB : Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
    Value = rdr["cust_idvalue"].ToString()
}; // cust_iddomain and cust_idvalue are from the Customer
paymentHeader.DocNumber = rdr["invoicekey"].ToString();
paymentHeader.TxnDate = DateTime.Now; 

List<Intuit.Ipp.Data.Qbd.PaymentLine> listLine = new List<Intuit.Ipp.Data.Qbd.PaymentLine>();

var paymentLine = new Intuit.Ipp.Data.Qbd.PaymentLine();
paymentLine.Amount = Convert.ToDecimal(rdr["amount"]);
paymentLine.TxnId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = (rdr["invc_iddomain"].ToString() == "QB" ? Intuit.Ipp.Data.Qbd.idDomainEnum.QB : Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
    Value = rdr["invc_idvalue"].ToString()
}; // invc_iddomain and invc_idvalue are from the InvoiceHeader

listLine.Add(paymentLine);

Intuit.Ipp.Data.Qbd.Payment syncPayment = new Intuit.Ipp.Data.Qbd.Payment();
syncPayment.Header = paymentHeader;
syncPayment.Line = listLine.ToArray();

connection.Close();

Intuit.Ipp.Data.Qbd.Payment resultPayment = new Intuit.Ipp.Data.Qbd.Payment();

resultPayment = commonService.Add(syncPayment);

Я подозреваю, что проблема с TxnId.

Все, что я делаю, - это создаю Клиента, затем создаю Счет для Клиента, а затем создаю Платеж за Счет. Я пропускаю объект где-нибудь?

Любая помощь очень ценится.

2 ответа

Решение

Добавление следующих строк кода, похоже, решило проблему. Оплата теперь записывается в QuickBooks.

paymentHeader.TotalAmt = Convert.ToDecimal(rdr["amount"]);
paymentHeader.TotalAmtSpecified = true;

Платеж, скорее всего, перейдет в состояние ошибки после синхронизации. Вы можете проверить, выполнив PaymentQuery и установив ErroredObjectsOnly = true.

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0500_QuickBooks_Windows/0100_Calling_Data_Services/0015_Retrieving_Objects

Если объект находится в состоянии ошибки, вы можете выполнить запрос по конкретной причине с помощью API состояния:

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0500_QuickBooks_Windows/0600_Object_Reference/SyncStatus

SyncStatusRequest syncStatusRequest = new SyncStatusRequest();
syncStatusRequest.ErroredObjectsOnly = true;
syncStatusRequest.NgIdSet = new NgIdSet[] { new NgIdSet { NgId = <<EnterYourNgIdHere>>, NgObjectType = objectName.Payment } };
SyncStatusResponse[] response = dataServices.GetSyncStatus(syncStatusRequest);

Если платеж находится в состоянии ошибки, вы можете удалить объект из облака, поскольку он никогда не синхронизировался с QuickBooks:

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0500_QuickBooks_Windows/0100_Calling_Data_Services/Deleting_an_Object

Если успешная синхронизация произошла с сущностью хотя бы один раз, но затем обновление перевело ее в состояние ошибки, вам нужно будет выполнить возврат:

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0500_QuickBooks_Windows/0100_Calling_Data_Services/Reverting_an_Object

Вы также можете попробовать выполнить обновление непосредственно для объекта, находящегося в состоянии ошибки, как только вы узнаете причину из API состояния, но это не задокументировано, поэтому может не работать.

Другие вопросы по тегам