void EnviarFctraParaFctpls( Map invoice, Map organization, Map user )
{
// A função já recebe os detalhes da fatura e organização como 'invoice' e 'organization'
// Não precisamos usar zoho.books.getRecordsByID para os dados básicos da fatura.
// Usaremos 'invoice' diretamente.
// 1. Extrair Detalhes da Fatura (diretamente do 'invoice' Map)
invoiceData = invoice; // 'invoice' já é o mapa com os dados da fatura
organizationId = organization.get("organization_id"); // ID da sua organização no Zoho Books
invoiceNumber = invoiceData.get("invoice_number");
invoiceDate = invoiceData.get("date"); // Formato 'YYYY-MM-DD'
dueDate = invoiceData.get("due_date"); // Formato 'YYYY-MM-DD'
reference = invoiceData.get("reference_number"); // Pode usar o número de referência do Zoho Books
currency = invoiceData.get("currency_code");
// observation = invoiceData.get("notes"); // Supondo que 'notes' seja para observações
// ATENÇÃO: Verifique na documentação do Factplus como lidar com 'retention'.
// Se o Zoho Books não tiver um campo direto para 'retention', você pode precisar de lógica extra
// ou definir como "0" se não for aplicável no seu caso.
retention_value = "0";
// Dados do Cliente
customerData = invoiceData.get("customer_details");
clientName = customerData.get("customer_name");
clientNIF = customerData.get("vat_reg_no"); // Assumindo que NIF seja o VAT Registration Number
clientEmail = customerData.get("email");
clientCity = customerData.get("city");
clientAddress = customerData.get("billing_address").get("address"); // Endereço de fatura
clientPostalCode = customerData.get("billing_address").get("zip"); // CEP de fatura
clientCountry = customerData.get("billing_address").get("country"); // País de fatura
// Itens da Fatura
lineItems = invoiceData.get("line_items");
factplusItems = collection(); // Coleção para armazenar os itens formatados para o Factplus
for each item in lineItems
{
// Para itemcode, é ideal usar um ID que seja único e identificável no Factplus.
// item.get("item_id") é o ID interno do Zoho Books, o que pode não ser ideal se o Factplus
// espera um código de item de produto/serviço. Considere usar item.get("name") ou um campo personalizado.
itemCode = item.get("item_id");
description = item.get("description");
price = item.get("rate");
quantity = item.get("quantity");
taxRate = item.get("tax_percentage"); // Taxa de imposto
discount = item.get("discount"); // Desconto por linha de item
// ATENÇÃO: exemption_code e retention por item precisam ser verificados na API do Factplus.
exemptionCode = ""; // Valor padrão, ajuste se tiver campo correspondente
itemRetention = "0"; // Valor padrão, ajuste se tiver campo correspondente
factplusItem = Map();
factplusItem.put("itemcode", itemCode);
factplusItem.put("description", description);
factplusItem.put("price", price);
factplusItem.put("quantity", quantity);
factplusItem.put("tax", taxRate);
factplusItem.put("discount", discount);
factplusItem.put("exemption_code", exemptionCode);
factplusItem.put("retention", itemRetention);
factplusItems.add(factplusItem);
}
// 2. Construir o Objeto JSON para a API do Factplus
// ATENÇÃO: SUBSTITUA 'SUA_CHAVE_API_AQUI' PELA SUA CHAVE DE 32 DÍGITOS DO FACTPLUS
factplusPayload = Map();
factplusPayload.put("apicall", "CREATE");
factplusPayload.put("apikey", "SUA_CHAVE_API_AQUI"); // <-- SUA CHAVE API DO FACTPLUS AQUI!
documentMap = Map();
documentMap.put("type", "factura"); // Tipo de documento, confirme se "factura" é o correto
documentMap.put("date", invoiceDate);
documentMap.put("duedate", dueDate);
documentMap.put("vref", invoiceNumber); // Usando o número da fatura como referência. Verifique se o Factplus aceita este formato.
// A "serie" é crucial. O exemplo do Factplus mostra "2020". Você precisa definir uma série apropriada.
// Se o Zoho Books não tiver um campo para série, pode ser um valor fixo ou derivado.
documentMap.put("serie", "2024"); // <-- ATENÇÃO: Defina a série correta para o Factplus (ex: "2024", "FS_A")
documentMap.put("currency", currency);
documentMap.put("exchange_rate", "0"); // Ajuste se houver taxa de câmbio
// documentMap.put("observation", invoiceData.get("notes")); // Se usar campo de notas
documentMap.put("retention", retention_value);
clientMap = Map();
clientMap.put("name", clientName);
clientMap.put("nif", clientNIF);
clientMap.put("email", clientEmail);
clientMap.put("city", clientCity);
clientMap.put("address", clientAddress);
clientMap.put("postalcode", clientPostalCode);
clientMap.put("country", clientCountry);
factplusPayload.put("document", documentMap);
factplusPayload.put("client", clientMap);
factplusPayload.put("items", factplusItems);
// Converter o mapa Deluge para string JSON
jsonString = factplusPayload.toString();
// 3. Fazer a Chamada HTTP POST para a API do Factplus
// da API do Factplus para a criação de faturas.
// Cabeçalhos (Content-Type é essencial para JSON)
headers = Map();
headers.put("Content-Type", "application/json");
// Executar a chamada API
apiResponse = invokeurl
[
url : factplusAPI_URL
type : POST
headers: headers
content : jsonString
];
// 4. Tratar a Resposta da API
info "Request sent to Factplus: " + jsonString; // Para depuração, mostre o que foi enviado
info "Factplus API Response: " + apiResponse;
// Adicione lógica para verificar a resposta aqui.
// Ex: if (apiResponse.get("status") == "success") { ... }
// ou if (apiResponse.get("code") == 200) { ... }
// Logar erros se a resposta indicar falha e talvez enviar um email de alerta.
if (apiResponse.get("status") == "success") // Supondo que a API retorne um campo 'status'
{
info "Fatura enviada com sucesso para o Factplus!";
// Opcional: Atualizar a fatura no Zoho Books com um campo de status "Enviado para Factplus"
// Ou armazenar o ID de retorno do Factplus.
}
else
{
error "Erro ao enviar fatura para o Factplus: " + apiResponse.get("message"); // Supondo campo 'message'
// Opcional: Enviar email de erro para o cliente ou para o administrador
}
}
===
And
===
// Função para enviar fatura do Zoho Books para o Factplus
// Parâmetro: invoice_id (ID da fatura criada)
invoice_id = input.invoice_id;
// Obter detalhes da fatura do Zoho Books
invoice = zoho.books.getRecordsByID("Invoices", organization_id, invoice_id);
invoice_data = invoice.get("invoice");
// Mapear dados do cliente
customer_id = invoice_data.get("customer_id");
customer = zoho.books.getRecordsByID("Contacts", organization_id, customer_id);
customer_data = customer.get("contact");
client_map = Map();
client_map.put("name", customer_data.get("contact_name"));
client_map.put("nif", customer_data.get("tax_reg_no", ""));
client_map.put("email", customer_data.get("email", ""));
client_map.put("city", customer_data.get("billing_address").get("city", ""));
client_map.put("address", customer_data.get("billing_address").get("address", ""));
client_map.put("postalcode", customer_data.get("billing_address").get("zip", ""));
client_map.put("country", customer_data.get("billing_address").get("country", "Angola"));
// Mapear itens da fatura
items_list = List();
for each item in invoice_data.get("line_items")
{
item_map = Map();
item_map.put("itemcode", item.get("item_id", "ITEM" + item.get("line_item_id")));
item_map.put("description", item.get("name"));
item_map.put("price", item.get("rate").toString());
item_map.put("quantity", item.get("quantity").toString());
item_map.put("tax", "14"); // Ajuste conforme a tributação aplicável
item_map.put("discount", item.get("discount", "0").toString());
item_map.put("exemption_code", "");
item_map.put("retention", "");
item_map.put("unit", "Unidade");
items_list.add(item_map);
}
// Construir o corpo da requisição para o Factplus
payload = Map();
payload.put("apicall", "CREATE");
payload.put("apikey", "SUA_CHAVE_API_FACTPLUS"); // Substitua pela sua chave de API
document_map = Map();
document_map.put("type", "factura");
document_map.put("date", invoice_data.get("date"));
document_map.put("duedate", invoice_data.get("due_date"));
document_map.put("vref", invoice_data.get("invoice_number"));
document_map.put("serie", invoice_data.get("date").left(4)); // Ano da fatura
document_map.put("currency", "AOA");
document_map.put("exchange_rate", "0");
document_map.put("observation", "");
document_map.put("retention", "0");
payload.put("document", document_map);
payload.put("client", client_map);
payload.put("items", items_list);
// Enviar requisição para o Factplus
headers = Map();
headers.put("Content-Type", "application/json");
response = invokeurl
[
type: POST,
parameters: payload.toString(),
headers: headers,
connection: "FactplusAPI"
];
// Logar a resposta para depuração
info response;
===
Any help?
Thanks in advance.