예제 #1
0
    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
예제 #2
0
    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