/// <summary>
 /// Create a payment made by your customer and you can also apply them to invoices either partially or fully.
 /// </summary>
 /// <param name="new_customer_payment_info">The new_customer_payment_info is the Customerpayment object which having the info to made payment with date and amount as mandatory attributes.</param>
 /// <returns>Customerpayment object.</returns>
 public CustomerPayment Create(CustomerPayment new_customer_payment_info)
 {
     string address = baseAddress ;
     var json = JsonConvert.SerializeObject(new_customer_payment_info);
     var jsonstring = new Dictionary<object, object>();
     jsonstring.Add("JSONString", json);
     var responce = ZohoHttpClient.post(address, getQueryParameters(jsonstring));
     return CustomerPaymentParser.getPayment(responce);
 }
 internal static CustomerPayment getPayment(HttpResponseMessage responce)
 {
     var payment = new CustomerPayment();
     var jsonObj = JsonConvert.DeserializeObject<Dictionary<string, object>>(responce.Content.ReadAsStringAsync().Result);
     if (jsonObj.ContainsKey("payment"))
     {
         payment = JsonConvert.DeserializeObject<CustomerPayment>(jsonObj["payment"].ToString());
     }
     return payment;
 }
 static void Main(string[] args)
 {
     try
     {
         var service = new ZohoBooks();
         service.initialize("{authtoken}", "{organization id}");
         CustomerPaymentsApi customerpaymentsApi = service.GetCustomerPaymentsApi();
         var parameters = new Dictionary<object, object>();
         parameters.Add("customer_name_startswith", "h");
         var customerpaymentsList = customerpaymentsApi.GetCustomerPayments(parameters);
         var customerpayments = customerpaymentsList;
         var paymentId = customerpayments[2].payment_id;
         if (customerpayments != null)
         {
             foreach (var customerpayment in customerpayments)
                 Console.WriteLine("{0},{1},{2}", customerpayment.account_name, customerpayment.amount, customerpayment.customer_name);
         }
         var customerpayment1 = customerpaymentsApi.Get(paymentId);
         if(customerpayment1!=null)
             Console.WriteLine("{0},{1},{2}", customerpayment1.account_name, customerpayment1.amount, customerpayment1.customer_name);
         var customerId = customerpayment1.customer_id;
         var newPaymentInfo = new CustomerPayment()
         {
             customer_id = customerId,
             date="2014-02-03",
             amount=1234,
         };
         var newCustomerPayment = customerpaymentsApi.Create(newPaymentInfo);
         if(newCustomerPayment!=null)
             Console.WriteLine("{0},{1},{2}", newCustomerPayment.account_name, newCustomerPayment.amount, newCustomerPayment.customer_name);
         var updateInfo = new CustomerPayment()
         {
             amount=100000,
         };
         var updatedCustomerPayment = customerpaymentsApi.Update(paymentId, updateInfo);
         if(updatedCustomerPayment!=null)
             Console.WriteLine("{0},{1},{2}", updatedCustomerPayment.account_name, updatedCustomerPayment.amount, updatedCustomerPayment.customer_name);
         var delcustpayment = customerpaymentsApi.Delete(customerpayments[1].payment_id);
         Console.WriteLine(delcustpayment);
     }
     catch(Exception e)
     {
         Console.WriteLine(e.Message);
     }
     Console.ReadKey();
 }
 internal static CustomerPaymentList getPaymentList(HttpResponseMessage responce)
 {
     var customerPaymentlist = new CustomerPaymentList();
     var jsonObj = JsonConvert.DeserializeObject<Dictionary<string, object>>(responce.Content.ReadAsStringAsync().Result);
     if (jsonObj.ContainsKey("customerpayments"))
     {
         var paymentsArray = JsonConvert.DeserializeObject<List<object>>(jsonObj["customerpayments"].ToString());
         foreach(var paymentObj in paymentsArray)
         {
             var payment = new CustomerPayment();
             payment = JsonConvert.DeserializeObject<CustomerPayment>(paymentObj.ToString());
             customerPaymentlist.Add(payment);
         }
     }
     if (jsonObj.ContainsKey("page_context"))
     {
         var pageContext = new PageContext();
         pageContext = JsonConvert.DeserializeObject<PageContext>(jsonObj["page_context"].ToString());
         customerPaymentlist.page_context = pageContext;
     }
     return customerPaymentlist;
 }
        static void Main(string[] args)
        {
            try
            {
                var service = new ZohoBooks();
                service.initialize("{authtoken}", "{organizationId}");
                var transactionApi = service.GetBankTransactionsApi();
                var accounts = service.GetBankAccountsApi().GetBankAccounts(null);
                var parameters = new Dictionary<object, object>();
                 parameters.Add("filter_by", "Status.All");
                 parameters.Add("account_id", accounts[0].account_id);
                 Console.WriteLine("---------------------- All Transactions ----------------------");
                 var transactionList = transactionApi.GetTransactions(parameters);
                 var transactions = transactionList;
                 foreach (var trans in transactions)
                     Console.WriteLine("{0},{1},{2}", trans.transaction_id, trans.status, trans.amount);

                Console.WriteLine("---------------------- Specified Transaction ----------------------");
                var transaction = transactionApi.Get(transactions[2].transaction_id);
                 Console.WriteLine("{0},{1},{2}", transaction.transaction_id, transaction.transaction_type, transaction.amount);

                 Console.WriteLine("---------------------- New Transaction ----------------------");
                 var newTransactionInfo = new Transaction()
                 {
                     transaction_type = "transfer_fund",
                     from_account_id = accounts[0].account_id,
                     to_account_id = accounts[2].account_id,
                     amount=10
                 };
                 var newTransaction = transactionApi.Create(newTransactionInfo);
                 Console.WriteLine("{0},{1},{2}", newTransaction.transaction_id, newTransaction.transaction_type, newTransaction.amount);

                 Console.WriteLine("---------------------- Updated Transaction ----------------------");
                 var updateInfo = new Transaction()
                  {
                         amount=50,
                         currency_id=transactionList[0].currency_id,
                         date="2014-02-06",
                         description="",
                         exchange_rate=1,
                         from_account_id = accounts[0].account_id,
                         reference_number= "",
                         to_account_id = accounts[2].account_id,
                         transaction_type = "transfer_fund"
                 };
                 var updatedTrans = transactionApi.Update(newTransaction.transaction_id, updateInfo);
                 Console.WriteLine("{0},{1},{2}", updatedTrans.transaction_id, updatedTrans.transaction_type, updatedTrans.amount);

                 Console.WriteLine("---------------------- Delete Transaction ----------------------");
                 var deltrans = transactionApi.Delete(updatedTrans.transaction_id);
                 Console.WriteLine(deltrans);
                var parameters1 = new Dictionary<object, object>();
                 parameters1.Add("amount_start", "1");
                 parameters1.Add("amount_end", "4000");
                 parameters1.Add("date_start", "2014-02-01");
                 parameters1.Add("date_end", "2014-02-07");

                 var matchingtrans = transactionApi.GetMatchingTransactions(transactions[1].transaction_id, parameters1);

                 foreach(var matchingTran in matchingtrans)
                     Console.WriteLine("{0},{1},{2}", matchingTran.transaction_id, matchingTran.transaction_type, matchingTran.amount);
                var parameters3=new Dictionary<object,object>();
                 parameters3.Add("account_id", accounts[1].account_id);
                 TransactionsToBeMatched transtomatch = new TransactionsToBeMatched()
                 {
                     transactions_to_be_matched = new List<Transaction>(){
                         new Transaction()
                         {
                             transaction_id=transactions[2].transaction_id,
                             transaction_type="vendor_payment"
                         },
                         new Transaction()
                         {
                             transaction_id=transactions[3].transaction_id,
                             transaction_type="transfer_fund"
                         },
                         new Transaction()
                         {
                             transaction_id=transactions[1].transaction_id,
                             transaction_type="expense"
                         }
                     }
                 };
                 var matchtransaction = transactionApi.MatchATransaction(transactions[0].transaction_id, transtomatch);
                 Console.WriteLine(matchtransaction);
                 var unmatch = transactionApi.UnmatchTransaction(transactions[0].transaction_id);
                 Console.WriteLine(unmatch);
                 parameters.Add("sort_column", "statement_date");
                 var associatedTransObj = transactionApi.GetAssociatedTransactions(transactions[0].transaction_id, null);
                 var associatedTrans = associatedTransObj.associated_transactions;
                 Console.WriteLine(associatedTransObj.imported_transaction_id);
                 foreach (var asociatedTran in associatedTrans)
                     Console.WriteLine("{0},{1},{2}", asociatedTran.transaction_id, asociatedTran.transaction_type, asociatedTran.amount);
                 var exclude = transactionApi.ExcludeATransaction(transactions[0].transaction_id);
                 Console.WriteLine(exclude);
                 var restore = transactionApi.RestoreATransaction(transactions[0].transaction_id);
                 Console.WriteLine(restore);
                 var transacInfo=new Transaction()
                 {
                         amount=4000,
                         date="2013-01-29",
                         description="Insurance payment",
                         exchange_rate=1,
                         from_account_id = accounts[1].account_id,
                         reference_number="Ref-9872",
                         to_account_id = accounts[3].account_id,
                         transaction_type = "expense"
                 };
                 var catogarise = transactionApi.CategorizeAnUncategorizedTransaction(transactions[0].transaction_id, transacInfo);
                 Console.WriteLine(catogarise);
                 var creditrefundInfo = new CreditNote()
                 {
                     creditnote_id = "{credit note id}",
                     date="2014-02-07",
                     from_account_id = "{account id from which account the transaction is going to be done}",
                     amount=4000
                 };
                 var catogasCred = transactionApi.CategorizeAsCreditNoteRefunds(transactions[0].transaction_id, creditrefundInfo);
                 Console.WriteLine(catogasCred);
                 var vendordetails = new VendorPayment()
                 {
                     vendor_id = "{vendor id}",
                     amount=4000,
                     paid_through_account_id = "{account id}"
                 };
                 var vendorcat = transactionApi.CategorizeAsVendorpayment(transactions[0].transaction_id, vendordetails);
                 Console.WriteLine(vendorcat);
                 var customerinfo = new CustomerPayment()
                 {
                     customer_id = "{customer id}",
                     date="2014-02-08",
                     invoices = new List<Invoice>()
                     {
                         new Invoice(){
                             invoice_id="{invoice id}",
                             amount_applied=4000
                            }
                     },
                     amount=4000
                 };
                 var custpaycat = transactionApi.CategorizeAsCustomerPayments(transactions[0].transaction_id, customerinfo, parameters);
                 Console.WriteLine(custpaycat);
                 var expenseInfo=new Expense()
                 {
                     account_id=accounts[3].account_id,
                     date="2013-01-29",
                     paid_through_account_id = accounts[4].account_id,
                     project_id= "",
                     amount=4000,
                     tax_id="",
                     is_inclusive_tax=false,
                     is_billable=false,
                     reference_number="Ref-123",
                     description="Insurance payment",
                 };
                 var catAsExpens = transactionApi.CategorizeAsExpense(transactions[0].transaction_id, expenseInfo, @"F:\error.png");
                 Console.WriteLine(catAsExpens);
                 var uncatogorise = transactionApi.UncategorizeACategorizedTransaction(transactions[0].transaction_id);
                 Console.WriteLine(uncatogorise);
                 var vendorCreditsApi = service.GetVendorCreditsApi();
                 var vendorCredits = vendorCreditsApi.GetVendorCredits(null);
                 var refundInfo = new VendorCreditRefund()
                 {
                     vendor_credit_id=vendorCredits[0].vendor_credit_id,
                     date="2014-11-25",

                 };
                 var catAsVendorRefund = transactionApi.CategorizeAsVendorCreditRefund(transactions[0].transaction_id, refundInfo);
                 Console.WriteLine(catAsVendorRefund);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
 /// <summary>
 /// Categorizes as customer payments.
 /// </summary>
 /// <param name="transaction_id">The transaction_id is the identifier of the uncatogerized ttransaction.</param>
 /// <param name="payment_details">The payment_details is the Customerpayment object to catogerize the transaction with date and amount are the mandatory parameters.</param>
 /// <param name="parameters">The parameters is the dictionary object which is having the parameter contact_ids as key value pair.</param>
 /// <returns>System.String.<br></br>The success message is "The transaction is now categorized."</returns>
 public string CategorizeAsCustomerPayments(string transaction_id, CustomerPayment payment_details, Dictionary<object, object> parameters)
 {
     string url = baseAddress + "/uncategorized/" + transaction_id + "/categorize/customerpayments";
     var json = JsonConvert.SerializeObject(payment_details);
     parameters.Add("JSONString", json);
     var responce = ZohoHttpClient.post(url, getQueryParameters(parameters));
     return BankTransactionParser.getMessage(responce);
 }
 /// <summary>
 /// Update an existing customer payment. You can also modify the amount applied to the invoices.
 /// </summary>
 /// <param name="payment_id">The payment_id is the identifier of the customer payment.</param>
 /// <param name="update_info">The update_info is the Customerpayment object which is having the changes to apply.</param>
 /// <returns>Customerpayment object.</returns>
 public CustomerPayment Update(string payment_id, CustomerPayment update_info)
 {
     string address = baseAddress+"/"+payment_id;
     var json = JsonConvert.SerializeObject(update_info);
     var jsonstring = new Dictionary<object, object>();
     jsonstring.Add("JSONString", json);
     var responce = ZohoHttpClient.put(address, getQueryParameters(jsonstring));
     return CustomerPaymentParser.getPayment(responce);
 }