Jelajahi Sumber

agregado sincronización de atributos de productos

robert2206 8 tahun lalu
induk
melakukan
7e5998d5b4

+ 1 - 1
src/app/app.component.ts

@@ -22,7 +22,7 @@ import { AboutPage } from '../pages/about/about';
 @Component({
     templateUrl: 'app.html'
 })
-export class MyApp {
+export class OdooMobileApp {
     @ViewChild(Nav) nav: Nav;
 
     rootPage: any = LoginPage;

+ 14 - 9
src/app/app.module.ts

@@ -1,6 +1,6 @@
 import { NgModule } from '@angular/core';
 import { IonicApp, IonicModule } from 'ionic-angular';
-import { MyApp } from './app.component';
+import { OdooMobileApp } from './app.component';
 
 import { LoginPage } from '../pages/login/login';
 import { HallPage } from '../pages/hall/hall';
@@ -24,20 +24,23 @@ import { AboutPage } from '../pages/about/about'
 import { DataProvider } from '../providers/data-provider';
 import { OdooProvider } from '../providers/odoo-provider';
 import { SyncProvider } from '../providers/sync-provider';
-import { ProductSyncProvider } from '../providers/sync/product-sync-provider';
+import { ProductTemplateSyncProvider } from '../providers/sync/product-sync-provider';
+import { ProductAttributeSyncProvider } from '../providers/sync/product-attribute-sync-provider';
 import { ProductAttributeLineSyncProvider } from '../providers/sync/product-attribute-line-sync-provider';
 import { ProductAttributeValueSyncProvider } from '../providers/sync/product-attribute-value-sync-provider';
 import { NetworkProvider } from '../providers/network-provider';
 import { PreferencesProvider } from '../providers/preferences-provider';
 import { ToolsProvider } from '../providers/tools-provider';
 
-import { ViewMenu } from '../pipes/view-menu-pipe';
+import { ViewMenuPipe } from '../pipes/view-menu-pipe';
 import { ImageSanitizerPipe } from '../pipes/image-sanitizer-pipe';
+import { ProductAttributeLinePipe } from '../pipes/product-attribute-pipe';
+
 import { ChartModule } from 'ng2-chartjs2';
 
 @NgModule({
     declarations: [
-        MyApp,
+        OdooMobileApp,
         LoginPage,
         HallPage,
         HomePage,
@@ -53,16 +56,17 @@ import { ChartModule } from 'ng2-chartjs2';
         ToolsPage,
         SettingsPage,
         AboutPage,
-        ViewMenu,
-        ImageSanitizerPipe
+        ViewMenuPipe,
+        ImageSanitizerPipe,
+        ProductAttributeLinePipe
     ],
     imports: [
-        IonicModule.forRoot(MyApp),
+        IonicModule.forRoot(OdooMobileApp),
         ChartModule
     ],
     bootstrap: [IonicApp],
     entryComponents: [
-        MyApp,
+        OdooMobileApp,
         LoginPage,
         HallPage,
         HomePage,
@@ -83,7 +87,8 @@ import { ChartModule } from 'ng2-chartjs2';
         DataProvider,
         OdooProvider,
         SyncProvider,
-        ProductSyncProvider,
+        ProductTemplateSyncProvider,
+        ProductAttributeSyncProvider,
         ProductAttributeLineSyncProvider,
         ProductAttributeValueSyncProvider,
         NetworkProvider,

+ 6 - 5
src/pages/product-details/product-details.html

@@ -81,17 +81,18 @@
          </ion-list>
 
         <div *ngSwitchCase="'variants'">
-            <ion-card *ngFor="let attr of product.attribute_line_ids">
+            <ion-card *ngFor="let attribute_line of (product.attribute_line_ids | productAttributeLine:attributes)">
+                {{ attribute_line.attribute_id }}
                 <ion-item>
-                    <ion-label stacked>Attributo</ion-label>
-                    <ion-select [(ngModel)]="attr.attribute">
-                        <ion-option *ngFor="let a of attributes" [value]="a.id">{{ a.name }}</ion-option>
+                    <ion-label stacked>Atributo</ion-label>
+                    <ion-select [(ngModel)]="attribute_line.attribute_id">
+                        <ion-option *ngFor="let a of attributes" [value]="a.remote_id">{{ a.name }}</ion-option>
                     </ion-select>
                 </ion-item>
 
                 <ion-item>
                     <ion-label stacked>Valor del atributo</ion-label>
-                    <ion-select [(ngModel)]="attr.value" multiple="true">
+                    <ion-select [(ngModel)]="attribute_line.value_ids" multiple="true">
                         <ion-option *ngFor="let v of values" [value]="v.id">{{ v.name }}</ion-option>
                     </ion-select>
                 </ion-item>

+ 17 - 56
src/pages/product-details/product-details.ts

@@ -1,5 +1,5 @@
 import { Component } from '@angular/core';
-import { NavController, NavParams, ActionSheetController, ToastController } from 'ionic-angular';
+import { NavController, NavParams, ActionSheetController, ToastController, LoadingController } from 'ionic-angular';
 import { Shake, BarcodeScanner } from 'ionic-native';
 // import { Product } from '../../models/product'
 import { DataProvider } from '../../providers/data-provider'
@@ -34,54 +34,7 @@ export class ProductDetailsPage {
         attribute_line_ids: []
     }
 
-    attributes = [
-        {
-            id: 1,
-            name: "Talle",
-        },
-        {
-            id: 2,
-            name: "Color",
-        },
-        {
-            id: 3,
-            name: "Género",
-        },
-        {
-            id: 4,
-            name: "Marca",
-        }
-    ];
-
-    values = [
-         {
-             id: 1,
-             name: "36",
-             attr_id: 1
-         },
-         {
-             id: 2,
-             name: "40",
-             attr_id: 1
-         },
-         {
-             id: 3,
-             name: "Azul Prelavado",
-             attr_id: 2
-         },
-         {
-             id: 4,
-             name: "Femenino",
-             attr_id: 3
-         },
-         {
-             id: 5,
-             name: "RI19",
-             attr_id: 4
-         }
-     ];
-
-
+    attributes: Array<any> = [];
     view: string = "information";
     watcher: any;
 
@@ -91,15 +44,22 @@ export class ProductDetailsPage {
         public data: DataProvider,
         public toastCtrl: ToastController,
         public actionSheetCtrl: ActionSheetController,
+        public loadingCtrl: LoadingController,
         public cameraProvider: CameraProvider,
         public preferencesPreferences: PreferencesProvider
-    ) { }
+    ) { 
+        if (!(this.params.data instanceof Array)) {
+            this.product = this.params.data;
+            this.product.doc_state = "updated";
+        }
+    }
 
     /**
      *
      */
     ionViewDidLoad() {
         this.initialize();
+
         this.watcher = Shake.startWatch(40).subscribe(() => { 
             BarcodeScanner.scan().then(bar => { 
                 this.product.ean13 = bar.cancelled ? null : bar.text;
@@ -125,13 +85,14 @@ export class ProductDetailsPage {
      *
      */
     private initialize() {
-        if (!(this.params.data instanceof Array)) {
-            this.product = this.params.data;
-            this.product.doc_state = "updated";
-        }
+        let loader = this.loadingCtrl.create({
+            content: "Cargando, espere..."
+        });
+        loader.present();
 
-        this.data.getAll('product_attribute_line').then(lines => { 
-            console.log(lines);
+        this.data.getAll('product_attribute_line').then(attributes => {
+            this.attributes = attributes.product_attribute_lines;
+            loader.dismiss();
         }).catch(e => { 
             console.log(e);
         });

+ 9 - 5
src/pipes/product-attribute-pipe.ts

@@ -1,10 +1,14 @@
 import { Pipe, PipeTransform } from '@angular/core';
 
-@Pipe({ name: 'productAttr' })
-export class ProductAttributePipe implements PipeTransform {
-    transform(attrs: Array<any>, id: string) {
-        return attrs.filter(item => {
-            return null
+@Pipe({ name: 'productAttributeLine' })
+export class ProductAttributeLinePipe implements PipeTransform {
+    transform(attribute_line_ids: Array<any>, attribute_lines: Array<any>) {
+        let lines = attribute_lines.filter(item => {
+            return attribute_line_ids.indexOf(item.remote_id) > -1;
         });
+
+        console.log(lines);
+
+        return lines; 
     }
 }

+ 1 - 1
src/pipes/view-menu-pipe.ts

@@ -1,7 +1,7 @@
 import { Pipe, PipeTransform } from '@angular/core';
 
 @Pipe({ name: 'viewMenu' })
-export class ViewMenu implements PipeTransform {
+export class ViewMenuPipe implements PipeTransform {
 
     transform(menus: Array<any>, visible: boolean) {
         return menus.filter(item => { 

+ 4 - 0
src/providers/data-provider.ts

@@ -62,6 +62,10 @@ export class DataProvider {
                 singular: 'lead',
                 plural: 'leads'
             },
+            {
+                singular: 'product_attribute',
+                plural: 'product_attributes'
+            },
             {
                 singular: 'product_attribute_line',
                 plural: 'product_attribute_lines'

+ 5 - 2
src/providers/sync-provider.ts

@@ -1,5 +1,6 @@
 import { Injectable } from '@angular/core';
-import { ProductSyncProvider } from './sync/product-sync-provider';
+import { ProductTemplateSyncProvider } from './sync/product-sync-provider';
+import { ProductAttributeSyncProvider } from './sync/product-attribute-sync-provider';
 import { ProductAttributeLineSyncProvider } from './sync/product-attribute-line-sync-provider';
 import { ProductAttributeValueSyncProvider } from './sync/product-attribute-value-sync-provider';
 
@@ -7,7 +8,8 @@ import { ProductAttributeValueSyncProvider } from './sync/product-attribute-valu
 export class SyncProvider {
 
     constructor(
-        public productTemplateSync: ProductSyncProvider,
+        public productTemplateSync: ProductTemplateSyncProvider,
+        public productAttributeSync: ProductAttributeSyncProvider, 
         public productAttributeLineSync: ProductAttributeLineSyncProvider,
         public productAttributeValueSync: ProductAttributeValueSyncProvider
     ) { }
@@ -19,6 +21,7 @@ export class SyncProvider {
         return Promise.all(
             [
                 this.productTemplateSync.doSync(),
+                this.productAttributeSync.doSync(),
                 this.productAttributeLineSync.doSync(),
                 this.productAttributeValueSync.doSync()
             ]

+ 53 - 0
src/providers/sync/product-attribute-sync-provider.ts

@@ -0,0 +1,53 @@
+import { Injectable } from '@angular/core';
+import { DataProvider } from '../data-provider';
+import { OdooProvider } from '../odoo-provider';
+
+@Injectable()
+export class ProductAttributeSyncProvider {
+
+    constructor(
+        public dataProvider: DataProvider,
+        public odooProvider: OdooProvider
+    ) { }
+
+    /**
+     *
+     */
+    doSync(): Promise<any> {
+        return new Promise((reject, resolve) => {
+            this.odooProvider.get('product_attribute').then(attrs => {
+                return attrs;
+            }).then(attrs => {
+                return this.storeAttributes(attrs);
+            }).then(() => {
+                resolve();
+            }).catch(e => { 
+                reject(e);    
+            });
+        });
+
+    }
+
+        /**
+     *
+     */
+    private storeAttributes(attrs: Array<any>): Promise<any> {
+        return new Promise((reject, resolve) => {
+            this.dataProvider.deleteAll('product_attribute').then(() => {
+                return;
+            }).then(() => {
+                return this.dataProvider.save('product_attribute', attrs.map(item => {
+                    item.remote_id = item.id;
+                    item.doc_state = "sync";
+                    delete item.id;
+
+                    return item;
+                }));
+            }).then(() => {
+                resolve();
+            }).catch(e => { 
+                reject(e);    
+            });
+        });
+    }
+}

+ 1 - 1
src/providers/sync/product-sync-provider.ts

@@ -3,7 +3,7 @@ import { DataProvider } from '../data-provider';
 import { OdooProvider } from '../odoo-provider';
 
 @Injectable()
-export class ProductSyncProvider {
+export class ProductTemplateSyncProvider {
 
     constructor(
         public dataProvider: DataProvider,