
void automation.generateQuoteFromDeal(int dealId) { deal = zoho.crm.getRecordById("Deals", dealId); if(deal == null) return; amount = deal.get("Amount"); exchangeRate = deal.get("Exchange_Rate"); account = deal.get("Account_Name"); productItem = Map(); productItem.put("product", {"id":"<PRODUCT_ID>"}); productItem.put("quantity", 1); productItem.put("list_price", amount); productList = List(); productList.add(productItem); quoteMap = Map(); quoteMap.put("Subject", "Quote for Deal"); quoteMap.put("Deal_Name", dealId); quoteMap.put("Account_Name", account.get("id")); quoteMap.put("Product_Details", productList); quoteMap.put("Quote_Stage", "Draft"); quoteMap.put("Valid_Till", zoho.currentdate.addDay(7)); quoteMap.put("Quote_Reference_Amount", amount); quoteMap.put("Quote_Exchange_Rate", exchangeRate); zoho.crm.createRecord("Quotes", quoteMap); } |
void automation.reconcileDealFromQuote(Int quoteId) { info "Starting FX reconciliation for Quote ID: " + quoteId; // ------------------------------------------------- // Fetch Quote // ------------------------------------------------- quote = zoho.crm.getRecordById("Quotes", quoteId); if(quote == null) { info "Quote not found"; return; } dealInfo = quote.get("Deal_Name"); if(dealInfo == null) { info "Quote not linked to Deal"; return; } dealId = dealInfo.get("id"); deal = zoho.crm.getRecordById("Deals", dealId); if(deal == null) { info "Deal not found"; return; } // ------------------------------------------------- // Mark FX Evaluation as PENDING // ------------------------------------------------- zoho.crm.updateRecord( "Quotes", quoteId, {"FX_Evaluation_Status" : "Pending"} ); // ------------------------------------------------- // Read required FX inputs // ------------------------------------------------- quotedAmount = quote.get("Quote_Reference_Amount"); quoteRate = quote.get("Quote_Exchange_Rate"); evaluationRate = quote.get("Evaluation_Exchange_Rate"); info "Quoted Amount: " + quotedAmount; info "Quote Rate: " + quoteRate; info "Evaluation Rate: " + evaluationRate; if(quotedAmount == null || quoteRate == null || evaluationRate == null) { info "Missing required FX inputs"; return; } // ------------------------------------------------- // FX Calculations(rounded) // ------------------------------------------------- payableAmount = (quotedAmount * evaluationRate / quoteRate).round(2); fxVariance = (((payableAmount - quotedAmount) / quotedAmount) * 100).round(2); info "Payable Amount: " + payableAmount; info "FX Variance %: " + fxVariance; // ------------------------------------------------- // Decide Quote Stage(Business decision here) // ------------------------------------------------- quoteStage = ""; reconciliationStatus = ""; if(fxVariance <= 10) { quoteStage = "Acceptable FX Impact"; reconciliationStatus = "Accepted"; } else { quoteStage = "FX Impact Exceeds Threshold"; reconciliationStatus = "Renegotiate"; } // ------------------------------------------------- // Update Quote(Final state) // ------------------------------------------------- quoteUpdate = Map(); quoteUpdate.put("Potential_Payable_Amount", payableAmount); quoteUpdate.put("FX_Variance_Percentage", fxVariance); quoteUpdate.put("FX_Evaluation_Status", "Evaluated"); quoteUpdate.put("Quote_Stage", quoteStage); quoteUpdate.put("Recalculate_FX", false); quoteResp = zoho.crm.updateRecord("Quotes", quoteId, quoteUpdate); info "Quote update response:"; info quoteResp; // ------------------------------------------------- // Update Deal // ------------------------------------------------- dealUpdate = Map(); dealUpdate.put("Final_Accepted_Amount", payableAmount); dealUpdate.put("FX_Impact_Percentage", fxVariance); dealUpdate.put("Reconciliation_Status", reconciliationStatus); dealUpdate.put( "Reconciled_On", zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ssXXX") ); dealResp = zoho.crm.updateRecord("Deals", dealId, dealUpdate); info "Deal update response:"; info dealResp; info "FX reconciliation completed successfully"; } |

