Centralized_Reporting_Backend/src/services/integration/integrationService.js

471 lines
14 KiB
JavaScript

const ZohoClient = require('../../integrations/zoho/client');
class IntegrationService {
constructor(userId) {
this.userId = userId;
this.clients = {
zoho: new ZohoClient(userId)
};
}
async getData(provider, service, resource, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
const method = this.getMethodName(service, resource);
if (!client[method]) {
throw new Error(`Resource ${resource} not supported for ${provider} ${service}`);
}
// Handle special cases that require additional parameters
if (method === 'getTasks' && service === 'projects' && params.projectId) {
return await client.getProjectTasks(params.projectId, params);
}
// Handle getAllProjectTasks for projects tasks without projectId
if (method === 'getTasks' && service === 'projects' && !params.projectId) {
return await client.getAllProjectTasks(params);
}
// Handle CRM tasks (no special parameters needed)
if (method === 'getTasks' && service === 'crm') {
return await client[method](params);
}
return await client[method](params);
}
getMethodName(service, resource) {
const resourceMap = {
// CRM
'leads': 'Leads',
'contacts': 'Contacts',
'deals': 'Deals',
'sales_orders': 'SalesOrders',
'purchase_orders': 'PurchaseOrders',
'invoices': 'Invoices',
// People
'employees': 'Employees',
'departments': 'Departments',
'timesheets': 'Timesheets',
'leave_requests': 'LeaveRequests',
'attendance': 'Attendance',
// Books
'organizations': 'Organizations',
'customers': 'Customers',
'vendors': 'Vendors',
'items': 'Items',
'estimates': 'Estimates',
'bills': 'Bills',
'expenses': 'Expenses',
'bank_accounts': 'BankAccounts',
'bank_transactions': 'BankTransactions',
'reports': 'Reports',
// Projects
'projects': 'Projects',
'tasks': 'Tasks'
};
const resourceName = resourceMap[resource] || resource;
return `get${resourceName}`;
}
async getAvailableServices(provider) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
return client.getAvailableServices();
}
async getAvailableResources(provider, service) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
return client.getAvailableResources(service);
}
async getPortals(provider) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Portals are only available for Zoho provider');
}
return await client.getPortals();
}
async getAllProjects(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('All projects are only available for Zoho provider');
}
return await client.getAllProjects(params);
}
async getAllProjectTasks(provider, portalId, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('All project tasks are only available for Zoho provider');
}
return await client.getAllProjectTasks(portalId, params);
}
async getAllProjectTaskLists(provider, portalId, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('All project task lists are only available for Zoho provider');
}
return await client.getAllProjectTaskLists(portalId, params);
}
async getAllProjectIssues(provider, portalId, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('All project issues are only available for Zoho provider');
}
return await client.getAllProjectIssues(portalId, params);
}
async getAllProjectPhases(provider, portalId, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('All project phases are only available for Zoho provider');
}
return await client.getAllProjectPhases(portalId, params);
}
async getSalesOrders(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Sales Orders are only available for Zoho provider');
}
return await client.getSalesOrders(params);
}
async getPurchaseOrders(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Purchase Orders are only available for Zoho provider');
}
return await client.getPurchaseOrders(params);
}
async getInvoices(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Invoices are only available for Zoho provider');
}
return await client.getInvoices(params);
}
// Zoho People specific methods
async getDepartments(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Departments are only available for Zoho provider');
}
return await client.getDepartments(params);
}
async getLeaveRequests(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Leave Requests are only available for Zoho provider');
}
return await client.getLeaveRequests(params);
}
async getAttendance(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Attendance is only available for Zoho provider');
}
return await client.getAttendance(params);
}
// Zoho Books specific methods
async getOrganizations(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Organizations are only available for Zoho provider');
}
return await client.getOrganizations(params);
}
async getCustomers(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Customers are only available for Zoho provider');
}
return await client.getCustomers(params);
}
async getVendors(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Vendors are only available for Zoho provider');
}
return await client.getVendors(params);
}
async getItems(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Items are only available for Zoho provider');
}
return await client.getItems(params);
}
async getEstimates(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Estimates are only available for Zoho provider');
}
return await client.getEstimates(params);
}
async getBills(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Bills are only available for Zoho provider');
}
return await client.getBills(params);
}
async getExpenses(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Expenses are only available for Zoho provider');
}
return await client.getExpenses(params);
}
async getBankAccounts(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Bank Accounts are only available for Zoho provider');
}
return await client.getBankAccounts(params);
}
async getBankTransactions(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Bank Transactions are only available for Zoho provider');
}
return await client.getBankTransactions(params);
}
async getReports(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Reports are only available for Zoho provider');
}
return await client.getReports(params);
}
async getBooksSalesOrders(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Books Sales Orders are only available for Zoho provider');
}
return await client.getBooksSalesOrders(params);
}
async getBooksPurchaseOrders(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Books Purchase Orders are only available for Zoho provider');
}
return await client.getBooksPurchaseOrders(params);
}
async getContacts(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Contacts are only available for Zoho provider');
}
return await client.getContacts(params);
}
async getBooksContacts(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Books Contacts are only available for Zoho provider');
}
return await client.getBooksContacts(params);
}
async getBooksInvoices(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Books Invoices are only available for Zoho provider');
}
return await client.getBooksInvoices(params);
}
// Zoho People Forms API methods
async getEmployeeForms(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Employee Forms are only available for Zoho provider');
}
return await client.getEmployeeForms(params);
}
async getEmployeeById(provider, recordId, formLinkName = 'employee') {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Employee Details are only available for Zoho provider');
}
return await client.getEmployeeById(recordId, formLinkName);
}
async getAttendanceEntries(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Attendance Entries are only available for Zoho provider');
}
return await client.getAttendanceEntries(params);
}
async getShiftConfiguration(provider, params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Shift Configuration is only available for Zoho provider');
}
return await client.getShiftConfiguration(params);
}
async getLeaveData(provider, formLinkName = 'leave', params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Leave Data is only available for Zoho provider');
}
return await client.getLeaveData(formLinkName, params);
}
async getGoalsData(provider, formLinkName = 'goals', params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Goals Data is only available for Zoho provider');
}
return await client.getGoalsData(formLinkName, params);
}
async getPerformanceData(provider, formLinkName = 'performance', params = {}) {
const client = this.clients[provider];
if (!client) {
throw new Error(`Provider ${provider} not supported`);
}
if (provider !== 'zoho') {
throw new Error('Performance Data is only available for Zoho provider');
}
return await client.getPerformanceData(formLinkName, params);
}
}
module.exports = IntegrationService;