~openerp-commiter/openobject-addons/trunk-extra-addons

« back to all changes in this revision

Viewing changes to esale_osc/esale_oscom.py

  • Committer: Mantavya Gajjar
  • Date: 2009-08-16 08:04:10 UTC
  • mfrom: (3589.30.10 trunk-extra-addons)
  • mto: This revision was merged to the branch mainline in revision 3768.
  • Revision ID: mga@tinyerp.com-20090816080410-hbhqsv9ime1xpwa9
[MERGE]: merging from the ame branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
1
2
##############################################################################
2
3
#
3
4
# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved.
40
41
    _columns = {
41
42
        'name': fields.char('Name',size=64, required=True),
42
43
        'url': fields.char('URL', size=128, required=True),
43
 
        'shop_id': fields.many2one('sale.shop', 'Sale Shop', required=True),
 
44
        'shop_id': fields.many2one('sale.shop', 'Sale shop', required=True),
44
45
#        'partner_anonymous_id': fields.many2one('res.partner', 'Anonymous', required=True),
45
46
        'active': fields.boolean('Active'),
46
 
        'product_ids': fields.one2many('esale.oscom.product', 'web_id', 'Web Products'),
 
47
        'product_ids': fields.one2many('esale.oscom.product', 'web_id', 'Web products'),
47
48
        'language_ids': fields.one2many('esale.oscom.lang', 'web_id', 'Languages'),
48
49
        'tax_ids': fields.one2many('esale.oscom.tax', 'web_id', 'Taxes'),
49
50
        'category_ids': fields.one2many('esale.oscom.category', 'web_id', 'Categories'),
50
51
        'pay_typ_ids': fields.one2many('esale.oscom.paytype', 'web_id', 'Payment types'),
51
 
        'esale_account_id': fields.many2one('account.account', 'Dest Account', required=True, help="Payment account for web invoices."),
 
52
        'esale_account_id': fields.many2one('account.account', 'Dest. account', required=True, help="Payment account for web invoices."),
52
53
        'price_type': fields.selection([('0', 'Untaxed price'), ('1', 'Taxed price')], 'Price type', required=True),
53
54
    }
54
55
    _defaults = {
69
70
                esale_product_obj.create(cr, uid, value)
70
71
        return True
71
72
 
 
73
 
72
74
    def tax_import(self, cr, uid, ids, *args):
73
75
        esale_tax_obj = self.pool.get('esale.oscom.tax')
74
76
        for website in self.browse(cr, uid, ids):
87
89
                    esale_tax_obj.create(cr, uid, value)
88
90
        return True
89
91
 
 
92
 
90
93
    def lang_import(self, cr, uid, ids, *args):
91
94
        esale_lang_obj = self.pool.get('esale.oscom.lang')
92
95
        for website in self.browse(cr, uid, ids):
105
108
                    esale_lang_obj.create(cr, uid, value)
106
109
        return True
107
110
 
 
111
 
 
112
    def get_payment_methods(self, cr, uid, ids, *args):
 
113
        esale_paytype_obj = self.pool.get('esale.oscom.paytype')
 
114
        for website in self.browse(cr, uid, ids):
 
115
            server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
 
116
            payment_methods = server.get_payment_methods()
 
117
            for payment_method in payment_methods:
 
118
                value={
 
119
                    'web_id' : website.id,
 
120
                    'esale_oscom_id' : payment_method[0],
 
121
                    'name' : payment_method[1]
 
122
                }
 
123
                existing = esale_paytype_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id', '=', payment_method[0])])
 
124
                if len(existing) > 0:
 
125
                    esale_paytype_obj.write(cr, uid, existing, value)
 
126
                else:
 
127
                    esale_paytype_obj.create(cr, uid, value)
 
128
        return True
 
129
 
 
130
 
108
131
    def category_import(self, cr, uid, ids, *args):
 
132
        """Imports product categories from OSCommerce"""
109
133
        esale_category_obj = self.pool.get('esale.oscom.category')
110
134
        for website in self.browse(cr, uid, ids):
111
135
            server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
123
147
                    esale_category_obj.create(cr, uid, value)
124
148
        return True
125
149
 
 
150
 
126
151
    def category_import_create(self, cr, uid, ids, *args):
 
152
        """Imports product categories from OSCommerce and creates/updates OpenERP product categories"""
127
153
        category_obj = self.pool.get('product.category')
128
154
        esale_category_obj = self.pool.get('esale.oscom.category')
129
155
 
 
156
        created, updated = 0,0
130
157
        for website in self.browse(cr, uid, ids):
131
158
            server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
132
159
 
139
166
            categories = server.get_categories_parent(osc_langs)
140
167
            for category in categories:
141
168
                # Search in intermediate esale.oscom.category object that maps OScommerce and OpenERP categories
 
169
                #print category
142
170
                cat_oscom_id = esale_category_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id','=',category[0])])
143
171
                if cat_oscom_id:
144
172
                    cat_oscom = esale_category_obj.browse(cr, uid, cat_oscom_id)[0]
147
175
                    cat_oscom_p = esale_category_obj.browse(cr, uid, cat_oscom_p_id)[0]
148
176
 
149
177
                # Creates or updates product.category and esale.oscom.category objects
 
178
                if len(category) >= 3:
 
179
                    cat_nombre = category[2]
 
180
                else:
 
181
                    cat_nombre = 'SIN NOMBRE'
150
182
                value = {
151
 
                    'name' : category[2],
152
 
                    'parent_id': category[1] and cat_oscom_p.category_id.id
 
183
                    'name' : cat_nombre,
 
184
                    'parent_id': category[1] and cat_oscom_p.category_id.id or False
153
185
                }
154
186
                if not cat_oscom_id or not cat_oscom.category_id: # OpenERP category does not exist
155
187
                    cat_id = category_obj.create(cr, uid, value)
 
188
                    created += 1
156
189
                    value_cat_oscom = {
157
190
                        'web_id' : website.id,
158
191
                        'esale_oscom_id' : category[0],
159
 
                        'name' : category[2],
 
192
                        'name' : cat_nombre,
160
193
                        'category_id' : cat_id,
161
194
                    }
162
195
                    if not cat_oscom_id:
166
199
                else:  # OpenERP category exists
167
200
                    cat_id = cat_oscom.category_id.id
168
201
                    category_obj.write(cr, uid, cat_id, value)
 
202
                    updated += 1
169
203
 
170
204
                # Updates translations
171
205
                for trans, lang in zip(category[2:], oerp_langs):
172
206
                    #print trans, lang.code
173
207
                    category_obj.write(cr, uid, cat_id, {'name': trans}, {'lang': lang.code})
174
 
        return True
 
208
 
 
209
            cr.commit()
 
210
            raise osv.except_osv(_('Category import done'), _('Created: %d categories\nUpdated: %d categories\n\nRefresh screen to see updates') % (created, updated))
 
211
        return True
 
212
 
 
213
 
 
214
    def product_fields(self, info_prod):
 
215
        """If you want compute additional product fields you can redefine this method in your own module"""
 
216
        vals = {
 
217
            #'field_name': info_prod['field_name']
 
218
        }
 
219
        return vals
 
220
 
 
221
 
 
222
    def product_trans_fields(self, trans):
 
223
        """If you want compute additional product translated fields you can redefine this method in your own module"""
 
224
        vals = {
 
225
            #'field_name': trans['field_name']
 
226
        }
 
227
        return vals
 
228
 
 
229
 
 
230
    def product_extra_info(self, cr, uid, website, prod_id, prod_data):
 
231
        """If you want create additonal information in OpenERP objects related to product you can redefine this method in your own module"""
 
232
        return True
 
233
 
175
234
 
176
235
    def product_import_create(self, cr, uid, ids, *args):
 
236
        """Imports products from OSCommerce and creates/updates OpenERP products"""
177
237
        product_obj = self.pool.get('product.product')
178
238
        esale_product_obj = self.pool.get('esale.oscom.product')
179
 
        esale_category_obj = self.pool.get('esale.oscom.category')
180
 
        esale_tax_obj = self.pool.get('esale.oscom.tax')
 
239
        manufacturer_obj = self.pool.get('product.manufacturer')
 
240
        stock_inventory_obj = self.pool.get('stock.inventory')
 
241
        stock_inventory_line_obj = self.pool.get('stock.inventory.line')
181
242
 
 
243
        created, updated = 0,0
182
244
        for website in self.browse(cr, uid, ids):
183
245
            server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
184
246
            website_url = website.url.split("/")
185
247
 
186
 
            # Search OScommerce languages mapped to OpenERP
 
248
            # Search esale languages mapped to OpenERP
187
249
            osc_langs = [lang.esale_oscom_id for lang in website.language_ids if lang.language_id and lang.language_id.translatable]
188
 
            oerp_langs = [lang.language_id for lang in website.language_ids if lang.language_id and lang.language_id.translatable]
189
250
            if not osc_langs:
190
251
                raise osv.except_osv(_('Warning'), _("First you must map OScommerce languages to OpenERP languages in the Web Shop!"))
191
252
 
192
 
            products_osc = server.get_products(osc_langs)
193
 
            #print products_osc
194
 
            for product in products_osc:
195
 
                print "=============================================================================="
196
 
                print product
197
 
                info_prod = product['product']
198
 
                spec_prod = product['product_special']
199
 
                name_prod = product['product_description'] and product['product_description'][0]['products_name'] or '-'
200
 
 
201
 
                # Search mapped category. If not found the product is not added/modified
202
 
                esale_categ_ids = esale_category_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id','=',info_prod['categ_id'])])
203
 
                if not esale_categ_ids:
204
 
                    continue
205
 
                esale_categ = esale_category_obj.browse(cr, uid, esale_categ_ids[0])
206
 
                if not esale_categ.category_id:
207
 
                    continue
208
 
 
209
 
                # Search mapped tax
210
 
                esale_tax_ids = esale_tax_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id','=',info_prod['products_tax_class_id'])])
211
 
                tax = []
212
 
                if esale_tax_ids:
213
 
                    esale_tax = esale_tax_obj.browse(cr, uid, esale_tax_ids[0])
214
 
                    tax = esale_tax.tax_id and [(6, 0, [esale_tax.tax_id.id])] or []
215
 
 
216
 
                # Note:
217
 
                # info_prod['manufacturers_id'] (integer) must be placed in OpenERP 'manufacturer_id' field (creating the manufacturer if is needed)
218
 
                value = {
219
 
                    'name': name_prod,
220
 
                    'default_code': info_prod['products_model'],
221
 
                    'categ_id': esale_categ.category_id.id,
222
 
                    'taxes_id': tax,
223
 
                    'list_price': info_prod['products_price'],
224
 
                    'weight': info_prod['products_weight'],
225
 
                    'product_picture': info_prod['products_image'],
226
 
                    'in_out_stock': str(info_prod['products_status']),
227
 
                    'date_available': info_prod['products_date_available'] or False,
228
 
                    'spe_price_status': 'status' in spec_prod and str(spec_prod['status']) or False,
229
 
                    'spe_price': 'specials_new_products_price' in spec_prod and spec_prod['specials_new_products_price'] or False,
230
 
                    'exp_date': 'expires_date' in spec_prod and spec_prod['expires_date']!='0000-00-00 00:00:00' and spec_prod['expires_date'] or False,
231
 
                    'oscom_url': website_url[0] + "//" + website_url[2] + "/" + website_url[3] + "/" + website_url[4] + "/" +"categories.php?cPath=" + str(info_prod['categ_id']) + "&pID=" + str(info_prod['products_id']) + "&action=new_product"
232
 
                    #'ean13': info_prod['products_model'],
233
 
                    #'type': 'Stockable product',
234
 
                    #'supply_method': 'buy',
235
 
                    #'procure_method': 'make_to_stock',
236
 
                    #'cost_method': 'standard',
237
 
                    #'sale_ok': True,
238
 
                    #'purchase_ok': True,
239
 
                    #'active': 'True',
240
 
                    #'weight_net': info_prod['products_weight'],
241
 
                    #'standard_price': info_prod['products_price'],
242
 
                    #'volume': 0,
243
 
                }
244
 
                print value
245
 
 
246
 
                # Search in intermediate esale.oscom.product object that maps OScommerce and OpenERP products
247
 
                esale_product_ids = esale_product_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id','=',info_prod['products_id'])])
248
 
                if esale_product_ids:
249
 
                    esale_product = esale_product_obj.browse(cr, uid, esale_product_ids[0])
250
 
 
251
 
                # Creates or updates product.product and esale.oscom.product objects
252
 
                if not esale_product_ids or not esale_product.product_id: # OpenERP product does not exist
253
 
                    prod_id = super(osv.osv, product_obj).create(cr, uid, value)
254
 
                    value_esale_product = {
255
 
                            'name': name_prod,
256
 
                            'esale_oscom_id': info_prod['products_id'],
257
 
                            'esale_oscom_tax_id': esale_tax_ids and esale_tax_ids[0] or False,
258
 
                            'web_id': website.id,
259
 
                            'product_id': prod_id,
 
253
            # Creates dictionary mapping esale language id -> OpenERP language
 
254
            oerp_langs = {}
 
255
            for lang in website.language_ids:
 
256
                if lang.language_id and lang.language_id.translatable:
 
257
                    oerp_langs[lang.esale_oscom_id] = lang.language_id
 
258
 
 
259
            # Creates dictionary mapping esale category id -> OpenERP category
 
260
            oerp_categs = {}
 
261
            for categ in website.category_ids:
 
262
                if categ.category_id:
 
263
                    oerp_categs[categ.esale_oscom_id] = categ.category_id
 
264
 
 
265
            # Creates dictionary mapping esale tax id -> OpenERP tax
 
266
            oerp_taxs = {}
 
267
            for tax in website.tax_ids:
 
268
                if tax.tax_id and tax.tax_id.active:
 
269
                    oerp_taxs[tax.esale_oscom_id] = tax.tax_id
 
270
 
 
271
            value_stock_inv = {
 
272
                'name' : "Descarga Inicial",
 
273
            }
 
274
            stock_init_id =  stock_inventory_obj.create(cr, uid, value_stock_inv)
 
275
 
 
276
            mini = server.get_min_products_id()
 
277
            maxi = mini + 30
 
278
            tope = server.get_max_products_id()
 
279
            #print "Product maxi:" , tope
 
280
            while maxi <= tope:
 
281
                #print "Start mini loop", mini
 
282
                #print "Start maxi loop", maxi
 
283
                products_osc = server.get_products(osc_langs, mini, maxi)
 
284
                #print products_osc
 
285
                mini = maxi
 
286
                maxi = maxi + 30
 
287
                for product in products_osc:
 
288
                    #print "================================product from osc=========================================="
 
289
                    #print product
 
290
                    info_prod = product['product']
 
291
                    spec_prod = product['product_special']
 
292
                    name_prod = product['product_description'] and product['product_description'][0]['products_name'] or '-'
 
293
                    url_manuf = product['manufacturers_url']
 
294
                    #print info_prod['products_id'], " Code " , info_prod['products_model']
 
295
 
 
296
                    # Search mapped category. If not found the product is not added/modified
 
297
                    if info_prod['categ_id'] in oerp_categs:
 
298
                        categ = oerp_categs[info_prod['categ_id']]
 
299
                    else:
 
300
                        continue
 
301
 
 
302
                    # Search mapped tax
 
303
                    tax = []
 
304
                    if info_prod['products_tax_class_id'] in oerp_taxs:
 
305
                        tax = [(6, 0, [oerp_taxs[info_prod['products_tax_class_id']].id])]
 
306
 
 
307
                    # Search manufacturer. If not exists, create it. Create related url for each language
 
308
                    if (len(info_prod['manufacturers_name']) > 0):
 
309
                        manuf_ids = manufacturer_obj.search(cr, uid, [('name','=',info_prod['manufacturers_name'])])
 
310
                        if not manuf_ids:
 
311
                            manuf_id = manufacturer_obj.create(cr, uid, {'name': info_prod['manufacturers_name']})
 
312
                        else:
 
313
                            manuf_id = manuf_ids[0]
 
314
                        for url_manuf_el in url_manuf:
 
315
                            if url_manuf_el['languages_id'] in oerp_langs:
 
316
                                #print url_manuf_el['languages_id'], oerp_langs[url_manuf_el['languages_id']].code
 
317
                                manufacturer_obj.write(cr, uid, [manuf_id], {'manufacturer_url': url_manuf_el['manufacturers_url']}, {'lang': oerp_langs[url_manuf_el['languages_id']].code})
 
318
 
 
319
                    value = {
 
320
                        'name': name_prod,
 
321
                        'default_code': info_prod['products_model'],
 
322
                        'categ_id': categ.id,
 
323
                        'taxes_id': tax,
 
324
                        'list_price': info_prod['products_price'],
 
325
                        'weight': info_prod['products_weight'],
 
326
                        'product_picture': info_prod['products_image'],
 
327
                        'in_out_stock': str(info_prod['products_status']),
 
328
                        'date_available': info_prod['products_date_available']!='0000-00-00 00:00:00' and info_prod['products_date_available'] or False,
 
329
                        'spe_price_status': 'status' in spec_prod and str(spec_prod['status']) or False,
 
330
                        'spe_price': 'specials_new_products_price' in spec_prod and spec_prod['specials_new_products_price'] or False,
 
331
                        'exp_date': 'expires_date' in spec_prod and spec_prod['expires_date']!='0000-00-00 00:00:00' and spec_prod['expires_date'] or False,
 
332
                        'oscom_url': website_url[0] + "//" + website_url[2] + "/" +"product_info.php?cPath=" + str(info_prod['categ_id']) + "&products_id=" + str(info_prod['products_id']),
 
333
                        #'ean13': info_prod['products_model'],
 
334
                        #'type': 'Stockable product',
 
335
                        #'supply_method': 'buy',
 
336
                        #'procure_method': 'make_to_stock',
 
337
                        #'cost_method': 'standard',
 
338
                        #'weight_net': info_prod['products_weight'],
 
339
                        #'standard_price': info_prod['products_price'],
260
340
                    }
261
 
                    if not esale_product_ids:
262
 
                        esale_product_id = esale_product_obj.create(cr, uid, value_esale_product)
263
 
                    else:
264
 
                        esale_product_obj.write(cr, uid, [esale_product_ids[0]], value_esale_product)
265
 
                else: # OpenERP product exists
266
 
                    prod_id = esale_product.product_id.id
267
 
                    super(osv.osv, product_obj).write(cr, uid, [prod_id], value)
268
 
 
269
 
                # Updates translations
270
 
                for trans, lang in zip(product['product_description'], oerp_langs):
271
 
                    #print trans, lang.code
272
 
                    super(osv.osv, product_obj).write(cr, uid, [prod_id], {
 
341
                    value.update(self.product_fields(info_prod)) # Adds additional fields
 
342
                    # print "=======value======"
 
343
                    #print value
 
344
 
 
345
                    # Search in intermediate esale.oscom.product object that maps OScommerce and OpenERP products
 
346
                    esale_product_ids = esale_product_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id','=',info_prod['products_id'])])
 
347
                    if esale_product_ids:
 
348
                        esale_product = esale_product_obj.browse(cr, uid, esale_product_ids[0])
 
349
 
 
350
                    # Creates or updates product.product and esale.oscom.product objects
 
351
                    if not esale_product_ids or not esale_product.product_id: # OpenERP product does not exist
 
352
                        prod_id = super(osv.osv, product_obj).create(cr, uid, value)
 
353
                        created += 1
 
354
                        value_esale_product = {
 
355
                                'name': name_prod,
 
356
                                'esale_oscom_id': info_prod['products_id'],
 
357
                                'web_id': website.id,
 
358
                                'product_id': prod_id,
 
359
                        }
 
360
                        if not esale_product_ids:
 
361
                            esale_product_id = esale_product_obj.create(cr, uid, value_esale_product)
 
362
                        else:
 
363
                            esale_product_obj.write(cr, uid, [esale_product_ids[0]], value_esale_product)
 
364
                    else: # OpenERP product exists
 
365
                        prod_id = esale_product.product_id.id
 
366
                        super(osv.osv, product_obj).write(cr, uid, [prod_id], value)
 
367
                        updated += 1
 
368
 
 
369
                    # Updates translations
 
370
                    for trans in product['product_description']:
 
371
                        value_trans = {
273
372
                            'name': trans['products_name'] or '-',
274
373
                            'description': trans['products_description'],
275
374
                            'description_sale': trans['products_description'],
276
375
                            'product_url': trans['products_url'],
277
 
                        }, {'lang': lang.code})
278
 
        return True
279
 
 
280
 
    def get_payment_methods(self, cr, uid, ids, *args):
 
376
                        }
 
377
                        value_trans.update(self.product_trans_fields(trans)) # Adds additional fields
 
378
                        # print "==========trans========="
 
379
                        #print value_trans
 
380
                        super(osv.osv, product_obj).write(cr, uid, [prod_id], value_trans, {'lang': oerp_langs[trans['language_id']].code})
 
381
 
 
382
                        self.product_extra_info(cr, uid, website, prod_id, product) # Creates additonal information in OpenERP objects related to product
 
383
                    #Creates inventory_line
 
384
                    value_inventory_line = {
 
385
                        'inventory_id': stock_init_id,
 
386
                        'location_id': 11,
 
387
                        'product_id' : prod_id,
 
388
                        'product_uom' : 1,
 
389
                        'product_qty' : info_prod['products_quantity']
 
390
                    }
 
391
                    stock_inventory_line_id = stock_inventory_line_obj.create(cr, uid, value_inventory_line)
 
392
            cr.commit()
 
393
            raise osv.except_osv(_('Product import done'), _('Created: %d products\nUpdated: %d products\n\nRefresh screen to see updates') % (created, updated))
 
394
        return True
 
395
 
 
396
    def customer_extra_info(self, cr, uid, website, customer_id, osc_customer_id):
 
397
        """If you want create additonal information in OpenERP objects related to customer you can redefine this method in your own module"""
 
398
        return True
 
399
 
 
400
 
 
401
    def saleorder_import(self, cr, uid, website_id, context):
 
402
        """Imports sale orders from OSCommerce"""
 
403
 
 
404
        def _country_info(self, cr, uid, data, context):
 
405
            country_obj = self.pool.get('res.country')
 
406
            data['code'] = data['code'].upper()
 
407
            search_country = country_obj.search(cr, uid, [('code','=',data['code'])])
 
408
            if len(search_country):
 
409
                return search_country[0]
 
410
            del data['code3']
 
411
            # data['esale_oscom_id'] = data['country_id']
 
412
            del data['esale_oscom_id']
 
413
            return country_obj.create(cr, uid, data)
 
414
 
 
415
        def _state_info(self, cr, uid, data, country_id, context):
 
416
            state_obj = self.pool.get('res.country.state')
 
417
            data['country_id'] = country_id
 
418
            search_state = state_obj.search(cr, uid, ['|',('code','ilike',data['code']),('name','ilike','%'+data['code']+'%'), ('country_id','=',data['country_id'])])
 
419
            if len(search_state):
 
420
                return search_state[0]
 
421
            # data['esale_oscom_id'] = data['state_id']
 
422
            del data['esale_oscom_id']
 
423
            return state_obj.create(cr, uid, data)
 
424
 
 
425
        def _add_address(self, cr, uid, data, partner_id, context):
 
426
            address_obj = self.pool.get('res.partner.address')
 
427
            country_id = _country_info(self, cr, uid, data['country'].copy(), context)
 
428
            del data['country']
 
429
            data['country_id'] = country_id
 
430
            if type(data['state']) == type({}):
 
431
                state_id = _state_info(self, cr, uid, data['state'].copy(), country_id, context)
 
432
                data['state_id'] = state_id
 
433
            del data['state']
 
434
            search_address = address_obj.search(cr, uid, [('partner_id','=',partner_id),('esale_oscom_id','=',data['esale_oscom_id'])])
 
435
            if len(search_address):
 
436
                address_obj.write(cr, uid, search_address,data)
 
437
                return search_address[0]
 
438
            else:
 
439
                data['partner_id'] = partner_id
 
440
            return address_obj.create(cr, uid, data)
 
441
 
 
442
        partner_obj = self.pool.get('res.partner')
 
443
        saleorder_obj = self.pool.get('sale.order')
 
444
        saleorder_line_obj = self.pool.get('sale.order.line')
 
445
        product_obj = self.pool.get('product.product')
 
446
        esale_product_obj = self.pool.get('esale.oscom.product')
281
447
        esale_paytype_obj = self.pool.get('esale.oscom.paytype')
282
 
        for website in self.browse(cr, uid, ids):
283
 
            server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
284
 
            payment_methods = server.get_payment_methods()
285
 
            for payment_method in payment_methods:
286
 
                value={
287
 
                    'web_id' : website.id,
288
 
                    'esale_oscom_id' : payment_method[0],
289
 
                    'name' : payment_method[1]
290
 
                }
291
 
                existing = esale_paytype_obj.search(cr, uid, [('web_id','=',website.id), ('esale_oscom_id', '=', payment_method[0])])
292
 
                if len(existing) > 0:
293
 
                    esale_paytype_obj.write(cr, uid, existing, value)
294
 
                else:
295
 
                    esale_paytype_obj.create(cr, uid, value)
296
 
        return True
 
448
        tax_obj = self.pool.get('account.tax')
 
449
        inv_obj = self.pool.get('account.invoice')
 
450
        journal_obj = self.pool.get('account.journal')
 
451
 
 
452
        website = self.pool.get('esale.oscom.web').browse(cr, uid, website_id)
 
453
        server = xmlrpclib.ServerProxy("%s/openerp-synchro.php" % website.url)
 
454
 
 
455
        cr.execute("select max(esale_oscom_id) from sale_order where esale_oscom_web=%s;" % str(website.id))
 
456
        max_web_id = cr.fetchone()[0]
 
457
 
 
458
        min_openorder=-1
 
459
        if max_web_id:
 
460
            saleorders = server.get_saleorders(max_web_id)
 
461
            min_openorder = server.get_min_open_orders(max_web_id)
 
462
        else:
 
463
            saleorders = server.get_saleorders(0)
 
464
        no_of_so = 0
 
465
        for saleorder in saleorders:
 
466
            #print "==========*********NEW**************==========="
 
467
            #print "== Oscommerce Sale Order Number :", saleorder['id']
 
468
            if len(saleorder['partner']) > 0 :
 
469
                oscom_partner = saleorder['partner'][0]
 
470
                #print "== Sale order partner:", saleorder['partner'][0]
 
471
            partner_ids = partner_obj.search(cr, uid, [('esale_oscom_id','=',oscom_partner['esale_oscom_id'])])
 
472
            if len(partner_ids):
 
473
                partner_id = partner_ids[0]
 
474
                partner_obj.write(cr, uid, partner_ids, {'name':oscom_partner['name']})
 
475
            else:
 
476
                del oscom_partner['addresses']
 
477
                partner_id = partner_obj.create(cr, uid, oscom_partner)
 
478
                partner_obj.write(cr, uid, partner_ids, {'ref':oscom_partner['esale_oscom_id']})
 
479
 
 
480
            self.customer_extra_info(cr, uid, website, partner_id, oscom_partner['esale_oscom_id']) # Creates additonal information in OpenERP objects related to customer
 
481
 
 
482
            # Default address is right on Website so we create the order.
 
483
            if len(saleorder['address']) > 0 :
 
484
                #print "===Sale order address:",saleorder['address'][0]
 
485
                default_address = saleorder['address'][0]
 
486
                del saleorder['address']
 
487
                default_address['type'] = 'default'
 
488
                default_address_id = _add_address(self, cr, uid, default_address.copy(), partner_id, context)
 
489
                shipping_address = []
 
490
                if len(saleorder['delivery']) > 0 :
 
491
                    #print "===Sale order Delivery:",saleorder['delivery'][0]
 
492
                    shipping_address = saleorder['delivery'][0]
 
493
                    del saleorder['delivery']
 
494
                    shipping_address['type'] = 'delivery'
 
495
                    shipping_address_id = _add_address(self, cr, uid, shipping_address.copy(), partner_id, context)
 
496
                billing_address = []
 
497
                if len(saleorder['billing']) > 0 :
 
498
                    #print "===Sale order Billing:",saleorder['billing'][0]
 
499
                    billing_address = saleorder['billing'][0]
 
500
                    del saleorder['billing']
 
501
                    billing_address['type'] = 'invoice'
 
502
                    billing_address_id = _add_address(self, cr, uid, billing_address.copy(),partner_id, context)
 
503
 
 
504
                value={ 'esale_oscom_web': website.id,
 
505
                        'esale_oscom_id' : saleorder['id'],
 
506
                        'shop_id'        : website.shop_id.id,
 
507
                        'partner_id'     : partner_id,
 
508
                        'note'           : saleorder['note'],
 
509
                        'pay_met_title'  : saleorder['pay_met_title'],
 
510
                        'shipping_title' : saleorder['shipping_title'],
 
511
                        'orders_status'  : saleorder['orders_status'],
 
512
                        #'price_type'    : saleorder['price_type']
 
513
                    }
 
514
 
 
515
                value.update(saleorder_obj.onchange_shop_id(cr, uid, [], value['shop_id'])['value'])
 
516
                value.update(saleorder_obj.onchange_partner_id(cr, uid, [], value['partner_id'])['value'])
 
517
        #        address_obj = self.pool.get('res.partner.address')
 
518
        #        for address in [('address','order'), ('billing', 'invoice'), ('delivery', 'shipping')]:
 
519
        #            criteria = [('partner_id', '=', website.partner_anonymous_id.id)]
 
520
        #            insert = {'partner_id': website.partner_anonymous_id.id}
 
521
        #            for criterium in [('city', 'city'), ('name', 'name'), ('zip','zip'), ('address', 'street') ]:
 
522
        #                criteria.append((criterium[1], 'like', saleorder[address[0]][criterium[0]]))
 
523
        #                insert[criterium[1]] = saleorder[address[0]][criterium[0]]
 
524
        #            address_ids = address_obj.search(cr, uid, criteria)
 
525
        #            if len(address_ids):
 
526
        #                id = address_ids[0]
 
527
        #            else:
 
528
        #                country_ids = self.pool.get('res.country').search(cr, uid, [('name', 'ilike', saleorder[address[0]]['country'])])
 
529
        #                if len(country_ids):
 
530
        #                    country_id = country_ids[0]
 
531
        #                else:
 
532
        #                    country_id = self.pool.get('res.country').create(cr, uid, { 'name' : saleorder[address[0]]['country'],
 
533
        #                                                                              'code' : saleorder[address[0]]['country'][0:2].lower()})
 
534
        #                insert['country_id'] = country_id
 
535
        #                if address[0] == 'address':
 
536
        #                    insert['email'] = saleorder['address']['email']
 
537
        #                id = address_obj.create(cr, uid, insert)
 
538
        #
 
539
        #            value.update({'partner_%s_id' % address[1]: id})
 
540
                value['partner_order_id'] = default_address_id
 
541
                if len(shipping_address) > 0 :
 
542
                    value['partner_shipping_id'] = shipping_address_id
 
543
                else:
 
544
                    value['partner_shipping_id'] =  default_address_id
 
545
 
 
546
                if len(billing_address) > 0 :
 
547
                    value['partner_invoice_id'] = billing_address_id
 
548
                else:
 
549
                    value['partner_invoice_id'] =  default_address_id
 
550
 
 
551
                order_id = saleorder_obj.create(cr, uid, value)
 
552
 
 
553
                for orderline in saleorder['lines']:
 
554
                    ids = esale_product_obj.search(cr, uid, [('esale_oscom_id', '=', orderline['product_id']), ('web_id', '=', website.id)])
 
555
                    if len(ids):
 
556
                        oscom_product_id = ids[0]
 
557
                        oscom_product = esale_product_obj.browse(cr, uid, oscom_product_id)
 
558
                        linevalue = {
 
559
                            'product_id'     : oscom_product.product_id.id,
 
560
                            'product_uom_qty': orderline['product_qty'],
 
561
                            'order_id'       : order_id
 
562
                        }
 
563
                        onchange_product_sol = saleorder_line_obj.product_id_change(cr, uid, [], value['pricelist_id'], linevalue['product_id'], linevalue['product_uom_qty'],False, 0, False, '', value['partner_id'])['value']
 
564
                        onchange_product_sol['tax_id'] = False
 
565
                        if orderline['tax_rate'] > 0.0000:
 
566
                            tax_rate_search_ids = tax_obj.search(cr, uid, [('tax_group','=','vat'),('amount','=',orderline['tax_rate']/100), ('type_tax_use', '=','sale')])
 
567
                            if tax_rate_search_ids:
 
568
                                onchange_product_sol['tax_id'] = tax_rate_search_ids
 
569
                            else:
 
570
                                new_tax_id = int(tax_obj.create(cr, uid, {'name':'NEW '+str(orderline['tax_rate']),'amount':orderline['tax_rate']/100}))
 
571
                                onchange_product_sol['tax_id'] = [new_tax_id]
 
572
                        price = orderline['price']
 
573
                        name = orderline['name']
 
574
                        attributes = (orderline.has_key('attributes') and orderline['attributes']) or False
 
575
                        if saleorder['price_type'] == 'tax_excluded' and attributes:
 
576
                            price = eval(str(price) + attributes['price_prefix'] + str(attributes['options_values_price']))
 
577
                            name = name + ' ' + attributes['products_options'] + ' + ' + attributes['products_options_values']
 
578
                        elif saleorder['price_type'] == 'tax_included':
 
579
                            price = price * (1+orderline['tax_rate']/100)
 
580
                            if attributes:
 
581
                                options_value_price = attributes['options_values_price']
 
582
                                cal_options_value_price = options_value_price * (1+orderline['tax_rate']/100)
 
583
                                price = eval(str(price) + attributes['price_prefix'] + str(cal_options_value_price))
 
584
                                name = name + ' ' + attributes['products_options'] + ' + ' + attributes['products_options_values']
 
585
                        onchange_product_sol['price_unit'] = round(price,2)
 
586
                        linevalue.update(onchange_product_sol)
 
587
                        linevalue.update(saleorder_line_obj.default_get(cr, uid, ['sequence', 'invoiced', 'state', 'product_packaging']))
 
588
                        linevalue['name'] = name
 
589
                        if linevalue.get('weight',False):
 
590
                            del linevalue['weight']
 
591
                        linevalue["product_uos"] = linevalue['product_uos'] and linevalue['product_uos'][0]
 
592
                        tax_id = linevalue['tax_id'] and linevalue['tax_id'][0]
 
593
                        del linevalue['tax_id']
 
594
 
 
595
                        ids = saleorder_line_obj.create(cr, uid, linevalue)
 
596
                        if tax_id:
 
597
                            cr.execute('insert into sale_order_tax (order_line_id,tax_id) values (%d,%d)', (ids, tax_id))
 
598
                #print "======== UPDATE:",saleorder['shipping_title']
 
599
                shopping_cost_id = product_obj.search(cr, uid, [('name','=','Shipping Cost')])
 
600
                if shopping_cost_id:
 
601
                    if saleorder['shipping_price'] > 0.0000:
 
602
                        so_line_shipping = {
 
603
                            'product_id'     : shopping_cost_id[0],
 
604
                            'product_uom_qty': 1,
 
605
                            'order_id'       : order_id
 
606
                        }
 
607
                        so_line_shipping.update(saleorder_line_obj.product_id_change(cr, uid, [], value['pricelist_id'], so_line_shipping['product_id'], so_line_shipping['product_uom_qty'],False, 0, False, '', value['partner_id'])['value'])
 
608
                        so_line_shipping.update(saleorder_line_obj.default_get(cr, uid, ['sequence', 'invoiced', 'state', 'product_packaging']))
 
609
                        so_line_shipping['price_unit'] = saleorder['shipping_price']
 
610
                        so_line_shipping['name'] = saleorder['shipping_title']
 
611
                        if so_line_shipping.get('weight',False):
 
612
                            del so_line_shipping['weight']
 
613
                        del so_line_shipping['tax_id']
 
614
                        #print "=== Order line:", so_line_shipping
 
615
                        ids = saleorder_line_obj.create(cr, uid, so_line_shipping)
 
616
                #print "=== Cupon line:",saleorder['dcoupon_title']
 
617
                #print "=== Cash order line:",saleorder['cash_title']
 
618
                discount_cost_id = product_obj.search(cr, uid, [('name','=','Discount Coupon')])
 
619
                if discount_cost_id:
 
620
                    if saleorder['dcoupon_price'] != 0.0000:
 
621
                        so_line_discount = {
 
622
                            'product_id'     : discount_cost_id[0],
 
623
                            'product_uom_qty': 1,
 
624
                            'order_id'       : order_id
 
625
                        }
 
626
                        #print "=== Cupon line:",saleorder['dcoupon_title']
 
627
                        so_line_discount.update(saleorder_line_obj.product_id_change(cr, uid, [], value['pricelist_id'], so_line_discount['product_id'], so_line_discount['product_uom_qty'],False, 0, False, '', value['partner_id'])['value'])
 
628
                        so_line_discount.update(saleorder_line_obj.default_get(cr, uid, ['sequence', 'invoiced', 'state', 'product_packaging']))
 
629
                        so_line_discount['price_unit'] = saleorder['dcoupon_price']
 
630
                        so_line_discount['name'] = saleorder['dcoupon_title']
 
631
                        if so_line_discount.get('weight',False):
 
632
                            del so_line_discount['weight']
 
633
                        del so_line_discount['tax_id']
 
634
                        #print "=== Cupon line:", so_line_discount
 
635
                        ids = saleorder_line_obj.create(cr, uid, so_line_discount)
 
636
                cash_cost_id = product_obj.search(cr, uid, [('name','=','Cash On Delivery')])
 
637
                if cash_cost_id:
 
638
                    if saleorder['cash_price'] != 0.0000:
 
639
                        so_line_cash = {
 
640
                            'product_id'     : cash_cost_id[0],
 
641
                            'product_uom_qty': 1,
 
642
                            'order_id'       : order_id
 
643
                        }
 
644
                        #print "=== Cash order line:",saleorder['cash_title']
 
645
                        so_line_cash.update(saleorder_line_obj.product_id_change(cr, uid, [], value['pricelist_id'], so_line_cash['product_id'], so_line_cash['product_uom_qty'],False, 0, False, '', value['partner_id'])['value'])
 
646
                        so_line_cash.update(saleorder_line_obj.default_get(cr, uid, ['sequence', 'invoiced', 'state', 'product_packaging']))
 
647
                        so_line_cash['price_unit'] = saleorder['cash_price']
 
648
                        so_line_cash['name'] = saleorder['cash_title']
 
649
                        if so_line_cash.get('weight',False):
 
650
                            del so_line_cash['weight']
 
651
                        del so_line_cash['tax_id']
 
652
                        #print "=== Order line:", so_line_cash
 
653
                        ids = saleorder_line_obj.create(cr, uid, so_line_cash)
 
654
 
 
655
                no_of_so +=1
 
656
 
 
657
                ######################################################################################
 
658
                oscom_pay_met = saleorder['pay_met']
 
659
                typ_ids = esale_paytype_obj.search(cr, uid, [('esale_oscom_id', '=', oscom_pay_met), ('web_id', '=', website.id)])
 
660
                saleorder = saleorder_obj.browse(cr, uid, order_id)
 
661
                if typ_ids:
 
662
                    typ_data = esale_paytype_obj.browse(cr, uid, typ_ids)[0]
 
663
                    paytype = typ_data.paytyp
 
664
                    cr.execute('select * from ir_module_module where name=%s and state=%s', ('sale_payment','installed'))
 
665
                    if cr.fetchone():
 
666
                        saleorder_obj.write(cr, uid, [order_id], {'payment_type': typ_data.payment_id.id})
 
667
                else:
 
668
                    paytype = 'type1'
 
669
                wf_service = netsvc.LocalService("workflow")
 
670
                if paytype == 'type1':
 
671
                    #SO in state draft so nothing
 
672
                    pass
 
673
                elif paytype == 'type2':
 
674
                    #SO in state confirmed
 
675
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'order_confirm', cr)
 
676
                elif paytype == 'type3':
 
677
                    #INVOICE draft
 
678
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'order_confirm', cr)
 
679
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'manual_invoice', cr)
 
680
                elif paytype == 'type4':
 
681
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'order_confirm', cr)
 
682
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'manual_invoice', cr)
 
683
                    inv_ids = inv_obj.search(cr, uid, [('origin','=',saleorder.name)])
 
684
                    inv_obj.button_compute(cr, uid, inv_ids)
 
685
                    wf_service.trg_validate(uid, 'account.invoice',inv_ids[0], 'invoice_open', cr)
 
686
                elif paytype == 'type5':
 
687
                    #INVOICE payed
 
688
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'order_confirm', cr)
 
689
                    wf_service.trg_validate(uid, 'sale.order', order_id, 'manual_invoice', cr)
 
690
                    pay_account_id = (website.esale_account_id)['id']
 
691
                    pay_journal_id = typ_data.journal_id.id
 
692
                    inv_ids = inv_obj.search(cr, uid, [('origin','=',saleorder.name)])
 
693
                    inv_obj.button_compute(cr, uid, inv_ids)
 
694
                    wf_service.trg_validate(uid, 'account.invoice',inv_ids[0], 'invoice_open', cr)
 
695
                    ids = self.pool.get('account.period').find(cr, uid, context=context)
 
696
                    period_id = False
 
697
                    if len(ids):
 
698
                        period_id = ids[0]
 
699
 
 
700
                    invoice = inv_obj.browse(cr, uid,inv_ids[0],{})
 
701
                    company_currency = self.pool.get('res.users').browse(cr, uid, uid).company_id.currency_id.id
 
702
                    if invoice.currency_id.id != company_currency:
 
703
                        amount = round(self.pool.get('res.currency').compute(cr, uid, invoice.currency_id.id, company_currency, invoice.amount_total), 2)
 
704
                    else:
 
705
                        amount = invoice.amount_total
 
706
 
 
707
                    inv_obj.pay_and_reconcile(cr, uid, inv_ids, amount, pay_account_id, period_id, pay_journal_id, False, False, False, context={})
 
708
                else:
 
709
                    #The payment method hasn't been mapped
 
710
                    pass
 
711
            cr.commit()
 
712
        for saleorder in saleorders:
 
713
            server.process_order(saleorder['id'])
 
714
 
 
715
        ###################### look for open orders in site that are 'done' in TinyERP ###################
 
716
        ######################                and close them                           ###################
 
717
        if (min_openorder > -1):
 
718
            cr.execute("select esale_oscom_id from sale_order where (esale_oscom_id>=%s) and (state = 'done') and (esale_oscom_web=%s);", (str(min_openorder), str(website.id)))
 
719
            openorders=cr.fetchall()
 
720
            for openorder in openorders:
 
721
                server.close_open_orders(openorder[0])
 
722
        return no_of_so
297
723
 
298
724
esale_oscom_web()
299
725
 
300
726
 
301
 
#class esale_oscom_country(osv.osv):
302
 
#    _inherit = 'res.country'
303
 
#    _columns = {
304
 
#        'esale_oscom_id': fields.integer('esale_oscom ID',readonly=True),
305
 
#    }
306
 
#
307
 
#class esale_oscom_state(osv.osv):
308
 
#    _inherit = 'res.country.state'
309
 
#    _columns = {
310
 
#        'esale_oscom_id': fields.integer('esale_oscom ID',readonly=True),
311
 
#    }
312
 
 
313
 
 
314
727
class esale_oscom_tax(osv.osv):
315
728
    _name = "esale.oscom.tax"
316
729
    _description = "esale_oscom Tax"
318
731
        'name': fields.char('Tax name', size=32, required=True, readonly=True),
319
732
        'esale_oscom_id': fields.integer('OScommerce Id'),
320
733
        'web_id': fields.many2one('esale.oscom.web', 'Website'),
321
 
        'tax_id': fields.many2one('account.tax', 'OpenERP Tax'),
 
734
        'tax_id': fields.many2one('account.tax', 'OpenERP tax'),
322
735
    }
323
736
esale_oscom_tax()
324
737
 
327
740
    _name = "esale.oscom.category"
328
741
    _description = "esale_oscom Category"
329
742
    _columns = {
330
 
        'name': fields.char('Name', size=64, reuired=True, readonly=True),
 
743
        'name': fields.char('Name', size=64, required=True, readonly=True),
331
744
        'esale_oscom_id': fields.integer('OScommerce Id', required=True),
332
745
        'web_id': fields.many2one('esale.oscom.web', 'Website'),
333
 
        'category_id': fields.many2one('product.category', 'OpenERP Category'),
 
746
        'category_id': fields.many2one('product.category', 'OpenERP category'),
334
747
    }
335
748
esale_oscom_category()
336
749
 
339
752
    _name = "esale.oscom.paytype"
340
753
    _description = "esale_oscom PayType"
341
754
    _columns = {
342
 
        'name': fields.char('Name', size=64, reuired=True, readonly=True),
 
755
        'name': fields.char('Name', size=64, required=True, readonly=True),
343
756
        'esale_oscom_id': fields.integer('OScommerce Id', required=True),
344
757
        'web_id': fields.many2one('esale.oscom.web', 'Website'),
345
758
        'payment_id': fields.many2one('payment.type', 'OpenERP payment'),
346
 
        'paytyp': fields.selection([('type1','SO in State Draft'),('type2','SO Confirmed'),('type3','Invoice Draft'),('type4','Invoice Confirmed'),('type5','Invoice Payed')], 'Payment Type'),
 
759
        'paytyp': fields.selection([('type1','SO in State Draft'),('type2','SO Confirmed'),('type3','Invoice Draft'),('type4','Invoice Confirmed'),('type5','Invoice Payed')], 'Payment type'),
 
760
        'journal_id': fields.many2one('account.journal', 'OpenERP payment journal'),
347
761
    }
348
762
esale_oscom_paytype()
349
763
 
350
764
 
351
 
#class esale_oscom_payment_method(osv.osv):
352
 
#    _name = "esale.oscom.payment.method"
353
 
#    _description = "esale_oscom Paymant Type Methods"
354
 
#    _columns = {'name': fields.char('Name', size=64, reuired=True),
355
 
#        'web_id': fields.many2one('esale.oscom.web', 'Website'),
356
 
#    }
357
 
#esale_oscom_payment_method()
358
 
 
359
 
 
360
765
class esale_oscom_product(osv.osv):
361
766
    _name = "esale.oscom.product"
362
767
    _description = "esale_oscom Product"
363
768
    _columns = {
364
769
        'name': fields.char('Name', size=64, required=True, readonly=True),
365
770
        'esale_oscom_id': fields.integer('OScommerce product Id'),
366
 
        'esale_oscom_tax_id': fields.many2one('esale.oscom.tax', 'OScommerce tax'),
367
771
        'web_id': fields.many2one('esale.oscom.web', 'Website'),
368
 
        'product_id': fields.many2one('product.product', 'OpenERP Product'),
 
772
        'product_id': fields.many2one('product.product', 'OpenERP product'),
369
773
    }
370
774
 
371
775
    def onchange_product_id(self, cr, uid, ids, product_id, web_id):
398
802
        'name': fields.char('Name', size=32, required=True, readonly=True),
399
803
        'esale_oscom_id': fields.integer('OScommerce Id', required=True),
400
804
        'web_id': fields.many2one('esale.oscom.web', 'Website'),
401
 
        'language_id': fields.many2one('res.lang', 'OpenERP Language'),
 
805
        'language_id': fields.many2one('res.lang', 'OpenERP language'),
402
806
    }
403
807
esale_oscom_language()
404
808
 
415
819
 
416
820
    _inherit='sale.order.line'
417
821
    _columns = {
418
 
        'price_unit': fields.float('Unit Price', required=True, digits=(16, 2)),
419
 
        'price_net': fields.function(_amount_line_net, method=True, string='Net Price', digits=(16, 2)),
 
822
        'price_unit': fields.float('Unit price', required=True, digits=(16, 2)),
 
823
        'price_net': fields.function(_amount_line_net, method=True, string='Net price', digits=(16, 2)),
420
824
    }
421
825
esale_oscom_saleorder_line()
422
826
 
428
832
    _columns = {
429
833
        'esale_oscom_web': fields.many2one('esale.oscom.web', 'Website'),
430
834
        'esale_oscom_id': fields.integer('esale_oscom Id'),
 
835
        'pay_met_title': fields.char('Payment Method', size=255),
 
836
        'shipping_title': fields.char('Shipping', size=255),
 
837
        'orders_status': fields.char('Oscommerce Status', size=255),
431
838
    }
432
839
    _defaults = {
433
840
        'esale_oscom_id': lambda *a: False,