zoho - taxid - export
This commit is contained in:
parent
cc7e081c78
commit
5105d20783
4 changed files with 198 additions and 1 deletions
|
|
@ -35,6 +35,8 @@ import com.alexanderlogistics.zoho.dto.ZohoCreditnoteCreateResponse;
|
||||||
import com.alexanderlogistics.zoho.dto.ZohoInvoice;
|
import com.alexanderlogistics.zoho.dto.ZohoInvoice;
|
||||||
import com.alexanderlogistics.zoho.dto.ZohoInvoiceCreateResponse;
|
import com.alexanderlogistics.zoho.dto.ZohoInvoiceCreateResponse;
|
||||||
import com.alexanderlogistics.zoho.dto.ZohoInvoiceItem;
|
import com.alexanderlogistics.zoho.dto.ZohoInvoiceItem;
|
||||||
|
import com.alexanderlogistics.zoho.dto.ZohoTax;
|
||||||
|
import com.alexanderlogistics.zoho.dto.ZohoTaxListResponse;
|
||||||
import com.alexanderlogistics.zoho.dto.ZohoVendorCredit;
|
import com.alexanderlogistics.zoho.dto.ZohoVendorCredit;
|
||||||
import com.alexanderlogistics.zoho.dto.ZohoVendorCreditCreateResponse;
|
import com.alexanderlogistics.zoho.dto.ZohoVendorCreditCreateResponse;
|
||||||
|
|
||||||
|
|
@ -78,6 +80,16 @@ public class ZohoAPIService {
|
||||||
this.jsonb = JsonbBuilder.create(config);
|
this.jsonb = JsonbBuilder.create(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This finder method returns the contact ID to a given company name.
|
||||||
|
* The method returns null if no company with this name exists
|
||||||
|
*
|
||||||
|
* @param companyName
|
||||||
|
* @param contactType
|
||||||
|
* @param accessToken
|
||||||
|
* @return
|
||||||
|
* @throws PluginException
|
||||||
|
*/
|
||||||
public String findContactIDByCompanyName(String companyName, String contactType, String accessToken)
|
public String findContactIDByCompanyName(String companyName, String contactType, String accessToken)
|
||||||
throws PluginException {
|
throws PluginException {
|
||||||
|
|
||||||
|
|
@ -128,6 +140,63 @@ public class ZohoAPIService {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This finder method returns the tax ID to a given percentage.
|
||||||
|
* The method returns null if no tax with this percentage exists
|
||||||
|
*
|
||||||
|
* @param tax_percentage
|
||||||
|
* @param accessToken
|
||||||
|
* @return taxID
|
||||||
|
* @throws PluginException
|
||||||
|
*/
|
||||||
|
public String findTaxIDByPercentage(float tax_percentage, String accessToken)
|
||||||
|
throws PluginException {
|
||||||
|
|
||||||
|
// Print JSON to console for verification
|
||||||
|
logger.info("├── Zoho lookup tax '" + tax_percentage + "'...");
|
||||||
|
try {
|
||||||
|
// https://www.zohoapis.com/books/v3/settings/taxes?organization_id=10234695&company_name=xxx'
|
||||||
|
String uri = zohoOAuthManager.getBaseURI() + "settings/taxes?organization_id="
|
||||||
|
+ zohoOAuthManager.getOrganization();
|
||||||
|
logger.fine("│ ├── uri= " + uri);
|
||||||
|
logger.fine("│ ├── accessToken=" + accessToken);
|
||||||
|
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri))
|
||||||
|
.header("Authorization", "Zoho-oauthtoken " + accessToken)
|
||||||
|
.header("Content-Type", "application/json").GET().build();
|
||||||
|
|
||||||
|
HttpResponse<String> response;
|
||||||
|
|
||||||
|
response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
|
||||||
|
// Print response details to console
|
||||||
|
logger.fine("├── Zoho Response:");
|
||||||
|
logger.fine("│ ├── Status Code: " + response.statusCode());
|
||||||
|
logger.fine("│ ├── Response Body: " + response.body());
|
||||||
|
if (response.statusCode() >= 300) {
|
||||||
|
throw new PluginException(this.getClass().getName(), "Zoho API error",
|
||||||
|
"Failed to find Contacts - Status code: " + response.statusCode() + ", Response: "
|
||||||
|
+ response.body());
|
||||||
|
}
|
||||||
|
|
||||||
|
ZohoTaxListResponse taxListResponse = jsonb.fromJson(response.body(), ZohoTaxListResponse.class);
|
||||||
|
|
||||||
|
if (taxListResponse != null && taxListResponse.getTaxes() != null) {
|
||||||
|
// Durchsuche die Ergebnisse nach exakter Übereinstimmung
|
||||||
|
for (ZohoTax tax : taxListResponse.getTaxes()) {
|
||||||
|
if (tax_percentage == tax.getRate()) {
|
||||||
|
logger.info("│ ├── taxID= " + tax.getTaxId());
|
||||||
|
return tax.getTaxId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
throw new PluginException(this.getClass().getName(), "Zoho API error",
|
||||||
|
"Failed to find tax: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exports an invocie document
|
* Exports an invocie document
|
||||||
*
|
*
|
||||||
|
|
@ -588,7 +657,7 @@ public class ZohoAPIService {
|
||||||
if (!currency.isEmpty() && !currency.equalsIgnoreCase("AED")) {
|
if (!currency.isEmpty() && !currency.equalsIgnoreCase("AED")) {
|
||||||
|
|
||||||
// es ist eine Fremdwährung
|
// es ist eine Fremdwährung
|
||||||
// Herr Heolzl 15.05.2025
|
// Herr Hoelzl 15.05.2025
|
||||||
// However the backend reports the P&L & Balance sheet will reflect in AED as
|
// However the backend reports the P&L & Balance sheet will reflect in AED as
|
||||||
// AGL Dubai books are maintained in AED therefore we need to have an exchange
|
// AGL Dubai books are maintained in AED therefore we need to have an exchange
|
||||||
// rate which can be fixed @3.6725 AED for 1 USD.
|
// rate which can be fixed @3.6725 AED for 1 USD.
|
||||||
|
|
@ -641,6 +710,17 @@ public class ZohoAPIService {
|
||||||
lineItem.setQuantity(1);
|
lineItem.setQuantity(1);
|
||||||
lineItem.setRate(convertInvoiceTotalToAED(invoice, itemCol.getItemValueDouble("amount")));
|
lineItem.setRate(convertInvoiceTotalToAED(invoice, itemCol.getItemValueDouble("amount")));
|
||||||
|
|
||||||
|
// tax - tax_id, tax_percentage
|
||||||
|
try {
|
||||||
|
float tax = itemCol.getItemValueFloat("tax");
|
||||||
|
String taxID = findTaxIDByPercentage(tax, accountID);
|
||||||
|
if (taxID != null && !taxID.isEmpty()) {
|
||||||
|
lineItem.setTaxId(taxID);
|
||||||
|
}
|
||||||
|
} catch (PluginException e) {
|
||||||
|
logger.info("│ ├── failed to compute taxId: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
return lineItem;
|
return lineItem;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
@ -676,6 +756,17 @@ public class ZohoAPIService {
|
||||||
lineItem.setQuantity(1);
|
lineItem.setQuantity(1);
|
||||||
lineItem.setRate(convertInvoiceTotalToAED(invoice, itemCol.getItemValueDouble("amount")));
|
lineItem.setRate(convertInvoiceTotalToAED(invoice, itemCol.getItemValueDouble("amount")));
|
||||||
|
|
||||||
|
// tax - tax_id, tax_percentage
|
||||||
|
try {
|
||||||
|
float tax = itemCol.getItemValueFloat("tax");
|
||||||
|
String taxID = findTaxIDByPercentage(tax, accountID);
|
||||||
|
if (taxID != null && !taxID.isEmpty()) {
|
||||||
|
lineItem.setTaxId(taxID);
|
||||||
|
}
|
||||||
|
} catch (PluginException e) {
|
||||||
|
logger.info("│ ├── failed to compute taxId: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
return lineItem;
|
return lineItem;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,9 @@ public class ZohoBillItem {
|
||||||
private double rate;
|
private double rate;
|
||||||
private double quantity;
|
private double quantity;
|
||||||
|
|
||||||
|
@JsonbProperty("tax_id")
|
||||||
|
private String taxId;
|
||||||
|
|
||||||
@JsonbProperty("account_id")
|
@JsonbProperty("account_id")
|
||||||
private String accountId;
|
private String accountId;
|
||||||
|
|
||||||
|
|
@ -53,4 +56,12 @@ public class ZohoBillItem {
|
||||||
this.quantity = quantity;
|
this.quantity = quantity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTaxId() {
|
||||||
|
return taxId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaxId(String taxId) {
|
||||||
|
this.taxId = taxId;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.alexanderlogistics.zoho.dto;
|
||||||
|
|
||||||
|
import jakarta.json.bind.annotation.JsonbProperty;
|
||||||
|
|
||||||
|
public class ZohoTax {
|
||||||
|
|
||||||
|
@JsonbProperty("tax_id")
|
||||||
|
private String taxId;
|
||||||
|
|
||||||
|
@JsonbProperty("tax_factor")
|
||||||
|
private float rate;
|
||||||
|
|
||||||
|
@JsonbProperty("tax_name")
|
||||||
|
private String taxName;
|
||||||
|
|
||||||
|
@JsonbProperty("tax_type")
|
||||||
|
private String taxType;
|
||||||
|
|
||||||
|
// Weitere Felder nach Bedarf
|
||||||
|
|
||||||
|
// Getter und Setter
|
||||||
|
public String getTaxId() {
|
||||||
|
return taxId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaxId(String taxId) {
|
||||||
|
this.taxId = taxId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTaxName() {
|
||||||
|
return taxName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaxName(String companyName) {
|
||||||
|
this.taxName = companyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTaxType() {
|
||||||
|
return taxType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaxType(String contactType) {
|
||||||
|
this.taxType = contactType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getRate() {
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRate(float rate) {
|
||||||
|
this.rate = rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.alexanderlogistics.zoho.dto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import jakarta.json.bind.annotation.JsonbProperty;
|
||||||
|
|
||||||
|
public class ZohoTaxListResponse {
|
||||||
|
@JsonbProperty("code")
|
||||||
|
private int code;
|
||||||
|
|
||||||
|
@JsonbProperty("message")
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
@JsonbProperty("taxes")
|
||||||
|
private List<ZohoTax> taxes;
|
||||||
|
|
||||||
|
// Getter und Setter
|
||||||
|
public int getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCode(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ZohoTax> getTaxes() {
|
||||||
|
return taxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaxes(List<ZohoTax> taxes) {
|
||||||
|
this.taxes = taxes;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue