def schedule_etl_move_header_import(self, cr, uid, context=None): ''' Import header movements ''' from openerp.addons.base_mssql.tools import conversion _logger.info("Start import movement header!") agent_list = [] try: partner_proxy = self.pool.get("res.partner") product_proxy = self.pool.get('product.product') accounting_proxy = self.pool.get('micronaet.accounting') payment_proxy = self.pool.get('account.payment.term') reason_proxy = self.pool.get('stock.picking.transportation_reason') # ------------------ # Import move header: # ------------------ cursor = accounting_proxy.get_mm_header( cr, uid, context=context) if not cursor: _logger.error( "Unable to connect no importation of movement header!") return False i = 0 for record in cursor: try: i += 1 name = accounting_proxy.KEY_MM_HEADER_FORMAT % (record) if i % 500 == 0: _logger.info('Header %s: record imported/updated!' % i) partner_id = partner_proxy.get_partner_from_sql_code( cr, uid, record['CKY_CNT_CLFR'], context = context) agent_id = partner_proxy.get_partner_from_sql_code( cr, uid, record['CKY_CNT_AGENTE'], context=context) reason_id = reason_proxy.get_transportation( cr, uid, record['NKY_CAUM'], context = context) if agent_id and agent_id not in agent_list: agent_list.append(agent_id) data = { # Movement line: 'name': name, # line key 'date': conversion.get_date(record['DTT_DOC']), 'type': record['CSG_DOC'].upper(), 'partner_id': partner_id, 'agent_id': agent_id, 'reason_id': reason_id, 'note': record['CDS_NOTE'], #'total': 0.0, #'analysis_total': 0.0, } item_id = self.search(cr, uid, [('name', '=', name)]) if item_id: item_id = item_id[0] self.write(cr, uid, item_id, data, context=context) else: item_id = self.create(cr, uid, data, context=context) except: _logger.error( 'Header [%s] Error importing, jumped! [%s]' % ( name, sys.exc_info(), )) continue # ----------------- # Update foot info: # ----------------- _logger.info("Start import movement footer!") cursor = accounting_proxy.get_mm_footer(cr, uid, context=context) if not cursor: _logger.error( "Unable to connect no importation of movement footer!") return False i = 0 for record in cursor: try: i += 1 name = accounting_proxy.KEY_MM_HEADER_FORMAT % (record) if i % 500 == 0: _logger.info('Footer %s: record imported/updated!' % i) payment_id = payment_proxy.get_payment( cr, uid, record['NKY_PAG'], context = context) item_id = self.search(cr, uid, [('name', '=', name)]) if item_id: self.write(cr, uid, item_id[0], { 'payment_id': payment_id, }, context=context) else: pass # jump except: _logger.error( 'Header [%s] Error importing, jumped! [%s]' % ( name, sys.exc_info(), )) continue # Update agent list: if agent_list: partner_proxy.write(cr, uid, agent_list, { 'is_agent': True}, context=context) # TODO reset before? _logger.info('End importation. All header is updated!') except: _logger.error('Error generic import header lines: %s' % ( sys.exc_info(), )) return False return True
def schedule_etl_move_line_import(self, cr, uid, parent_product=0, verbose_log_count=500, only_analysis=True, debug_limit=0, lot_range=(0, 0), only_movement_list=False, context=None): ''' Import movement from external DB: parent_product: number of char of product code to identify the parent code (program search also parent product ID lot_range: if present is the range of char where lot is localized: (from, to) verbose_log_count: number or record for verbose log importation only_analysis: import only movement for sold analysis (else all) debug_limit: tot record of MM imported (for debug purposes) movement_list: list of document to import movement ''' from openerp.addons.base_mssql.tools import conversion _logger.info("Start import movement!") try: order_line_proxy = self.pool.get("sql.move.line") partner_proxy = self.pool.get("res.partner") product_proxy = self.pool.get('product.product') accounting_proxy = self.pool.get('micronaet.accounting') lot_exist = any(lot_range) movement_list = [item[0] for item in self.movement_type] # general list for check correct code doc. if only_movement_list: # import only some document: (in this case there's not test for only:_analyisis) if type(only_movement_list) not in (tuple, list): # string (single value) only_movement_list = [only_movement_list, ] else: if only_analysis: # search only document for analysis only_movement_list = [item[0] for item in self.movement_sell] else: # All known docs only_movement_list = movement_list # ------------------ # Import move lines: # ------------------ _logger.info("Start import movement line!") cursor = accounting_proxy.get_mm_line( cr, uid, where_document=only_movement_list, context=context) if not cursor: _logger.error("Unable to connect no importation of movement line!") return False i = 0 for record in cursor: try: i += 1 name = str(accounting_proxy.KEY_MM_LINE_FORMAT % (record)) header = accounting_proxy.KEY_MM_HEADER_FORMAT % (record) type_value = record['CSG_DOC'].upper() # For debug purposes: if debug_limit and i > debug_limit: break if verbose_log_count and i % verbose_log_count == 0: _logger.info('Line %s: record imported / updated!' % (i, )) default_code = record['CKY_ART'] product_id = product_proxy.get_product_from_sql_code( cr, uid, default_code, context=context) # TODO log and comunicate what lines are not included! if not product_id: # Create a minimal product for go ahead product_id = product_proxy.fast_product_create( cr, uid, default_code, context=context) _logger.warning('Line %s Product create [%s]!' % ( name, default_code)) lot = False if parent_product and len(default_code) > parent_product: # Parent: parent_product_id = product_proxy.get_product_from_sql_code( cr, uid, default_code[:parent_product], context=context) # TODO parametrize force creation of parent product!!! if not parent_product_id: parent_product_id = product_proxy.fast_product_create( cr, uid, default_code[:parent_product], context=context) _logger.warning('Line %s Parent product create [%s]!' % ( name, default_code[:parent_product])) # Lot: try: if lot_exist: lot = default_code[lot_range[0]:lot_range[1]] except: lot = False else: parent_product_id = False data = { # Movement line: 'name': name, # line key 'header': header, # header key 'deadline': conversion.get_date(record['DTT_SCAD']), 'product_id': product_id, 'product_description': record['CDS_VARIAB_ART'], 'parent_product_id': parent_product_id, 'lot': lot, 'type': type_value, 'move_agent_code': record['CKY_CNT_AGEN'], } item_id = self.search(cr, uid, [('name', '=', name)]) if item_id: item_id = item_id[0] self.write(cr, uid, item_id, data) else: item_id = self.create(cr, uid, data) except: _logger.error('Line [%s] Error jumped! [%s]' % ( name, sys.exc_info())) continue # -------------------- # Update funz element: # -------------------- _logger.info("Start import functional movement line!") cursor = accounting_proxy.get_mm_funz_line( cr, uid, where_document = only_movement_list, context=context) if not cursor: _logger.error("Unable to connect no importation of funz line!") return False i = 0 for record in cursor: try: i += 1 if verbose_log_count and i % verbose_log_count == 0: _logger.info('Funz. line %s: record imported / updated!' % (i, )) name = str(accounting_proxy.KEY_MM_LINE_FORMAT % (record)) type_value = record['CSG_DOC'].upper() # For debug purposes: if debug_limit and i > debug_limit: break total = self.sign.get(type_value, 1) * record['NMP_VALMOV_UM1'] quantity = self.sign.get(type_value, 1) * record['NQT_MOVM_UM1'] data = { 'quantity': quantity, 'analysis_quantity': -(quantity), 'total': total, 'analysis_total': -(total), } try: item_id = self.search(cr, uid, [('name','=',name)]) if item_id: self.write(cr, uid, item_id, data) except: continue # not found (jump line) # TODO log! except: _logger.error('Line [%s] Error importing record, jumped!' % (i, )) continue # ------------------- # Update with header: # ------------------- _logger.info("Start import header!") cursor = accounting_proxy.get_mm_header(cr, uid, where_document = only_movement_list, context=context) if not cursor: _logger.error("Unable to connect no importation of header list!") return False i = 0 for record in cursor: try: i += 1 # For debug purposes: if debug_limit and i > debug_limit: break header = accounting_proxy.KEY_MM_HEADER_FORMAT % (record) partner_id = partner_proxy.get_partner_from_sql_code(cr, uid, record['CKY_CNT_CLFR'], context = context) if not partner_id: _logger.error('Header %s - Partner not found: [%s]!' % (header, record['CKY_CNT_CLFR'], )) data = { 'date': conversion.get_date(record['DTT_DOC']), 'partner_id': partner_id, 'note': record['CDS_NOTE'], } # only update lines with headers falue (line must exist) item_ids = self.search(cr, uid, [('header', '=', header)]) # N lines with this header if item_ids: updated = self.write(cr, uid, item_ids, data) if verbose_log_count and i % verbose_log_count == 0: _logger.info('Header %s: records imported / updated!' % (i, )) except: _logger.error('[%s] Error importing records, jumped: %s' % (i, record, )) continue _logger.info('End importation. All record is updated!') except: _logger.error('Error generic import movement lines: %s' % (sys.exc_info(), )) return False return True