Ver Fonte

data grouped by type for best performance

robert2206 há 8 anos atrás
pai
commit
967070315e

+ 1 - 0
package.json

@@ -22,6 +22,7 @@
     "@ionic/storage": "1.1.7",
     "angular2-odoo-jsonrpc": "0.0.7",
     "app-root-path": "^2.0.1",
+    "async": "^2.1.5",
     "glob": "^7.1.1",
     "ionic-angular": "2.0.0",
     "ionic-native": "2.4.1",

+ 3 - 0
src/app/app.module.ts

@@ -11,6 +11,7 @@ import { ODetailHeader } from "../components/odetail-header/odetail-header";
 // Pages
 import { LoginPage } from "../pages/login/login";
 import { HomePage } from "../pages/home/home";
+import { CustomersPage } from "../pages/customers/customers";
 import { ProductsPage } from "../pages/products/products";
 import { OrdersPage } from "../pages/orders/orders";
 import { ToolsPage } from "../pages/tools/tools";
@@ -35,6 +36,7 @@ import { DoubleTap } from "../directives/double-tap";
         // Pages
         LoginPage,
         HomePage,
+        CustomersPage,
         ProductsPage,
         OrdersPage,
         ToolsPage,
@@ -57,6 +59,7 @@ import { DoubleTap } from "../directives/double-tap";
         MyApp,
         LoginPage,
         HomePage,
+        CustomersPage,
         ProductsPage,
         OrdersPage,
         ToolsPage,

+ 3 - 0
src/enums/record-types.ts

@@ -0,0 +1,3 @@
+export const enum RecordTypes {
+    
+}

+ 10 - 0
src/odoo/collections/field-metadata.ts

@@ -1,4 +1,5 @@
 import { ModelMetadataCollection } from "../collections/model-metadata";
+import { OdooFieldMetadata } from "../metadata/field-metadata";
 
 export class FieldMetadataCollection<T extends { target?: Function | string, propertyName?: string }> extends ModelMetadataCollection<T> {
 
@@ -24,4 +25,13 @@ export class FieldMetadataCollection<T extends { target?: Function | string, pro
     hasWithProperty(propertyName: string) {
         return !!this.findByProperty(propertyName);
     }
+
+    /**
+     * 
+     */
+    getNames() {
+        return this.items.map((i: any) => {
+            return i.fieldName;
+        });
+    }
 }

+ 2 - 1
src/odoo/decorators/model.ts

@@ -4,11 +4,12 @@ import { OdooModelMetadata } from "../metadata/model-metadata";
 /**
  *
  */
-export function OdooModel(name: string) {
+export function OdooModel(name: string, domain?: any) {
     return function (target: Function) {
         const args: OdooModelMetadata = {
             target: target,
             name: name,
+            domain: domain ? domain : [],
             document: name.replace(/\./g, "_")
         }
 

+ 1 - 0
src/odoo/metadata/model-metadata.ts

@@ -2,5 +2,6 @@ export interface OdooModelMetadata {
 
     readonly target: Function | string;
     readonly name: string;
+    readonly domain: any;
     readonly document: string;
 }

+ 19 - 1
src/odoo/models/customer.ts

@@ -2,7 +2,7 @@ import { OdooModel } from "../decorators/model";
 import { OdooField } from "../decorators/field";
 import { FieldTypes } from "../types/field";
 
-@OdooModel("res.partner")
+@OdooModel("res.partner", [['customer', '=', true], ['active', '=', true]])
 export class Customer {
 
     @OdooField(FieldTypes.CHAR)
@@ -11,6 +11,24 @@ export class Customer {
     @OdooField(FieldTypes.CHAR)
     city: string;
 
+    @OdooField(FieldTypes.CHAR)
+    email: string;
+
+    @OdooField(FieldTypes.CHAR)
+    fax: string;
+
     @OdooField(FieldTypes.CHAR)
     mobile: string;
+
+    @OdooField(FieldTypes.BINARY)
+    image_medium: string;
+
+    @OdooField(FieldTypes.INTEGER)    
+    opportunity_count: number;
+
+    @OdooField(FieldTypes.FLOAT)
+    partner_latitude: number;
+
+    @OdooField(FieldTypes.FLOAT)
+    partner_longitude: number;
 }

+ 34 - 1
src/odoo/models/product.ts

@@ -2,9 +2,42 @@ import { OdooModel } from "../decorators/model";
 import { OdooField } from "../decorators/field";
 import { FieldTypes } from "../types/field";
 
-@OdooModel('product.template')
+@OdooModel('product.template', [['sale_ok', '=', true], ['active', '=', 'true']])
 export class Product {
 
+    @OdooField(FieldTypes.CHAR)
+    default_code: string;
+
+    @OdooField(FieldTypes.CHAR)
+    description: string;
+
+    @OdooField(FieldTypes.CHAR)
+    ean13: string;
+
+    @OdooField(FieldTypes.CHAR)
+    flip_image: string;
+
+    @OdooField(FieldTypes.CHAR)
+    image_medium: string;
+
+    @OdooField(FieldTypes.FLOAT)
+    list_price: number;
+
     @OdooField(FieldTypes.CHAR)
     name: string;
+
+    @OdooField(FieldTypes.FLOAT)
+    price: number;
+
+    @OdooField(FieldTypes.ONE2MANY)
+    product_variant_ids: any;
+
+    @OdooField(FieldTypes.FLOAT)
+    qty_available: number;
+
+    @OdooField(FieldTypes.FLOAT)
+    standard_price: number;
+
+    @OdooField(FieldTypes.SELECTION)
+    state: any;
 }

+ 7 - 9
src/pages/customers/customers.html

@@ -1,14 +1,12 @@
-<!--
-  Generated template for the Customers page.
-
-  See http://ionicframework.com/docs/v2/components/#navigation for more info on
-  Ionic pages and navigation.
--->
 <ion-header>
 
-  <ion-navbar>
-    <ion-title>customers</ion-title>
-  </ion-navbar>
+	<ion-navbar>
+		<button ion-button menuToggle>
+            <ion-icon name="menu"></ion-icon>
+        </button>
+		
+    	<ion-title>Clientes</ion-title>
+  	</ion-navbar>
 
 </ion-header>
 

+ 23 - 13
src/pages/customers/customers.ts

@@ -1,22 +1,32 @@
-import { Component } from '@angular/core';
-import { NavController, NavParams } from 'ionic-angular';
+import { Component } from "@angular/core";
+import { NavController, NavParams } from "ionic-angular";
 
-/*
-  Generated class for the Customers page.
+import { PouchService } from "../../services/pouch-service";
 
-  See http://ionicframework.com/docs/v2/components/#navigation for more info on
-  Ionic pages and navigation.
-*/
 @Component({
-  selector: 'page-customers',
-  templateUrl: 'customers.html'
+    selector: 'page-customers',
+    templateUrl: 'customers.html'
 })
 export class CustomersPage {
 
-  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+    constructor(
+        public navCtrl: NavController,
+        public navParams: NavParams,
+        public pouch: PouchService
+    ) { }
 
-  ionViewDidLoad() {
-    console.log('ionViewDidLoad CustomersPage');
-  }
+    ionViewDidLoad() {
+        console.log('ionViewDidLoad CustomersPage');
 
+        this.loadCustomers();
+    }
+
+    /**
+     * 
+     */
+    loadCustomers(): void {
+        this.pouch.getAll('res.partner').subscribe(results => { 
+            console.log(results.docs.shift().records);
+        });
+    }
 }

+ 6 - 9
src/services/pouch-service.ts

@@ -30,7 +30,7 @@ export class PouchService {
 
         return Observable.fromPromise(this.pouchDB.createIndex({
             index: {
-                fields: ['type']
+                fields: ['odoo_model']
             }
         }));
     }
@@ -39,13 +39,10 @@ export class PouchService {
      *
      */
     save(data: any): Observable<any> {
-        if (!data.type) {
-            return Observable.throw("Error: Cannot save data without type");
+        if (!data.odoo_model) {
+            return Observable.throw("Error: Cannot save data without model name");
         }
 
-        delete data.__last_update;
-        
-
         return Observable.fromPromise(this.pouchDB.post(data));
     }
 
@@ -81,11 +78,11 @@ export class PouchService {
     /**
      *
      */
-    getAll(type: string): Observable<any> {
+    getAll(odoo_model: string): Observable<any> {
         return Observable.fromPromise(this.pouchDB.find({
             selector: {
-                type: {
-                    $eq: type
+                odoo_model: {
+                    $eq: odoo_model
                 }
             }
         }));

+ 17 - 16
src/services/sync-service.ts

@@ -1,5 +1,6 @@
 import { Injectable } from "@angular/core";
 import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
 
 import { PouchService } from "./pouch-service";
 import { OdooService } from "../services/odoo-service";
@@ -16,6 +17,7 @@ import "rxjs/add/operator/map";
 import "rxjs/add/operator/groupBy";
 import "rxjs/add/operator/mergeAll";
 
+
 @Injectable()
 export class SyncService {
 
@@ -67,28 +69,27 @@ export class SyncService {
      */
     protected download(): Observable<any> {
         return this.getModels()
-            .concatMap(item => this.odoo.searchRead(item.model.name, []).map(r => {
-                return Object.assign(r, { type: item.model.document });
+            .concatMap(item => this.odoo.searchRead(item.model.name, item.model.domain, item.fields.getNames())
+            .map(r => {
+                delete r.length;
+
+                return Object.assign(r, {
+                    odoo_model: item.model.name,
+                });
             }))
-            .concatMap(data => this.store(data));
+            .concatMap(data => this.pouch.save(data));
     }
 
     /**
-     *
+     * 
+     * @param data 
      */
-    protected store(data: any): Observable<any> {
-        let type = data.type;
-        let records = data.records;
+    protected test(data?: any) {
+        console.log(data);
         
-        return Observable.from(records).map((r: any) => {
-            r.remote_id = r.id;
-            delete r.id;
-            
-            return r;
-        }).concatMap(item => this.pouch.save(Object.assign(item, {
-            type: type,
-            doc_status: DocStatus.None
-        })));
+        return Observable.create((o: Observer<any>) => {
+            o.complete();
+        });
     }
 
     /**