Saya telah berhasil melakukan pembayaran menggunakan C# .NET SDK, namun tetap muncul sebagai 'belum diterapkan' ketika saya check in QBO.

Saya memberikan ID Faktur dan mencoba mengikuti dokumentasi API pengembang mereka, tetapi saya telah melakukannya begitu lama sehingga mungkin saya melewatkan sesuatu?

Kode berikut membuat pembayaran tetapi tidak 'menerima' pembayaran ke faktur, apakah ada sesuatu yang saya lewatkan atau perlu lakukan agar keduanya dapat dihubungkan bersama?

Payment payment = new Payment
{
    ProcessPayment = false,
    CustomerRef = new ReferenceType { name = customer.DisplayName, Value = customer.Id },
    CurrencyRef = new ReferenceType { type = "Currency", Value = "CAD" },
    TotalAmt = amount,
    TotalAmtSpecified = true
};

if (method == PaymentTypes.Cash)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "1");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            {name = paymentType.Name, Value = paymentType.Id};
    }
}

if (method == PaymentTypes.DebitCard)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "9");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            { name = paymentType.Name, Value = paymentType.Id };
    }
}

if (method == PaymentTypes.CreditCard)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "8");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            { name = paymentType.Name, Value = paymentType.Id };
    }
}

List<LinkedTxn> linkedTxns = new List<LinkedTxn>
{
    new LinkedTxn()
    {
        TxnId = invoice.Id,
        TxnType = TxnTypeEnum.Invoice.ToString()
    },
};

foreach (Line line in invoice.Line)
{
    //line.Amount = amount;
    //line.AmountSpecified = true;
    line.Received = amount;
    line.ReceivedSpecified = true;
    line.DetailType = LineDetailTypeEnum.PaymentLineDetail;
    line.DetailTypeSpecified = true;
    line.LinkedTxn = linkedTxns.ToArray();
}

payment.DepositToAccountRef = new ReferenceType() { Value = "5" };
payment.Line = invoice.Line;
payment.PaymentRefNum = reference;

DataService dataService = new DataService(serviceContext);
dataService.Add<Payment>(payment);

enter image description here

0
devfunkd 2 Juli 2020, 02:30

1 menjawab

Jawaban Terbaik

Ini bukan jawaban. Namun ada terlalu banyak untuk ditambahkan ke komentar. Saya berharap ini akan menjadi titik awal yang membantu (jika tidak, saya akan menghapusnya nanti).

Pertama saya sarankan refactoring kode Anda dan parameterisasi variabel Anda. Dengan melakukan itu, Anda harus dapat melakukan pengujian berulang secara terpisah.

Saat Anda membentuk dataService.Add<Payment>(payment), simpan objek respons karena mungkin menawarkan petunjuk tentang bagaimana permintaan diproses. Atau jika ini menekan pesan kesalahan, Anda mungkin ingin mencoba menggunakan Postman untuk mengirim permintaan HTTP. Ini dapat membantu menentukan parameter apa yang hilang/salah.

Hindari membuat objek yang ditetapkan sebagian, ini akan membuat lebih mudah untuk membaca 7 mencari tahu properti mana yang perlu ditetapkan.

Juga jika Anda melihat bagian Pembaruan penuh pembayaran di https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment payload json memiliki Baris tambahan dengan properti TxnType disetel ke CreditMemo. Saya menganggap Anda perlu menambahkan sesuatu seperti ReceivePayment atau CreditCardPayment?

Untuk refactor kode Anda, pertimbangkan:

// TODO - Set variables for testing purposes. 
// This can be added as params to a method.
decimal amount = 100;
string reference = "";
string invoiceId = ""; // invoice.Id
string customerDisplayName = ""; //customer.DisplayName
string customerId = ""; //customer.Id
string paymentName = "Cash"; // paymentType.Name
string paymentId = "1"; // paymentType.Id
List<Line> lines = new List<Line>(); // invoice.Line

                        
if(lines.Count() == 0)
{
    // TODO: You might want to check there are lines?
    throw new ArgumentException("No invoice.");
}

Line[] invoiceLines = lines.Select(m => new Line()
{
    AnyIntuitObject = m.AnyIntuitObject,
    Amount = m.Amount,
    AmountSpecified = m.AmountSpecified,
    CustomField = m.CustomField,
    Id = m.Id,
    LineNum = m.LineNum,
    Description = m.Description,
    DetailType = LineDetailTypeEnum.PaymentLineDetail, //m.DetailType,
    DetailTypeSpecified = true, //m.DetailTypeSpecified,
    LinkedTxn = new List<LinkedTxn>
    {
        new LinkedTxn()
        {
            TxnId = invoiceId,
            TxnType = TxnTypeEnum.Invoice.ToString() // TODO: Should this be ReceivePayment?
        },
    }.ToArray(), //m.LinkedTxn,
    LineEx = m.LineEx,
    Received = amount, //m.Received,    
    ReceivedSpecified = true // m.ReceivedSpecified
}).ToArray();            

Payment payment = new Payment
{
    ProcessPayment = false,
    CustomerRef = new ReferenceType { name = customerDisplayName, Value = customerId },
    CurrencyRef = new ReferenceType { type = "Currency", Value = "CAD" },
    TotalAmt = amount,
    TotalAmtSpecified = true,
    DepositToAccountRef = new ReferenceType() { Value = "5" },
    Line = invoiceLines, // Variable is for debugging purposes - it should be inline or call a method. 
    PaymentRefNum = reference,
    PaymentMethodRef = new ReferenceType()
    {
        name = paymentName,
        Value = paymentId,
    }
};

DataService dataService = new DataService(serviceContext);
Payment results = dataService.Add<Payment>(payment);

var json = JsonConvert.SerializeObject(results);
Console.Write(json); // TODO - Use break point/ or write response somewhere for clues.
1
Greg 6 Juli 2020, 15:33