angular.module('odoo') .factory('leadsRemoteFactory', function (config, odoo, sqlFactory, leadsStorageFactory, asyncLoop) { var server = {}; var local = {}; // Retrieve leads data from server server.retrieve = function (success, error) { config(function (configuration) { odoo.read('crm.lead', [['active', '=', true]], configuration, function (leads) { success(leads); }, function (odooErr) { error(odooErr); }); }, function (configErr) { error(configErr); }); } // Retrieve lead by id server.retrieveById = function (id, success, error) { config(function (configuration) { odoo.read('crm.lead', [['id', '=', id]], configuration, function (response) { success(response); }, function (odooReadErr) { error(odooReadErr) }); }, function (configErr) { error(configErr); }); } // Update leads remote data server.update = function (id, data, success, error) { config(function (configuration) { odoo.write('crm.lead', id, data, configuration, function (response) { success(response); }, function (odooWriteErr) { error(odooWriteErr); }); }, function (configErr) { error(configErr); }); } // Remove lead from server server.remove = function (id, success, error) { config(function (configuration) { odoo.unlink('crm.lead', id, configuration, function (response) { success(response); }, function (odooUnlinkErr) { error(odooUnlinkErr); }); }, function (configErr) { error(configErr); }); } // Create leads on remote data server.send = function (data, success, error) { config(function (configuration) { odoo.create('crm.lead', data, configuration, function (response) { success(response); }, function (odooCreateErr) { error(odooCreateErr); }); }, function (configErr) { error(configErr); }); } // Select leads from local storage local.retrieve = function (contraint, success, error) { sqlFactory.selectByConstraint('lead', contraint, function (leads) { success(leads); }, function (err) { error(err); }); } // Sync leads data between local and remote storage var sync = function (success, error) { local.retrieve('remote_id = 0', function (newLeads) { console.log(newLeads); asyncLoop(newLeads.length, function (loop) { var data = newLeads.item(loop.iteration()); // Avoid odoo server warning message delete data.id; delete data.remote_id; delete data.modified; delete data.modifiedDate; delete data.priority; server.send(data, function (response) { console.log(response); loop.next(); }, function (sendErr) { loop.break(); }); // End loop }, function () { console.log('New data sended success'); local.retrieve('remote_id != 0 AND modified = 1', function (modifiedLeads) { asyncLoop(modifiedLeads.length, function (loop) { var localData = modifiedLeads.item(loop.iteration()); server.retrieveById(localData.remote_id, function (leads) { if (leads.length == 1) { var remoteData = leads[0]; var remoteModifiedDate = new Date(remoteData.__last_update); var localModifiedDate = new Date(localData.modifiedDate); if (localModifiedDate > remoteModifiedDate) { var id = localData.remote_id; // Avoid odoo server warning message delete localData.id; delete localData.remote_id; delete localData.modified; delete localData.modifiedDate; delete localData.priority; server.update(id, localData, function (response) { loop.next(); }, function (updateErr) { console.log(updateErr); loop.next(); }); } else { loop.next(); } } { loop.next(); } }, function (retrieveByIdErr) { console.log(retrieveByIdErr); loop.next(); }); // End loop }, function () { console.log('Modified data sended success'); local.retrieve('remote_id != 0 AND modified = 2', function (deletedLeads) { asyncLoop(deletedLeads.length, function (loop) { var id = deletedLeads.item(loop.iteration()).remote_id; server.remove(id, function (response) { loop.next(); }, function (removeErr) { console.log(removeErr); loop.next(); }); // End loop }, function () { console.log('Remote data deleted success'); server.retrieve(function (updatedLeads) { console.log(updatedLeads); leadsStorageFactory.removeAll(function () { console.log('Removed All'); asyncLoop(updatedLeads.length, function (loop) { var data = updatedLeads[loop.iteration()]; // Set id for save on local database data.remote_id = data.id; delete data.id; leadsStorageFactory.save(data, function (leadId) { loop.next(); }, function (saveLeadErr) { console.log(saveLeadErr); loop.next(); }); // End loop }, function () { console.log('Remote data downloaded success'); success(updatedLeads); }); }, function (removeLeadsErr) { error(removeLeadsErr); }); }, function (retrieveErr) { error(retrieveErr); }); }); }, function (selectErr) { error(selectErr); }); }); }, function (selectErr) { error(selectErr); }); }); }, function (selectErr) { error(selectErr); }); } return { retrieve: server.retrieve, update: server.update, send: server.send, sync: sync } });