Ver Fonte

chart added on app main and various bugs fixed

robert há 8 anos atrás
pai
commit
d8e42c6269

+ 4 - 1
.bowerrc

@@ -1,3 +1,6 @@
 {
-  "directory": "www/lib"
+  "directory": "www/lib",
+  "resolvers": [
+    "bower-npm-resolver"
+  ]
 }

+ 3 - 1
bower.json

@@ -12,6 +12,8 @@
     "squel": "^5.3.3",
     "ngstorage": "^0.3.11",
     "ti-segmented-control": "^0.0.2",
-    "ion-autocomplete": "^0.3.2"
+    "ion-autocomplete": "^0.3.2",
+    "angular-chart.js": "^1.0.2",
+    "tc-angular-chartjs": "^2.1.2"
   }
 }

+ 4 - 0
www/index.html

@@ -37,6 +37,7 @@
   <script src="js/factories/utils.factory.js"></script>
   <script src="js/factories/odoo.factory.js"></script>
   <script src="js/factories/database.factory.js"></script>
+  <script src="js/factories/chart.factory.js"></script>
   <script src="js/factories/sales/customer.storage.factory.js"></script>
   <script src="js/factories/sales/customer.sync.factory.js"></script>
   <script src="js/factories/sales/lead.storage.factory.js"></script>
@@ -45,6 +46,7 @@
   <script src="js/factories/sales/crm.stage.sync.factory.js"></script>
   <script src="js/factories/sales/opportunity.storage.factory.js"></script>
   <script src="js/factories/sales/opportunity.sync.factory.js"></script>
+  <script src="js/factories/deps.resolver.factory.js"></script>
 
   <!-- 3rd Party -->
   <!-- CSS -->
@@ -60,6 +62,8 @@
   <script src="lib/angular-xmlrpc/xmlrpc.js"></script>
   <script src="lib/squel/dist/squel-basic.js"></script>
   <script src="lib/ngstorage/ngStorage.js"></script>
+  <script src="lib/chart.js/dist/Chart.js"></script>
+  <script src="lib/tc-angular-chartjs/dist/tc-angular-chartjs.js"></script>
 
 </head>
 

+ 1 - 0
www/js/app.js

@@ -5,6 +5,7 @@ angular.module(
         'xml-rpc',
         'ngCordova',
         'ngStorage',
+        'tc.chartjs',
         'ion-autocomplete',
         'ti-segmented-control',
         'jett.ionic.filter.bar',

+ 6 - 3
www/js/controllers/configuration.controller.js

@@ -14,11 +14,12 @@ angular.module('odoo')
         $ionicPopup,
         $localStorage,
         odooFactory,
+        deviceFactory,
         databaseFactory
     ) {
         $scope.loading = false;
         $scope.configuration = $localStorage.$default({
-            host: '192.168.2.105',
+            host: '192.168.88.132',
             port: 8069,
             database: 'odoo',
             username: 'admin',
@@ -52,13 +53,15 @@ angular.module('odoo')
                     });
 
                 }, function (readErr) {
-                    $scope.loading = false;
                     console.log(readErr);
+                    $scope.loading = false;
+                    deviceFactory.toast('No se ha podido identificar al usuario');
                 });
 
             }, function (err) {
-                $scope.loading = false;
                 console.log(err);
+                $scope.loading = false;
+                deviceFactory.toast('No se ha podido establecer una conexión al servidor');
             });
         }
     });

+ 2 - 0
www/js/controllers/customer.controller.js

@@ -127,6 +127,8 @@ angular.module('odoo')
          */
         $scope.getCustomers = function (success, error) {
             sqlFactory.selectByConstraint('partner', 'customer = 1 AND modified != 2', function (customers) {
+                console.log(customers);
+                
                 $scope.customers = [];
 
                 for (var i = 0; i < customers.length; i++) {

+ 2 - 2
www/js/controllers/lead.controller.js

@@ -12,7 +12,7 @@ angular.module('odoo')
         leadsRemoteFactory,
         leadsStorageFactory,
         opportunitiesStorageFactory,
-        customersRemoteFactory,
+        customersStorageFactory,
         sqlFactory,
         deviceFactory
     ) {
@@ -134,7 +134,7 @@ angular.module('odoo')
         $scope.getCustomersSuggestions = function (query) {
             var defer = $q.defer();
 
-            customersRemoteFactory.getAll(function (customers) { 
+            customersStorageFactory.getAll(function (customers) { 
                 defer.resolve(customers.filter(function (item) {
                     return item.name.toLowerCase().indexOf(query) != -1 ? item : null; 
                 }));

+ 25 - 4
www/js/controllers/main.controller.js

@@ -1,7 +1,28 @@
 angular.module('odoo')
 
-.controller('MainController', function ($scope) {
-    $scope.$on('device.shaked', function () { 
-        console.log('Shake move it !!!')
+    .controller('MainController', function ($scope, ChartFactory) {
+        $scope.selectedYear = 2016;
+        $scope.bar = {};
+        $scope.doughnut = {};
+
+        $scope.$on('device.shaked', function () { 
+            $scope.createCharts();
+        });
+
+        $scope.$on('$ionicView.enter', function () {
+            $scope.createCharts();
+        });
+
+        /**
+         *
+         */
+        $scope.createCharts = function () {
+            ChartFactory.leadsVsOpportunitiesBar(function (result) {
+                $scope.bar = result;
+            });
+
+            ChartFactory.opportunitiesCounterDoughnut(function (result) {
+                $scope.doughnut = result;
+            });
+        }
     });
-});

+ 13 - 13
www/js/controllers/opportunity.controller.js

@@ -14,7 +14,7 @@ angular.module('odoo')
         deviceFactory,
         crmStagesDataFactory,
         opportunitiesDataFactory,
-        customersRemoteFactory
+        customersStorageFactory
     ) {
 
         // =======================================================================================================
@@ -68,7 +68,6 @@ angular.module('odoo')
          *
          */
         $scope.$on('$ionicView.enter', function () {
-            console.log($stateParams);
             $scope.initialize();
         });
 
@@ -89,7 +88,6 @@ angular.module('odoo')
 
                 $scope.slider.updateLoop();
                 $scope.getOpportunities(function (opportunities) {
-
                     $scope.loading = false;
                     $scope.groupOpportunities();
 
@@ -135,16 +133,18 @@ angular.module('odoo')
                 success(opportunities);
             }, function (syncErr) {
                 opportunitiesDataFactory.getAll(function (opportunities) {
-                    $scope.opportunities = opportunities.filter(function (item) {
-                        if ($routeParams.id) {
-                            return item.partner_id == $routeParams.id;
-                        } else {
-                            return true;
-                        }
-                    });
+                    $scope.opportunities = opportunities;
+                    // $scope.opportunities = opportunities.filter(function (item) {
+                    //     if ($routeParams.id) {
+                    //         return item.partner_id == $routeParams.id;
+                    //     } else {
+                    //         return true;
+                    //     }
+                    // });
 
                     success(opportunities);
                 }, function (getAllErr) {
+                    console.log(getAllErr);
                     error(getAllErr);
                 });
             });
@@ -155,7 +155,7 @@ angular.module('odoo')
          */
         $scope.groupOpportunities = function () {
             $scope.groupedOpportunities = $scope.opportunities.filter(function (item) {
-                return item.stage_id == $scope.stage.current.remote_id;
+                return angular.isArray(item.stage_id) ? item.stage_id[0] == $scope.stage.current.remote_id : item.stage_id == $scope.stage.current.remote_id;
             });
         }
 
@@ -173,7 +173,7 @@ angular.module('odoo')
          */
         $scope.toogleNew = function () {
             if ($scope.stages.length > 0) {
-                $scope.opportunity.stage_id = $scope.opportunity.stage_id || $scope.stages[0].id;
+                $scope.opportunity.stage_id = $scope.opportunity.stage_id || $scope.stages[0].remote_id;
             }
 
             $scope.modal.show();
@@ -185,7 +185,7 @@ angular.module('odoo')
         $scope.getCustomersSuggestions = function (query) {
             var defer = $q.defer();
 
-            customersRemoteFactory.getAll(function (customers) { 
+            customersStorageFactory.getAll(function (customers) { 
                 defer.resolve(customers.filter(function (item) {
                     return item.name.toLowerCase().indexOf(query) != -1 && item.remote_id != 0 ? item : null; 
                 }));

+ 1 - 1
www/js/factories/database.factory.js

@@ -101,7 +101,7 @@ angular.module('odoo')
                 asyncLoopFactory(maps.length, function (loop) {
                     var map = maps[loop.iteration()];
                     var sql = buildCreateStatement(map.table, map.model);
-
+                    
                     db.executeSql(sql, [], function (result) {
                         console.log(result);
                         loop.next();

+ 1 - 0
www/js/factories/sales/crm.stage.sync.factory.js

@@ -79,6 +79,7 @@ angular.module('odoo')
                         delete data.id;
 
                         crmStagesStorageFactory.save(data, function (stageId) {
+                            data.id = stageId;
                             loop.next();
                         }, function (saveErr) {
                             console.log(saveErr);

+ 43 - 0
www/js/factories/sales/customer.storage.factory.js

@@ -84,6 +84,47 @@ angular.module('odoo')
             });
         };
 
+        /**
+         *
+         */
+        var get = function (id, success, error) {
+            var query = squel.select()
+                .from('partner')
+                .where('id = ?', id)
+                .toParam();
+            
+            db.executeSql(query.text, query.values, function (result) {
+                if (result.rows.length == 0) {
+                    return success({});
+                }
+
+                success(result.rows.item(0));
+            }, function (err) {
+                error(err);
+            })
+        }
+
+        /**
+         *
+         */
+        var getAll = function (success, error) {
+            var query = squel.select()
+                .from('partner')
+                .toParam();
+            
+            db.executeSql(query.text, query.values, function (result) {
+                var data = [];
+
+                for (var i = 0; i < result.rows.length; i++) {
+                    data.push(result.rows.item(i));
+                }
+
+                success(data);
+            }, function (err) { 
+                error(err);
+            });
+        }
+
         /**
          *
          */
@@ -128,6 +169,8 @@ angular.module('odoo')
 
         return {
             save: save,
+            get: get,
+            getAll: getAll,
             remove: remove,
             removeAll: removeAll
         }

+ 6 - 2
www/js/factories/sales/lead.storage.factory.js

@@ -12,7 +12,7 @@ angular.module('odoo')
          */
         var save = function (data, success, error) {
             var query = null;
-
+            
             if (data.id) {
                 query = squel.update()
                     .table('crm_lead')
@@ -60,12 +60,14 @@ angular.module('odoo')
                     .set('user_id', angular.isArray(data.user_id) ? data.user_id[0] : configuration.id)
                     .set('user_login', data.user_login ? data.user_login : configuration.user)
                     .set('partner_id', data.partner_id ? data.partner_id : 0)
+                    .set('create_date', squel.str("datetime('now')"))
                     .toParam();
             }
 
             db.executeSql(query.text, query.values, function (result) {
                 success(query.text.startsWith('INSERT') ? result.insertId : data.id);
             }, function (err) {
+                console.log(err);
                 error(err);
             });
         }
@@ -80,7 +82,7 @@ angular.module('odoo')
                 query = squel.update()
                     .table('crm_lead')
                     .set('modified', 2)
-                    .set('id = ?', data.id)
+                    .where('id = ?', data.id)
                     .toParam();
             } else {
                 query = squel.delete()
@@ -89,6 +91,8 @@ angular.module('odoo')
                     .toParam();
             }
 
+            console.log(query);
+
             db.executeSql(query.text, query.values, function (result) {
                 success(result.rowsAffected);
             }, function (err) {

+ 22 - 45
www/js/factories/sales/lead.sync.factory.js

@@ -5,8 +5,7 @@ angular.module('odoo')
      */
     .factory('leadsRemoteFactory', function (
         leadsStorageFactory,
-        customersRemoteFactory,
-        customersStorageFactory,
+        depsRevolverFactory,
         odooFactory,
         sqlFactory,
         asyncLoopFactory
@@ -38,10 +37,10 @@ angular.module('odoo')
          *
          */
         var push = function (id, data, success, error) {
-            checkCustomer(data, function (customerRemoteId) {
+            depsRevolverFactory.checkCustomer(data, function (customerRemoteId) {
                 data.partner_id = customerRemoteId;
-                
-                 // Avoid odoo server warning message
+
+                // Avoid odoo server warning message
                 delete data.id;
                 delete data.remote_id;
                 delete data.modified;
@@ -61,7 +60,7 @@ angular.module('odoo')
                             if (localDate > remoteDate) {
 
                                 odooFactory.write('crm.lead', id, data, function (response) {
-                                    console.log(response);
+                                    success(response);
                                 }, function (odooErr) {
                                     console.log(odooErr);
                                     error(odooErr);
@@ -86,6 +85,7 @@ angular.module('odoo')
                     odooFactory.create('crm.lead', data, function (response) {
                         success(response);
                     }, function (odooErr) {
+                        console.log(odooErr);
                         error(odooErr);
                     });
 
@@ -94,38 +94,7 @@ angular.module('odoo')
                 error(err);
             });
         }
-
-        /**
-         *
-         */
-        var checkCustomer = function (data, success, error) {
-            if (data.partner_id == 0) {
-                return success(0);
-            }
-
-            sqlFactory.selectById('partner', data.partner_id, function (row) { 
-                var customer = row.item(0);
-
-                if (customer.partner_id == 0) {
-                    customersRemoteFactory.push(null, customer, function (remoteId) {
-                        customer.remote_id = remoteId;
-
-                        customersStorageFactory.save(customer, function (customerId) { 
-                            success(remoteId);
-                        }, function (err) {
-                            error(err);
-                        });
-                    }, function (err) {
-                         error(err);
-                    });
-                } else {
-                    success(customer.partner_id);
-                }
-            }, function (err) {
-                error(err);
-            });
-        }
-
+        
         /**
          *
          */
@@ -142,8 +111,8 @@ angular.module('odoo')
         /**
          *
          */
-        var get = function (contraint, success, error) {
-            sqlFactory.selectByConstraint('crm_lead', contraint, function (leads) {
+        var get = function (constraint, success, error) {
+            sqlFactory.selectByConstraint('crm_lead', constraint, function (leads) {
                 success(leads);
             }, function (err) {
                 error(err);
@@ -231,12 +200,20 @@ angular.module('odoo')
                         data.remote_id = data.id;
                         delete data.id;
 
-                        leadsStorageFactory.save(data, function (leadId) {
-                            loop.next();
-                        }, function (saveErr) {
+                        depsRevolverFactory.resolveCustomer(data.partner_id, function (customerId) {
+                            data.partner_id = customerId;
+
+                            leadsStorageFactory.save(data, function (leadId) {
+                                data.id = leadId;
+                                loop.next();
+                            }, function (saveErr) {
+                                console.log(saveErr);
+                                loop.next();
+                            });
+                        }, function (err) {
                             loop.next();
                         });
-
+                        
                         // end loop
                     }, function () {
                         success(leads);
@@ -262,7 +239,7 @@ angular.module('odoo')
 
                     console.log("leads --> updated data ok");
                     syncDeletedData(function () {
-
+                        
                         console.log("leads -> deleted data ok");
                         downloadSyncData(function (data) {
 

+ 17 - 3
www/js/factories/sales/opportunity.sync.factory.js

@@ -8,6 +8,7 @@ angular.module('odoo')
     .factory('opportunitiesDataFactory', function (
         opportunitiesStorageFactory,
         leadsRemoteFactory,
+        depsRevolverFactory,
         odooFactory,
         sqlFactory,
         asyncLoopFactory
@@ -39,6 +40,8 @@ angular.module('odoo')
          *
          */
         var push = function (id, data, success, error) {
+            delete data.user_email;
+
             leadsRemoteFactory.push(id, data, function (response) {
                 success(response);
             }, function (err) {
@@ -150,9 +153,12 @@ angular.module('odoo')
                 asyncLoopFactory(updatedOpportunities.length, function (loop) {
                     var data = updatedOpportunities.item(loop.iteration());
 
+                    console.log(data);
                     push(data.remote_id, data, function (response) {
+                        console.log(response);
                         loop.next();
                     }, function (pushErr) {
+                        console.log(pushErr);
                         loop.next();
                     });
 
@@ -200,9 +206,17 @@ angular.module('odoo')
                         data.remote_id = data.id;
                         delete data.id;
 
-                        opportunitiesStorageFactory.save(data, function (opportunityId) {
-                            loop.next();
-                        }, function (saveErr) {
+                        depsRevolverFactory.resolveCustomer(data.partner_id, function (customerId) {
+                            data.partner_id = customerId;
+
+                            opportunitiesStorageFactory.save(data, function (opportunityId) {
+                                data.id = opportunityId;
+                                loop.next();
+                            }, function (saveErr) {
+                                loop.next();
+                            });
+                            
+                        }, function (err) {
                             loop.next();
                         });
 

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 1
www/templates/main.html


+ 4 - 4
www/templates/menu.html

@@ -19,10 +19,10 @@
         </ion-header-bar>
         <ion-content>
             <ion-list>
-                <ion-item menu-close class="item-icon-left" ui-sref="app.main" ui-sref-active="active"><i class="icon ion-home positive" style="font-size:22px"></i> Inicio</ion-item>
-                <ion-item menu-close class="item-icon-left" ui-sref="app.sales" ui-sref-active="active"><i class="icon ion-pricetag positive" style="font-size:22px"></i> Ventas</ion-item>
-                <ion-item menu-close class="item-icon-left" ui-sref-active="active"><i class="icon ion-briefcase positive" style="font-size:22px"></i> Proyectos</ion-item>
-                <ion-item menu-close class="item-icon-left" ui-sref="app.preferences" ui-sref-active="active"><i class="icon ion-settings positive" style="font-size:22px"></i> Preferencias</ion-item>
+                <ion-item menu-close class="item-icon-left" ui-sref="app.main"><i class="icon ion-home positive" style="font-size:22px"></i> Inicio</ion-item>
+                <ion-item menu-close class="item-icon-left" ui-sref="app.sales"><i class="icon ion-pricetag positive" style="font-size:22px"></i> Ventas</ion-item>
+                <ion-item menu-close class="item-icon-left"><i class="icon ion-briefcase positive" style="font-size:22px"></i> Proyectos</ion-item>
+                <ion-item menu-close class="item-icon-left" ui-sref="app.preferences"><i class="icon ion-settings positive" style="font-size:22px"></i> Preferencias</ion-item>
             </ion-list>
         </ion-content>
     </ion-side-menu>

+ 3 - 3
www/templates/sales/customers.html

@@ -16,9 +16,9 @@
                     <a href="#" class="subdued button button-small button-light">{{ c.phonecall_count || 0 }} Llamadas</a>
                 </p>
                 <h2><strong>{{ c.name }}</strong></h2>
-                <p><strong>Teléfono:</strong> {{ c.phone }}</p>
-                <p><strong>Celular:</strong> {{ c.mobile }}</p>
-                <p><strong>Email:</strong> {{ c.email }}</p>
+                <p><strong>Teléfono:</strong>&nbsp;{{ c.phone }}</p>
+                <p><strong>Celular:</strong>&nbsp;{{ c.mobile }}</p>
+                <p><strong>Email:</strong>&nbsp;{{ c.email }}</p>
               
             </ion-item>
         </ion-list>

+ 1 - 1
www/templates/sales/lead.html

@@ -10,7 +10,7 @@
             <div class="list">
                 <label class="item item-input item-stacked-label">
                     <span class="input-label">Cliente</span>
-                    <input ion-autocomplete readonly type="text" name="name" class="ion-autocomplete" autocomplete="off" max-selected-items="1" items-method="getCustomersSuggestions(query)" placeholder="Buscar cliente" select-items-label="Seleccione un cliente" selected-items-label="Cliente:" ng-model="lead.partner_id" item-view-value-key="name" item-value-key="remote_id" items-clicked-method="selectCustomer(callback)" items-removed-method="deselectCustomer(callback)">
+                    <input ion-autocomplete readonly type="text" name="name" class="ion-autocomplete" autocomplete="off" max-selected-items="1" items-method="getCustomersSuggestions(query)" placeholder="Buscar cliente" select-items-label="Seleccione un cliente" selected-items-label="Cliente:" ng-model="lead.partner_id" item-view-value-key="name" item-value-key="id" items-clicked-method="selectCustomer(callback)" items-removed-method="deselectCustomer(callback)">
                 </label>
                 <label class="item item-input item-stacked-label">
                     <span class="input-label">Asunto</span>

+ 3 - 3
www/templates/sales/opportunities.html

@@ -22,9 +22,9 @@
 
                         <ion-item on-hold="openOptions($index)" ng-class="{'holded': selectedIndex == $index }" ng-repeat="o in groupedOpportunities">
                             <h2><strong>{{ o.name | uppercase }}</strong></h2>
-                            <p><strong>Contacto:</strong> {{ o.contact_name || '' }}</p>
-                            <p><strong>Teléfono:</strong> {{ o.phone || '' }}</p>
-                            <p><strong>Móvil:</strong> {{ o.mobile || '' }}</p>
+                            <p><strong>Contacto:</strong>&nbsp;{{ o.contact_name || '' }}</p>
+                            <p><strong>Teléfono:</strong>&nbsp;{{ o.phone || '' }}</p>
+                            <p><strong>Móvil:</strong>&nbsp;{{ o.mobile || '' }}</p>
                         </ion-item>
 
                     </ion-list>

+ 2 - 2
www/templates/sales/opportunity.html

@@ -12,11 +12,11 @@
                     <div class="input-label">
                         Estado
                     </div>
-                    <select ng-model="opportunity.stage_id" ng-options="s.id as s.name | translate for s in stages"></select>
+                    <select ng-model="opportunity.stage_id" ng-options="s.remote_id as s.name | translate for s in stages"></select>
                 </label>
                 <label class="item item-input item-stacked-label">
                     <span class="input-label">Cliente</span>
-                    <input ion-autocomplete readonly type="text" name="name" class="ion-autocomplete" autocomplete="off" max-selected-items="1" items-method="getCustomersSuggestions(query)" placeholder="Buscar cliente" select-items-label="Seleccione un cliente" selected-items-label="Cliente:" ng-model="opportunity.partner_id" item-view-value-key="name" item-value-key="remote_id" items-clicked-method="selectCustomer(callback)" items-removed-method="deselectCustomer(callback)">
+                    <input ion-autocomplete readonly type="text" name="name" class="ion-autocomplete" autocomplete="off" max-selected-items="1" items-method="getCustomersSuggestions(query)" placeholder="Buscar cliente" select-items-label="Seleccione un cliente" selected-items-label="Cliente:" ng-model="opportunity.partner_id" item-view-value-key="name" item-value-key="id" items-clicked-method="selectCustomer(callback)" items-removed-method="deselectCustomer(callback)">
                 </label>
                 <label class="item item-input item-stacked-label">
                     <span class="input-label">Asunto</span>

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff