Пример #1
0
    def reset_workflow(self, cr, uid, ids, *args):
        # Called by workflow, launch needed action depending
        # of the next state and reset the workflow
        transaction_obj = self.pool.get('account.wallet.transaction')
        for proposition in self.browse(cr, uid, ids):
            state = proposition.state
            role_to_test = 'is_user'
            if state == 'rejected':
                role_to_test = 'is_announcer'
            elif state == 'paid':
                role_to_test = 'is_receiver'
            self.test_access_role(cr, uid, ids, role_to_test, *args)

            if state in ['cancel', 'rejected', 'paid']:
                workflow.trg_delete(uid, 'marketplace.proposition',
                                    proposition.id, cr)
                workflow.trg_create(uid, 'marketplace.proposition',
                                    proposition.id, cr)

            if state == 'paid':
                skip_confirm = transaction_obj.get_skip_confirm(
                    cr, uid, proposition.transaction_id)
                if not skip_confirm:
                    workflow.trg_validate(uid, 'marketplace.proposition',
                                          proposition.id,
                                          'proposition_draft_confirm_refund',
                                          cr)
                else:
                    workflow.trg_validate(
                        uid, 'marketplace.proposition', proposition.id,
                        'proposition_paid_cancel_through_draft', cr)
        return True
    def reset_workflow(self, cr, uid, ids, *args):
        # Called by workflow, launch needed action depending
        # of the next state and reset the workflow
        for transaction in self.browse(cr, uid, ids):
            state = transaction.state
            role_to_test = 'is_sender'
            if state == 'done':
                role_to_test = 'is_receiver'
            self.test_access_role(cr, uid, ids, role_to_test, *args)

            workflow.trg_delete(uid, 'exchange.transaction', transaction.id,
                                cr)
            workflow.trg_create(uid, 'exchange.transaction', transaction.id,
                                cr)

            if state == 'done':
                skip_confirm = self.get_skip_confirm(cr, uid, transaction)
                if not skip_confirm:
                    workflow.trg_validate(uid, 'exchange.transaction',
                                          transaction.id,
                                          'transaction_draft_confirm_refund',
                                          cr)
                else:
                    workflow.trg_validate(
                        uid, 'exchange.transaction', transaction.id,
                        'transaction_done_cancel_through_draft', cr)
        return True
Пример #3
0
    def action_revert_done(self):
        for picking in self:
            # only in incoming pickings
            if picking.picking_type_code != 'incoming':
                raise exceptions.Warning(
                    _('Picking %s is not incoming. '
                      'Only valid in incoming pickings.') % (picking.name))

            if not picking.has_revert_picking():
                raise exceptions.Warning(
                    _('Picking %s is not reverted: '
                      'revert it first.') % (picking.name))

            if picking.has_valuation_moves():
                raise exceptions.Warning(
                    _('Picking %s has valuation moves: '
                      'remove them first.') % (picking.name))
            if picking.invoice_id and picking.invoice_id.state != 'cancel':
                raise exceptions.Warning(
                    _('Picking %s has invoices!') % (picking.name))
            picking.move_lines.write({'state': 'draft'})
            picking.state = 'draft'
            if picking.invoice_state == 'invoiced' and not picking.invoice_id or picking.invoice_id.state == 'cancel':
                picking.invoice_state = '2binvoiced'
            # Deleting the existing instance of workflow
            workflow.trg_delete(self._uid, 'stock.picking', picking.id,
                                self._cr)
            workflow.trg_create(self._uid, 'stock.picking', picking.id,
                                self._cr)
            picking.message_post(
                _("The picking has been re-opened and set to draft state"))
        return
Пример #4
0
    def reset_workflow(self, cr, uid, ids, *args):
        # Called by workflow, launch needed action depending
        # of the next state and reset the workflow
        for transaction in self.browse(cr, uid, ids):
            state = transaction.state
            role_to_test = 'is_sender'
            if state == 'done':
                role_to_test = 'is_receiver'
            self.test_access_role(cr, uid, ids, role_to_test, *args)

            workflow.trg_delete(
                uid, 'exchange.transaction', transaction.id, cr
            )
            workflow.trg_create(
                uid, 'exchange.transaction', transaction.id, cr
            )

            if state == 'done':
                skip_confirm = self.get_skip_confirm(cr, uid, transaction)
                if not skip_confirm:
                    workflow.trg_validate(
                        uid, 'exchange.transaction', transaction.id,
                        'transaction_draft_confirm_refund', cr
                    )
                else:
                    workflow.trg_validate(
                        uid, 'exchange.transaction', transaction.id,
                        'transaction_done_cancel_through_draft', cr
                    )
        return True
Пример #5
0
    def action_cancel_draft(self, cr, uid, ids, *args):
        self.write(cr, uid, ids, {'state': 'draft'})

        for distinta_id in ids:
            workflow.trg_delete(uid, 'riba.distinta', distinta_id, cr)
            workflow.trg_create(uid, 'riba.distinta', distinta_id, cr)
        return True
Пример #6
0
    def action_cancel_draft(self, cr, uid, ids, *args):
        self.write(cr, uid, ids, {'state':'draft'})

        for distinta_id in ids:
            workflow.trg_delete(uid, 'riba.distinta', distinta_id, cr)
            workflow.trg_create(uid, 'riba.distinta', distinta_id, cr)
        return True
Пример #7
0
    def reset_workflow(self, cr, uid, ids, *args):
        # Called by workflow, launch needed action depending of the next state and reset the workflow
        transaction_obj = self.pool.get('account.wallet.transaction')
        for proposition in self.browse(cr, uid, ids):
            state = proposition.state
            role_to_test = 'is_user'
            if state == 'rejected':
                role_to_test = 'is_announcer'
            elif state == 'paid':
                role_to_test = 'is_receiver'
            self.test_access_role(cr, uid, ids, role_to_test, *args)

            workflow.trg_delete(uid, 'marketplace.proposition', proposition.id, cr)
            workflow.trg_create(uid, 'marketplace.proposition', proposition.id, cr)

            if state == 'paid':
                skip_confirm = transaction_obj.get_skip_confirm(cr, uid, proposition.transaction_id)
                if not skip_confirm:
                    workflow.trg_validate(
                        uid, 'marketplace.proposition', proposition.id, 'proposition_draft_confirm_refund', cr
                    )
                else:
                    workflow.trg_validate(
                        uid, 'marketplace.proposition', proposition.id, 'proposition_paid_cancel_through_draft', cr
                    )
        return True
Пример #8
0
 def action_cancel_draft(self):
     for riba_list in self:
         workflow.trg_delete(self.env.user.id, 'riba.distinta',
                             riba_list.id, self._cr)
         workflow.trg_create(self.env.user.id, 'riba.distinta',
                             riba_list.id, self._cr)
         riba_list.state = 'draft'
         riba_list.line_ids.state = 'draft'
Пример #9
0
 def change_done_pending(self,cr,uid,ids,context=None):
     self.write(cr,SUPERUSER_ID,ids,{'state':'pending','submitted_by':False},context)
     attendance = self.pool.get('attendance.attendance')
     for line in self.browse(cr,uid,ids,context):
         workflow.trg_delete(SUPERUSER_ID, 'attendance.line', line.id, cr)
         workflow.trg_create(SUPERUSER_ID, 'attendance.line', line.id, cr)        
         if line.attendance_id.state == "submitted": #if the attendance record workflow is finished then reset it
             attendance.reset_workflow(cr,uid,line.attendance_id.id,context=context)
     return True
Пример #10
0
 def action_recover(self, cr, uid, ids, context=None):
     """
     Called when the user clicks the draft button to create
     a new workflow instance.
     """
     self.write(cr, uid, ids, {'state': 'new'})
     for item_id in ids:
         workflow.trg_create(uid, 'account_fiscal_year_closing.fyc',
                             item_id, cr)
     return True
Пример #11
0
 def reset_workflow(self, cr, uid, ids, *args):
     # Called by workflow, launch needed action depending of the next state and reset the workflow
     self.test_access_role(cr, uid, ids, 'is_user', *args)
     for announcement in self.browse(cr, uid, ids):
         state = announcement.state
         self.write(cr, uid, [announcement.id], {'state': 'draft'})
         workflow.trg_delete(uid, 'marketplace.announcement', announcement.id, cr)
         workflow.trg_create(uid, 'marketplace.announcement', announcement.id, cr)
         if state == 'done':
             workflow.trg_validate(uid, 'marketplace.announcement', announcement.id, 'announcement_draft_open', cr)
     return True
Пример #12
0
 def action_set_to_draft(self):
     """
     This method is used to change the state
     to draft of the hotel restaurant reservation
     --------------------------------------------
     @param self: object pointer
     """
     self.write({'state': 'draft'})
     for res_id in self.ids:
         workflow.trg_create(self._uid, self._name, res_id, self._cr)
     return True
Пример #13
0
 def action_set_to_dirty(self):
     """
     This method is used to change the state
     to dirty of the hotel housekeeping
     ---------------------------------------
     @param self: object pointer
     """
     self.write({'state': 'dirty'})
     for hs_keep_id in self.ids:
         workflow.trg_create(self._uid, self._name, hs_keep_id, self._cr)
     return True
Пример #14
0
 def reset_workflow(self, cr, uid, ids, *args):
     # Called by workflow, launch needed action depending of the next state and reset the workflow
     self.test_access_role(cr, uid, ids, 'is_user', *args)
     for announcement in self.browse(cr, uid, ids):
         state = announcement.state
         self.write(cr, uid, [announcement.id], {'state': 'draft'})
         workflow.trg_delete(uid, 'marketplace.announcement',
                             announcement.id, cr)
         workflow.trg_create(uid, 'marketplace.announcement',
                             announcement.id, cr)
         if state == 'done':
             workflow.trg_validate(uid, 'marketplace.announcement',
                                   announcement.id,
                                   'announcement_draft_open', cr)
     return True
Пример #15
0
 def action_cancel_draft(self):
     lines = self.env['sale.order.line'].\
         search([
                 ('order_id', 'in', self.ids),
                 ('state', '=', 'cancel'),
                 ])
     self.write({
         'state': 'draft',
         'invoice_ids': [(6, 0, [])],
         'shipped': 0,
     })
     lines.write({
         'invoiced': False,
         'state': 'draft',
         'invoice_lines': [(6, 0, [])],
     })
     for sale in self:
         # Deleting the existing instance of workflow for SO
         workflow.trg_delete(self._uid, 'sale.order', sale.id, self._cr)
         workflow.trg_create(self._uid, 'sale.order', sale.id, self._cr)
     return True
Пример #16
0
 def action_revert_done(self):
     for picking in self:
         if picking.has_valuation_moves():
             raise exceptions.Warning(
                 _('Picking %s has valuation moves: '
                   'remove them first.') % (picking.name))
         if picking.invoice_id:
             raise exceptions.Warning(
                 _('Picking %s has invoices!') % (picking.name))
         picking.move_lines.write({'state': 'draft'})
         picking.state = 'draft'
         if picking.invoice_state == 'invoiced' and not picking.invoice_id:
             picking.invoice_state = '2binvoiced'
         # Deleting the existing instance of workflow
         workflow.trg_delete(self._uid, 'stock.picking', picking.id,
                             self._cr)
         workflow.trg_create(self._uid, 'stock.picking', picking.id,
                             self._cr)
         picking.message_post(
             _("The picking has been re-opened and set to draft state"))
     return
Пример #17
0
 def action_revert_done(self):
     for picking in self:
         if picking.has_valuation_moves():
             raise exceptions.Warning(
                 _('Picking %s has valuation moves: '
                   'remove them first.') % (picking.name))
         if picking.invoice_id:
             raise exceptions.Warning(
                 _('Picking %s has invoices!') % (picking.name))
         for move in picking.move_lines:
             for quant in move.quant_ids:
                 if move.location_id.id == quant.location_id.id:
                     quant.qty += move.product_uom_qty
                 elif move.location_dest_id.id == quant.location_id.id:
                     quant.qty -= move.product_uom_qty
             move.procurement_id.write({'state': 'exception'})
         picking.move_lines.write({'state': 'draft'})
         picking.pack_operation_ids.unlink()
         picking.state = 'draft'
         if picking.invoice_state == 'invoiced' and not picking.invoice_id:
             picking.invoice_state = '2binvoiced'
         # Deleting the existing instance of workflow
         workflow.trg_delete(self._uid, 'stock.picking', picking.id,
                             self._cr)
         workflow.trg_create(self._uid, 'stock.picking', picking.id,
                             self._cr)
         picking.message_post(
             _("The picking has been re-opened and set to draft state"))
         if picking.sale_id:
             picking.sale_id.write({'state': 'progress'})
             instance = self.env['workflow.instance'].search([
                 ('res_type', '=', 'sale.order'),
                 ('res_id', '=', picking.sale_id.id)
             ])
             instance.state = 'active'
             for item in self.env['workflow.workitem'].search([
                 ('inst_id', '=', instance.id)
             ]):
                 item.state = 'active'
     return
Пример #18
0
 def action_revert_done(self):
     for picking in self:
         if picking.has_valuation_moves():
             raise exceptions.Warning(
                 _('Picking %s has valuation moves: '
                     'remove them first.')
                 % (picking.name))
         if picking.invoice_id:
             raise exceptions.Warning(
                 _('Picking %s has invoices!') % (picking.name))
         picking.move_lines.write({'state': 'draft'})
         picking.state = 'draft'
         if picking.invoice_state == 'invoiced' and not picking.invoice_id:
             picking.invoice_state = '2binvoiced'
         # Deleting the existing instance of workflow
         workflow.trg_delete(
             self._uid, 'stock.picking', picking.id, self._cr)
         workflow.trg_create(
             self._uid, 'stock.picking', picking.id, self._cr)
         picking.message_post(
             _("The picking has been re-opened and set to draft state"))
     return
Пример #19
0
 def action_revert_done(self):
     for picking in self:
         if picking.has_valuation_moves():
             raise exceptions.Warning(
                 _('La orden de entrega %s tiene movimientos: '
                   'eliminelos primero.') % (picking.name))
         if picking.invoice_id:
             raise exceptions.Warning(
                 _('La orden de entrega %s esta facturada!') %
                 (picking.name))
         picking.move_lines.write({'state': 'draft'})
         picking.state = 'draft'
         if picking.invoice_state == 'invoiced' and not picking.invoice_id:
             picking.invoice_state = '2binvoiced'
         # Deleting the existing instance of workflow
         workflow.trg_delete(self._uid, 'stock.picking', picking.id,
                             self._cr)
         workflow.trg_create(self._uid, 'stock.picking', picking.id,
                             self._cr)
         picking.message_post(
             _("La orden de entrega se rehizo, convirtiendose en estado borrador"
               ))
     return
Пример #20
0
 def change_done_pending(self,cr,uid,ids,context=None):
     self.write(cr,uid,ids,{'state':'pending'},context)
     for attendance in ids:
         workflow.trg_delete(SUPERUSER_ID, 'attendance.attendance', attendance, cr)
         workflow.trg_create(SUPERUSER_ID, 'attendance.attendance', attendance, cr)
     return True
Пример #21
0
# -*- coding: utf-8 -*-
Пример #22
0
 def reset_workflow(self,cr,uid,id,context):
     workflow.trg_delete(SUPERUSER_ID, 'attendance.attendance', id, cr)
     workflow.trg_create(SUPERUSER_ID, 'attendance.attendance', id, cr)
     return True
Пример #23
0
    def action_reopen(self, cr, uid, ids, context=None):
        """ Changes SO state to draft.
        @return: True
        """
        _logger = logging.getLogger(__name__)
        _logger.debug('FGF sale_order action reopen %s' % (ids))
        self.allow_reopen(cr, uid, ids, context=None)
        order_line_obj = self.pool.get('sale.order.line')
        po_line_obj = self.pool.get('purchase.order.line')
        move_obj = self.pool.get('stock.move')
        invoice_obj = self.pool.get('account.invoice')
        context.update({'cancel_procurement': True})
        for order in self.browse(cr, uid, ids, context=context):
            proc_group_id = order.procurement_group_id
            if proc_group_id:
                #Raise warning if PO/MO is confirmed
                for proc in proc_group_id.procurement_ids:
                    if proc.purchase_id and proc.purchase_id.state not in [
                            'draft', 'cancel'
                    ]:
                        raise osv.except_osv(
                            _('Warning'),
                            _('You can not reset sales order %s as related Purchase order %s is confirmed.'
                              % (order.name, proc.purchase_id.name)))
                    if proc.production_id and proc.production_id.state not in [
                            'new', 'cancel', 'confirmed', 'ready'
                    ]:
                        raise osv.except_osv(
                            _('Warning'),
                            _('You can not reset sales order %s as production started for related Manufacturing order %s.'
                              % (order.name, proc.production_id.name)))
                for proc in proc_group_id.procurement_ids:
                    for move in proc.move_ids:
                        move_obj.action_cancel(cr,
                                               uid,
                                               move.id,
                                               context=context)
                    proc.cancel()
            for oline in order.order_line:
                oline.procurement_ids = False

            if order.invoice_ids:
                flag = False
                for invoice in order.invoice_ids:
                    if invoice.state in [
                            'paid', 'open', 'proforma', 'proforma2'
                    ]:
                        raise osv.except_osv(
                            _('Warning'),
                            _('You can not reset this Sale Order as it\'s invoice not in draft'
                              ))
                    if invoice.state in ['draft']:
                        invoice_obj.unlink(cr,
                                           uid, [invoice.id],
                                           context=context)
            self.write(cr, uid, order.id, {'state': 'draft'})
            line_ids = []
            for line in order.order_line:
                line_ids.append(line.id)
            order_line_obj.write(cr, uid, line_ids, {
                'state': 'draft',
                'invoiced': False
            })
            _logger.debug('FGF sale_order trg del %s' % (order.id))
            workflow.trg_delete(uid, 'sale.order', order.id, cr)
            _logger.debug('FGF sale_order trg create %s' % (order.id))
            workflow.trg_create(uid, 'sale.order', order.id, cr)

            pol_fields = po_line_obj.fields_get(cr, uid, context=context)
            sol_fields = order_line_obj.fields_get(cr, uid, context=context)

            so_fields = self.fields_get(cr, uid, context=context)
            if so_fields.has_key('has_limit') and so_fields.has_key('by_pass'):
                self.write(cr, uid, ids, {
                    'has_limit': order.partner_id.allow_credit,
                    'by_pass': False
                })

            if so_fields.has_key('ticket_button_visible'):
                self.write(cr, uid, ids, {'ticket_button_visible': False})

            if so_fields.has_key('ticket_generated'):
                self.write(cr, uid, ids, {'ticket_generated': False})

            if so_fields.has_key('generated_by_admin'):
                self.write(cr, uid, ids, {'generated_by_admin': False})

            if so_fields.has_key('generated_by_oem'):
                self.write(cr, uid, ids, {'generated_by_oem': False})

            if so_fields.has_key('generated_by_admin'):
                self.write(cr, uid, ids, {'generated_by_admin': False})

            if so_fields.has_key('is_mo_created'):
                self.write(cr, uid, ids, {'is_mo_created': False})

            if so_fields.has_key('carrier') and so_fields.has_key(
                    'method') and so_fields.has_key('ship_ids'):
                self.write(cr, uid, ids, {
                    'carrier': '',
                    'method': '',
                    'ship_ids': []
                })

            #Remove SO ref from PO line if ob_sol_to_po installed
            if pol_fields.has_key('so_ref') and pol_fields.has_key(
                    'so_line_ref'):
                po_line_ids = po_line_obj.search(cr,
                                                 uid,
                                                 [('so_ref', '=', order.name)],
                                                 context=context)
                po_line_obj.write(cr,
                                  uid,
                                  po_line_ids, {
                                      'so_ref': False,
                                      'so_line_ref': False
                                  },
                                  context=context)
            #Remove PO ref from SO line if ob_sol_to_po installed
            if sol_fields.has_key('po_ref') and sol_fields.has_key(
                    'po_line_ref'):
                for oline in order.order_line:
                    order_line_obj.write(cr,
                                         uid,
                                         oline.id, {
                                             'po_ref': False,
                                             'po_line_ref': False
                                         },
                                         context=context)
        return True
Пример #24
0
    def bulk_invoice_ar(self, cr, uid, data, context=None):
        result = []
        invoices = []
        invoice_lines = []
        moves = []
        move_lines = []
        # wkf_instances = []
        # wf_service = netsvc.LocalService("workflow")

        # INSERT HEADER INVOICE
        start_time = datetime.now()
        begin_time = start_time

        company_cols = {}
        analytic4_cols = {}
        analytic3_cols = {}
        analytic2_cols = {}
        analytic1_cols = {}
        account_cols = {}
        branch_cols = {}
        period_cols = {}
        journal_cols = {}

        invoice_cols = {}
        headeraccount_cols = {}
        detailaccount_cols = {}
        moveid_cols = {}
        company_id_period_cols = {}

        invoice_vals = []

        for n, dt in enumerate(data, start=0):
            module_analytic = dt['Analytic Account'].split('.', 1)[0]
            identifier_analytic = dt['Analytic Account'].split('.', 1)[1]
            module_account = dt['Header Account'].split('.', 1)[0]
            identifier_account = dt['Header Account'].split('.', 1)[1]
            module_branch = dt['Branch'].split('.', 1)[0]
            identifier_branch = dt['Branch'].split('.', 1)[1]
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = cr.fetchone()
                company_id = list == type(
                    company_id) and company_id[0] or company_id
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_analytic_identifier_analytic = '%s__%s' % (
                module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[
                    module_analytic_identifier_analytic] = analytic_4
            else:
                analytic_4 = analytic4_cols[
                    module_analytic_identifier_analytic]

            if not analytic_4 in analytic3_cols:
                cr.execute(
                    """SELECT parent_id FROM account_analytic_account WHERE   id = %s """,
                    (analytic_4))
                analytic_3 = cr.fetchone()
                analytic_3 = self.pool.get('account.analytic.account').browse(
                    cr, uid, [analytic_3[0]], context=None)
                analytic3_cols[analytic_4] = analytic_3
            else:
                analytic_3 = analytic3_cols[analytic_4]

            if not analytic_3 in analytic2_cols:
                analytic_2 = self._get_analytic_2(cr,
                                                  uid,
                                                  analytic_3,
                                                  context=None)
                analytic2_cols[analytic_3] = analytic_2
            else:
                analytic_2 = analytic2_cols[analytic_3]

            if not company_id in analytic1_cols:
                cr.execute(
                    """SELECT id FROM account_analytic_account WHERE   segmen = 1 AND company_id = %s """,
                    ((company_id, )))
                analytic_1 = cr.fetchone()
                analytic1_cols[company_id] = analytic_1
            else:
                analytic_1 = analytic1_cols[company_id]

            module_account_identifier_account = '%s__%s' % (module_account,
                                                            identifier_account)
            if not module_account_identifier_account in account_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_account, identifier_account))
                account_id = int(cr.fetchone()[0])
                account_cols[module_account_identifier_account] = account_id
            else:
                account_id = account_cols[module_account_identifier_account]

            module_branch_identifier_branch = '%s__%s' % (module_branch,
                                                          identifier_branch)
            if not module_branch_identifier_branch in branch_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_branch, identifier_branch))
                branch_id = int(cr.fetchone()[0])
                branch_cols[module_branch_identifier_branch] = branch_id
            else:
                branch_id = branch_cols[module_branch_identifier_branch]

            if not company_id in period_cols:
                cr.execute(
                    """SELECT id FROM account_period WHERE name = %s AND  company_id = %s """,
                    (dt['Period'], company_id))
                period_id = cr.fetchone()
                period_id = list == type(period_id) and int(
                    period_id[0]) or period_id
                period_cols[company_id] = period_id
            else:
                period_id = period_cols[company_id]

            if not company_id in journal_cols:
                cr.execute(
                    """SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """,
                    (dt['Journal'], company_id))
                journal_id = cr.fetchone()
                journal_id = list == type(journal_id) and int(
                    journal_id[0]) or journal_id
                journal_cols[company_id] = journal_id
            else:
                journal_id = journal_cols[company_id]

            invoice_vals.append({
                'create_uid':
                1,
                'create_date':
                datetime.now(),
                'write_date':
                datetime.now(),
                'write_uid':
                1,
                'division':
                dt['Division'],
                'partner_id':
                dt['Partner'],
                'origin':
                dt['Source Document'],
                'supplier_invoice_number':
                dt['Supplier Invoice Number'],
                'date_due':
                dt['Due Date'],
                'branch_id':
                branch_id,
                'journal_id':
                journal_id,
                'period_id':
                period_id,
                'analytic_1':
                list == type(analytic_1) and analytic_1[0] or analytic_1,
                'analytic_2':
                list == type(analytic_2) and analytic_2[0] or analytic_2,
                'analytic_3':
                analytic_3.id,
                'analytic_4':
                list == type(analytic_4) and analytic_4[0] or analytic_4,
                'date_invoice':
                dt['Date'],
                'company_id':
                company_id,
                'state':
                'open',
                'currency_id':
                13,
                'reference_type':
                'none',
                'type':
                dt['Invoice Type'],
                'account_id':
                account_id,
                'amount_total':
                dt['Line / Price Unit'],
                'residual':
                dt['Line / Price Unit'],
                'consolidated':
                'Consolidated' in dt and dt['Consolidated'] or True,
            })

        invoice_ids = self.insert_many(cr,
                                       uid,
                                       'account_invoice',
                                       'origin,id',
                                       invoice_vals,
                                       context=None)
        inv_ids = [x[1] for x in invoice_ids]
        invoice_ids = dict(invoice_ids)

        #     data_structure = (
        #         1,
        #         datetime.now(),
        #         datetime.now(),
        #         1,
        #         dt['Division'],
        #         dt['Partner'],
        #         dt['Source Document'],
        #         dt['Supplier Invoice Number'],
        #         dt['Due Date'],
        #         branch_id,
        #         journal_id,
        #         period_id,
        #         analytic_1[0],
        #         analytic_2[0],
        #         analytic_3.id,
        #         analytic_4[0],
        #         dt['Date'],
        #         company_id,
        #         'open',
        #         13,
        #         'none',
        #         dt['Invoice Type'],
        #         account_id,
        #         dt['Line / Price Unit'],
        #         dt['Line / Price Unit'],
        #         )
        #     invoices+=[data_structure]
        # cr.executemany("""INSERT INTO account_invoice
        #     (create_uid,create_date,write_date,write_uid,division,partner_id,origin,supplier_invoice_number,date_due,branch_id,journal_id,period_id,analytic_1,analytic_2,analytic_3,analytic_4,date_invoice,company_id,state,currency_id,reference_type,type,account_id,amount_total,residual)
        #     VALUES ("""+ ','.join(['%s' for x in range(0, len(data_structure))])+""")""",invoices)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account invoice = %s' % (
            len(data), format(finish_time - start_time))
        _logger.warning(msg)

        # INSERT DETAIL INVOICE
        source_document_cols = {}
        start_time = datetime.now()
        for dt in data:
            module_analytic = dt['Analytic Account'].split('.', 1)[0]
            identifier_analytic = dt['Analytic Account'].split('.', 1)[1]
            module_account = dt['Line / Account'].split('.', 1)[0]
            identifier_account = dt['Line / Account'].split('.', 1)[1]
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_analytic_identifier_analytic = '%s__%s' % (
                module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[
                    module_analytic_identifier_analytic] = analytic_4
            else:
                analytic_4 = analytic4_cols[
                    module_analytic_identifier_analytic]

            module_account_identifier_account = '%s__%s' % (module_account,
                                                            identifier_account)
            if not module_account_identifier_account in account_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_account, identifier_account))
                account_id = int(cr.fetchone()[0])
                account_cols[module_account_identifier_account] = account_id
            else:
                account_id = account_cols[module_account_identifier_account]

            #source_document = dt['Source Document']
            #if not source_document in source_document_cols:
            #    cr.execute("""SELECT id FROM account_invoice WHERE origin = %s LIMIT 1""", (dt['Source Document'],))
            #    invoice_id = cr.fetchone()
            #    source_document_cols[source_document] = invoice_id
            #else:
            #    invoice_id = source_document_cols[source_document]

            invoice_id = [invoice_ids[dt['Source Document']]]

            data_structure = (
                1,
                datetime.now(),
                datetime.now(),
                1,
                dt['Source Document'],
                account_id,
                invoice_id[0],
                #analytic_1[0],
                #analytic_2[0],
                #analytic_3.id,
                #account_analytic_id[0],
                analytic_4[0],
                company_id,
                dt['Line / Price Unit'],
                1,
                dt['Line / Price Unit'],
            )
            invoice_lines.append(data_structure)

        cr.executemany(
            """INSERT INTO account_invoice_line 
            (create_uid,create_date,write_date,write_uid,name,account_id,invoice_id,account_analytic_id,company_id,price_unit,quantity,price_subtotal)
            VALUES (""" +
            ','.join(['%s' for x in range(0, len(data_structure))]) + """)""",
            invoice_lines)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account invoice line = %s' % (
            len(data), format(finish_time - start_time))
        _logger.warning(msg)

        for x in inv_ids:
            self.button_compute(cr, uid, [x], context=context)
        for inv_id in inv_ids:
            workflow.trg_create(uid, 'account.invoice', inv_id, cr)
            workflow.trg_validate(uid, 'account.invoice', inv_id,
                                  'invoice_open', cr)
        self.action_date_assign(cr, uid, inv_ids)

        # INSERT ACCOUNT MOVE BASED ON INVOICE ABOVE
        company_id_journal_cols = {}
        start_time = datetime.now()
        move_vals = []
        for m in data:
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            #module_invoice_identifier_account = '%s' % (dt['Source Document'])
            #if not module_invoice_identifier_account in invoice_cols:
            #    cr.execute("""SELECT id FROM account_invoice WHERE origin = %s LIMIT 1""", (dt['Source Document'],))
            #    invoice_id = cr.fetchone()
            #    invoice_cols[module_invoice_identifier_account] = invoice_id
            #else:
            #    invoice_id = invoice_cols[module_invoice_identifier_account]

            invoice_id = [invoice_ids[m['Source Document']]]

            company_id_period = '%s__%s' % (dt['Period'], company_id)
            if not company_id_period in company_id_period_cols:
                cr.execute(
                    """SELECT id FROM account_period WHERE name = %s AND  company_id = %s """,
                    (dt['Period'], company_id))
                period_id = int(cr.fetchone()[0])
                company_id_period_cols[company_id_period] = period_id
            else:
                period_id = company_id_period_cols[company_id_period]

            company_id_period = '%s__%s' % (dt['Journal'], company_id)
            if not company_id_period in company_id_journal_cols:
                cr.execute(
                    """SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """,
                    (dt['Journal'], company_id))
                journal_id = int(cr.fetchone()[0])
                company_id_journal_cols[company_id_period] = journal_id
            else:
                journal_id = company_id_journal_cols[company_id_period]

            # data_structure = (
            #     1,
            #     datetime.now(),
            #     datetime.now(),
            #     1,
            #     m['Source Document'],
            #     company_id,
            #     journal_id,
            #     period_id,
            #     m['Date'],
            #     m['Source Document'],
            #     dt['Partner'],
            #     'draft',
            #     invoice_id[0],
            #     'account.invoice'
            #     )
            # moves += [data_structure]

            move_vals.append({
                'create_uid': 1,
                'create_date': datetime.now(),
                'write_date': datetime.now(),
                'write_uid': 1,
                'name': m['Source Document'],
                'company_id': company_id,
                'journal_id': journal_id,
                'period_id': period_id,
                'date': m['Date'],
                'ref': m['Source Document'],
                'partner_id': m['Partner'],
                'state': 'draft',
                'transaction_id': invoice_id[0],
                'model': 'account.invoice',
            })

        # cr.executemany("""INSERT INTO account_move
        #     (create_uid,create_date,write_date,write_uid,name,company_id,journal_id,period_id,date,ref,partner_id,state, transaction_id,model)
        #     VALUES ("""+ ','.join(['%s' for x in range(0, len(data_structure))])+""")""",moves)

        move_ids = self.insert_many(cr,
                                    uid,
                                    'account_move',
                                    'id',
                                    move_vals,
                                    context=None)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account move = %s' % (
            len(data), format(finish_time - start_time))
        _logger.warning(msg)

        # INSERT ACCOUNT MOVE LINE BASED ON ACCOUNT MOVE ABOVE
        start_time = datetime.now()
        for num, m in enumerate(data, start=0):
            module_analytic = m['Analytic Account'].split('.', 1)[0]
            identifier_analytic = m['Analytic Account'].split('.', 1)[1]
            module_header_account = m['Header Account'].split('.', 1)[0]
            identifier_header_account = m['Header Account'].split('.', 1)[1]
            module_detail_account = dt['Line / Account'].split('.', 1)[0]
            identifier_detail_account = dt['Line / Account'].split('.', 1)[1]
            module_branch = dt['Branch'].split('.', 1)[0]
            identifier_branch = dt['Branch'].split('.', 1)[1]
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_branch_identifier_branch = '%s__%s' % (module_branch,
                                                          identifier_branch)
            if not module_branch_identifier_branch in branch_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_branch, identifier_branch))
                branch_id = int(cr.fetchone()[0])
                branch_cols[module_branch_identifier_branch] = branch_id
            else:
                branch_id = branch_cols[module_branch_identifier_branch]

            module_analytic_identifier_analytic = '%s__%s' % (
                module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[
                    module_analytic_identifier_analytic] = analytic_4
            else:
                analytic_4 = analytic4_cols[
                    module_analytic_identifier_analytic]

            modul_headeraccount = '%s__%s' % (module_header_account,
                                              identifier_header_account)
            if not modul_headeraccount in headeraccount_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_header_account, identifier_header_account))
                header_account_id = cr.fetchone()
                headeraccount_cols[modul_headeraccount] = header_account_id
            else:
                header_account_id = headeraccount_cols[modul_headeraccount]

            module_detailaccount = '%s__%s' % (module_detail_account,
                                               identifier_detail_account)
            if not module_detailaccount in detailaccount_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_detail_account, identifier_detail_account))
                detail_account_id = cr.fetchone()
                detailaccount_cols[module_detailaccount] = detail_account_id
            else:
                detail_account_id = detailaccount_cols[module_detailaccount]

            # module_moveid = '%s' % (m['Source Document'])
            # if not module_moveid in moveid_cols:
            #     cr.execute("""SELECT id FROM account_move WHERE name = %s """, (m['Source Document'],))
            #     move_id = cr.fetchone()
            #     moveid_cols[module_moveid] = move_id
            # else:
            #     move_id = moveid_cols[module_moveid]

            move_id = move_ids[num]

            company_id_period = '%s__%s' % (dt['Period'], company_id)
            if not company_id_period in company_id_period_cols:
                cr.execute(
                    """SELECT id FROM account_period WHERE name = %s AND  company_id = %s """,
                    (dt['Period'], company_id))
                period_id = int(cr.fetchone()[0])
                company_id_period_cols[company_id_period] = period_id
            else:
                period_id = company_id_period_cols[company_id_period]

            company_id_period = '%s__%s' % (dt['Journal'], company_id)
            if not company_id_period in company_id_journal_cols:
                cr.execute(
                    """SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """,
                    (dt['Journal'], company_id))
                journal_id = int(cr.fetchone()[0])
                company_id_journal_cols[company_id_period] = journal_id
            else:
                journal_id = company_id_journal_cols[company_id_period]

            if m['Invoice Type'] == 'out_invoice':
                data_structure = (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    m['Source Document'],
                    m['Source Document'],
                    13,
                    0.0,
                    m['Due Date'],
                    period_id,
                    float(m['Line / Price Unit']),
                    m["Date"],
                    dt['Partner'] or None,
                    header_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    m['Division'],
                    analytic_4[0],
                    #analytic_3.id,
                    #analytic_2[0],
                    #analytic_1[0]
                )
                move_lines += [
                    data_structure,
                    (
                        1,
                        datetime.now(),
                        datetime.now(),
                        1,
                        move_id[0],
                        m['Source Document'],
                        m['Source Document'],
                        13,
                        float(m['Line / Price Unit']),
                        m['Due Date'],
                        period_id,
                        0.0,
                        m["Date"],
                        dt['Partner'] or None,
                        detail_account_id[0] or None,
                        journal_id,
                        'valid',
                        'normal',
                        company_id,
                        branch_id,
                        m['Division'],
                        analytic_4[0],
                        #analytic_3.id,
                        #analytic_2[0],
                        #analytic_1[0]
                    )
                ]
            elif m['Invoice Type'] == 'in_invoice':
                data_structure = (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    m['Source Document'],
                    m['Source Document'],
                    13,
                    float(m['Line / Price Unit']),
                    m['Due Date'],
                    period_id,
                    0.0,
                    m["Date"],
                    dt['Partner'] or None,
                    header_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    m['Division'],
                    analytic_4[0],
                    #analytic_3.id,
                    #analytic_2[0],
                    #analytic_1[0]
                )
                move_lines += [
                    data_structure,
                    (
                        1,
                        datetime.now(),
                        datetime.now(),
                        1,
                        move_id[0],
                        m['Source Document'],
                        m['Source Document'],
                        13,
                        0.0,
                        m['Due Date'],
                        period_id,
                        float(m['Line / Price Unit']),
                        m["Date"],
                        dt['Partner'] or None,
                        detail_account_id[0] or None,
                        journal_id,
                        'valid',
                        'normal',
                        company_id,
                        branch_id,
                        m['Division'],
                        analytic_4[0],
                        #analytic_3.id,
                        #analytic_2[0],
                        #analytic_1[0]
                    )
                ]

        cr.executemany(
            """INSERT INTO account_move_line (
                create_uid,
                create_date,
                write_date,
                write_uid,
                move_id,
                name,
                ref,
                currency_id,
                credit,
                date_maturity,
                period_id,
                debit,
                date,
                partner_id,
                account_id,
                journal_id,
                state,
                centralisation,
                company_id,
                branch_id,
                division,
                analytic_account_id
                ) VALUES (""" +
            ','.join(['%s' for x in range(0, len(data_structure))]) + """)""",
            move_lines)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account move lines = %s' % (
            len(data) * 2, format(finish_time - start_time))
        _logger.warning(msg)

        # cr.execute("""UPDATE account_invoice set move_id = (SELECT id FROM account_move am WHERE account_invoice.origin = am.ref LIMIT 1) where """)

        invoice_ids = dict(invoice_ids)

        for num, dt in enumerate(data, start=0):
            invoice_id = invoice_ids[dt['Source Document']]
            cr.execute(
                """UPDATE account_invoice set move_id = %s where id=%s""",
                (move_ids[num], invoice_id))

        end_time = datetime.now()
        msg = 'Duration to upload all datas = %s' % (format(end_time -
                                                            begin_time))
        _logger.warning(msg)
        return json.dumps({'status': 'OK', 'message': result})
Пример #25
0
    def bulk_invoice_ar(self, cr, uid, data, context=None):
        result = []
        invoices = []
        invoice_lines = []
        moves = []
        move_lines = []

        # INSERT HEADER INVOICE
        start_time = datetime.now()
        begin_time = start_time

        company_cols = {}
        analytic4_cols = {}
        analytic3_cols = {}
        analytic2_cols = {}
        analytic1_cols = {}
        account_cols = {}
        branch_cols = {}
        period_cols = {}
        journal_cols = {}

        invoice_cols = {}
        headeraccount_cols = {}
        detailaccount_cols = {}
        moveid_cols = {}
        company_id_period_cols = {}

        invoice_vals = []

        analytics = {}

        for n, dt in enumerate(data, start=0):
            module_analytic = dt['Analytic Account'].split('.', 1)[0]
            identifier_analytic = dt['Analytic Account'].split('.', 1)[1]
            module_account = dt['Header Account'].split('.', 1)[0]
            identifier_account = dt['Header Account'].split('.', 1)[1]
            module_branch = dt['Branch'].split('.', 1)[0]
            identifier_branch = dt['Branch'].split('.', 1)[1]
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            analytics[dt['Source Document']] = {
                'analytic_1': False,
                'analytic_2': False,
                'analytic_3': False,
                'analytic_4': False,
            }

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_analytic_identifier_analytic = '%s__%s' % (
                module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[
                    module_analytic_identifier_analytic] = analytic_4
            else:
                analytic_4 = analytic4_cols[
                    module_analytic_identifier_analytic]

            analytics[dt['Source Document']]['analytic_4'] = analytic_4

            if not analytic_4 in analytic3_cols:
                cr.execute(
                    """SELECT parent_id FROM account_analytic_account WHERE   id = %s """,
                    (analytic_4))
                analytic_3 = cr.fetchone()
                analytic_3 = self.pool.get('account.analytic.account').browse(
                    cr, uid, [analytic_3[0]], context=None)
                analytic3_cols[analytic_4] = analytic_3
            else:
                analytic_3 = analytic3_cols[analytic_4]

            analytics[dt['Source Document']]['analytic_3'] = analytic_3

            if not analytic_3 in analytic2_cols:
                analytic_2 = self._get_analytic_2(cr,
                                                  uid,
                                                  analytic_3,
                                                  context=None)
                analytic2_cols[analytic_3] = analytic_2
            else:
                analytic_2 = analytic2_cols[analytic_3]

            analytics[dt['Source Document']]['analytic_2'] = analytic_2

            if not company_id in analytic1_cols:
                cr.execute(
                    """SELECT id FROM account_analytic_account WHERE   segmen = 1 AND company_id = %s """,
                    ((company_id, )))
                analytic_1 = cr.fetchone()
                analytic1_cols[company_id] = analytic_1
            else:
                analytic_1 = analytic1_cols[company_id]

            analytics[dt['Source Document']]['analytic_1'] = analytic_1

            module_account_identifier_account = '%s__%s' % (module_account,
                                                            identifier_account)
            if not module_account_identifier_account in account_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_account, identifier_account))
                account_id = int(cr.fetchone()[0])
                account_cols[module_account_identifier_account] = account_id
            else:
                account_id = account_cols[module_account_identifier_account]

            module_branch_identifier_branch = '%s__%s' % (module_branch,
                                                          identifier_branch)
            if not module_branch_identifier_branch in branch_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_branch, identifier_branch))
                branch_id = int(cr.fetchone()[0])
                branch_cols[module_branch_identifier_branch] = branch_id
            else:
                branch_id = branch_cols[module_branch_identifier_branch]

            if not company_id in period_cols:
                cr.execute(
                    """SELECT id FROM account_period WHERE name = %s AND  company_id = %s """,
                    (dt['Period'], company_id))
                period_id = int(cr.fetchone()[0])
                period_cols[company_id] = period_id
            else:
                period_id = period_cols[company_id]

            if not company_id in journal_cols:
                cr.execute(
                    """SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """,
                    (dt['Journal'], company_id))
                journal_id = cr.fetchone()
                if not journal_id:
                    return self.return_error('Journal "%s" not found' %
                                             dt['Journal'])
                journal_id = int(journal_id[0])
                journal_cols[company_id] = journal_id
            else:
                journal_id = journal_cols[company_id]

            invoice_vals.append({
                'create_uid':
                1,
                'create_date':
                datetime.now(),
                'write_date':
                datetime.now(),
                'write_uid':
                1,
                'document_date':
                dt['Date'],
                'division':
                dt['Division'],
                'partner_id':
                dt['Partner'],
                'origin':
                dt['Source Document'],
                'supplier_invoice_number':
                dt['Supplier Invoice Number'],
                'date_due':
                dt['Due Date'],
                'branch_id':
                branch_id,
                'journal_id':
                journal_id,
                'period_id':
                period_id,
                'analytic_1':
                analytic_1[0],
                'analytic_2':
                analytic_2[0],
                'analytic_3':
                analytic_3.id,
                'analytic_4':
                analytic_4[0],
                'date_invoice':
                dt['Date'],
                'company_id':
                company_id,
                'state':
                'draft',
                'currency_id':
                13,
                'reference_type':
                'none',
                'type':
                dt['Invoice Type'],
                'account_id':
                account_id,
                'amount_total':
                dt['Line / Price Unit'],
                'residual':
                dt['Line / Price Unit'],
                'check_total':
                dt['Line / Price Unit'],
                'consolidated':
                'Consolidated' in dt and dt['Consolidated'] or True,
            })

        invoice_ids = self.insert_many(cr,
                                       uid,
                                       'account_invoice',
                                       'origin,id',
                                       invoice_vals,
                                       context=None)
        finish_time = datetime.now()
        msg = 'Duration to insert %s of account invoice = %s' % (
            len(data), format(finish_time - start_time))
        _logger.warning(msg)

        # INSERT DETAIL INVOICE
        dict_invs = dict(invoice_ids)
        source_document_cols = {}
        start_time = datetime.now()
        invoice_line_vals = []
        for dt in data:
            module_analytic = dt['Analytic Account'].split('.', 1)[0]
            identifier_analytic = dt['Analytic Account'].split('.', 1)[1]
            module_account = dt['Line / Account'].split('.', 1)[0]
            identifier_account = dt['Line / Account'].split('.', 1)[1]
            module_company = dt['Company'].split('.', 1)[0]
            identifier_company = dt['Company'].split('.', 1)[1]

            module_company_identifier_company = '%s__%s' % (module_company,
                                                            identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company] = company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_analytic_identifier_analytic = '%s__%s' % (
                module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[
                    module_analytic_identifier_analytic] = analytic_4
            else:
                analytic_4 = analytic4_cols[
                    module_analytic_identifier_analytic]

            module_account_identifier_account = '%s__%s' % (module_account,
                                                            identifier_account)
            if not module_account_identifier_account in account_cols:
                cr.execute(
                    """SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """,
                    (module_account, identifier_account))
                account_id = int(cr.fetchone()[0])
                account_cols[module_account_identifier_account] = account_id
            else:
                account_id = account_cols[module_account_identifier_account]

            source_document = dt['Source Document']
            if not source_document in source_document_cols:
                cr.execute(
                    """SELECT id FROM account_invoice WHERE origin = %s LIMIT 1""",
                    (dt['Source Document'], ))
                invoice_id = cr.fetchone()
                source_document_cols[source_document] = invoice_id
            else:
                invoice_id = source_document_cols[source_document]

            linedata = {
                'create_uid': 1,
                'create_date': datetime.now(),
                'write_date': datetime.now(),
                'write_uid': 1,
                'name': dt['Source Document'],
                'account_id': account_id,
                'invoice_id': dict_invs[dt['Source Document']],
                'account_analytic_id': analytic_4[0],
                'company_id': company_id,
                'price_unit': dt['Line / Price Unit'],
                'quantity': 1,
                'price_subtotal': dt['Line / Price Unit'],
                'analytic_2':
                analytics[dt['Source Document']]['analytic_2'][0],
                'analytic_3':
                analytics[dt['Source Document']]['analytic_3'].id,
            }
            invoice_line_vals.append(linedata)

        invoice_line_ids = self.insert_many(cr,
                                            uid,
                                            'account_invoice_line',
                                            'invoice_id,id',
                                            invoice_line_vals,
                                            context=None)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account invoice line = %s' % (
            len(data), format(finish_time - start_time))
        _logger.warning(msg)

        inv_ids = [x[1] for x in invoice_ids]
        for x in inv_ids:
            self.button_compute(cr, uid, [x], context=context)
        for inv_id in inv_ids:
            workflow.trg_create(uid, 'account.invoice', inv_id, cr)
            workflow.trg_validate(uid, 'account.invoice', inv_id,
                                  'invoice_open', cr)
        self.action_date_assign(cr, uid, inv_ids)

        # Fix invoice date, make it same as document date
        # cr.execute("""UPDATE account_invoice SET date_invoice = document_date""")
        '''
        # INSERT ACCOUNT MOVE BASED ON INVOICE ABOVE
        company_id_journal_cols = {}
        start_time = datetime.now()
        move_vals = []
        for dt in data:
            module_company = dt['Company'].split('.',1)[0]
            identifier_company = dt['Company'].split('.',1)[1]

            module_company_identifier_company = '%s__%s' % (module_company, identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company]=company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_invoice_identifier_account = '%s' % (dt['Source Document'])
            if not module_invoice_identifier_account in invoice_cols:
                cr.execute("""SELECT id FROM account_invoice WHERE origin = %s LIMIT 1""", (dt['Source Document'],))
                invoice_id = cr.fetchone()
                invoice_cols[module_invoice_identifier_account] = invoice_id
            else:
                invoice_id = invoice_cols[module_invoice_identifier_account]

            company_id_period = '%s__%s' % (dt['Period'], company_id)
            if not company_id_period in company_id_period_cols:
                cr.execute("""SELECT id FROM account_period WHERE name = %s AND  company_id = %s """, (dt['Period'], company_id))
                period_id = int(cr.fetchone()[0])
                company_id_period_cols[company_id_period] = period_id
            else:
                period_id = company_id_period_cols[company_id_period]

            company_id_period = '%s__%s' % (dt['Journal'], company_id)
            if not company_id_period in company_id_journal_cols:
                cr.execute("""SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """, (dt['Journal'], company_id))
                journal_id = int(cr.fetchone()[0])
                company_id_journal_cols[company_id_period] = journal_id
            else:
                journal_id = company_id_journal_cols[company_id_period]
    
            move_vals.append({
                'create_uid': 1,
                'create_date': datetime.now(),
                'write_date': datetime.now(),
                'write_uid': 1,
                'name': dt['Source Document'],
                'company_id': company_id,
                'journal_id': journal_id,
                'period_id': period_id,
                'date': dt['Date'],
                'ref': dt['Source Document'],
                'partner_id': dt['Partner'],
                'state': 'draft', 
                'transaction_id': invoice_id[0],
                'model': 'account.invoice',
            })

        move_ids = self.insert_many(cr, uid, 'account_move', 'id', move_vals, context=None)
        
        finish_time = datetime.now()
        msg = 'Duration to insert %s of account move = %s' % (len(data), format(finish_time - start_time))
        _logger.warning(msg)

        # INSERT ACCOUNT MOVE LINE BASED ON ACCOUNT MOVE ABOVE
        start_time = datetime.now()
        for num,dt in enumerate(data,start=0):
            module_analytic = dt['Analytic Account'].split('.',1)[0]
            identifier_analytic = dt['Analytic Account'].split('.',1)[1]
            module_header_account = dt['Header Account'].split('.',1)[0]
            identifier_header_account = dt['Header Account'].split('.',1)[1]
            module_detail_account = dt['Line / Account'].split('.',1)[0]
            identifier_detail_account = dt['Line / Account'].split('.',1)[1]
            module_branch = dt['Branch'].split('.',1)[0]
            identifier_branch = dt['Branch'].split('.',1)[1]
            module_company = dt['Company'].split('.',1)[0]
            identifier_company = dt['Company'].split('.',1)[1]

            module_company_identifier_company = '%s__%s' % (module_company, identifier_company)
            if not module_company_identifier_company in company_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_company, identifier_company))
                company_id = int(cr.fetchone()[0])
                company_cols[module_company_identifier_company]=company_id
            else:
                company_id = company_cols[module_company_identifier_company]

            module_branch_identifier_branch = '%s__%s' % (module_branch, identifier_branch)
            if not module_branch_identifier_branch in branch_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_branch, identifier_branch))
                branch_id = int(cr.fetchone()[0])
                branch_cols[module_branch_identifier_branch] = branch_id
            else:
                branch_id = branch_cols[module_branch_identifier_branch]
            
            module_analytic_identifier_analytic = '%s__%s' % (module_analytic, identifier_analytic)
            if not module_analytic_identifier_analytic in analytic4_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_analytic, identifier_analytic))
                analytic_4 = cr.fetchone()
                analytic4_cols[module_analytic_identifier_analytic]=analytic_4
            else:
                analytic_4 = analytic4_cols[module_analytic_identifier_analytic]

            modul_headeraccount = '%s__%s' % (module_header_account, identifier_header_account)
            if not modul_headeraccount in headeraccount_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_header_account, identifier_header_account))
                header_account_id = cr.fetchone()
                headeraccount_cols[modul_headeraccount] = header_account_id
            else:
                header_account_id = headeraccount_cols[modul_headeraccount]

            module_detailaccount = '%s__%s' % (module_detail_account, identifier_detail_account)
            if not module_detailaccount in detailaccount_cols:
                cr.execute("""SELECT res_id FROM ir_model_data WHERE module = %s AND  name = %s """, (module_detail_account, identifier_detail_account))
                detail_account_id = cr.fetchone()
                detailaccount_cols[module_detailaccount] = detail_account_id
            else:
                detail_account_id = detailaccount_cols[module_detailaccount]

            move_id = move_ids[num]

            company_id_period = '%s__%s' % (dt['Period'], company_id)
            if not company_id_period in company_id_period_cols:
                cr.execute("""SELECT id FROM account_period WHERE name = %s AND  company_id = %s """, (dt['Period'], company_id))
                period_id = int(cr.fetchone()[0])
                company_id_period_cols[company_id_period] = period_id
            else:
                period_id = company_id_period_cols[company_id_period]

            company_id_period = '%s__%s' % (dt['Journal'], company_id)
            if not company_id_period in company_id_journal_cols:
                cr.execute("""SELECT id FROM account_journal WHERE name = %s AND  company_id = %s """, (dt['Journal'], company_id))
                journal_id = int(cr.fetchone()[0])
                company_id_journal_cols[company_id_period] = journal_id
            else:
                journal_id = company_id_journal_cols[company_id_period]

            if dt['Invoice Type'] == 'out_invoice':
                data_structure = (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    dt['Source Document'], 
                    dt['Source Document'], 
                    13, 
                    0.0, 
                    dt['Due Date'], 
                    period_id, 
                    float(dt['Line / Price Unit']), 
                    dt["Date"], 
                    dt['Partner'] or None, 
                    header_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    dt['Division'],
                    analytic_4[0],
                    #analytic_3.id,
                    #analytic_2[0],
                    #analytic_1[0]
                    )
                move_lines+=[data_structure,
                    (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    dt['Source Document'], 
                    dt['Source Document'],
                    13, 
                    float(dt['Line / Price Unit']), 
                    dt['Due Date'], 
                    period_id, 
                    0.0, 
                    dt["Date"], 
                    dt['Partner'] or None, 
                    detail_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    dt['Division'],
                    analytic_4[0],
                    )]
            elif dt['Invoice Type'] == 'in_invoice':
                data_structure = (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    dt['Source Document'], 
                    dt['Source Document'], 
                    13, 
                    float(dt['Line / Price Unit']),
                    dt['Due Date'], 
                    period_id, 
                    0.0, 
                    dt["Date"], 
                    dt['Partner'] or None, 
                    header_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    dt['Division'],
                    analytic_4[0],
                    )
                move_lines+=[data_structure,
                    (
                    1,
                    datetime.now(),
                    datetime.now(),
                    1,
                    move_id[0],
                    dt['Source Document'], 
                    dt['Source Document'],
                    13, 
                    0.0, 
                    dt['Due Date'], 
                    period_id, 
                    float(dt['Line / Price Unit']), 
                    dt["Date"], 
                    dt['Partner'] or None, 
                    detail_account_id[0] or None,
                    journal_id,
                    'valid',
                    'normal',
                    company_id,
                    branch_id,
                    dt['Division'],
                    analytic_4[0],
                    )]

        cr.executemany("""INSERT INTO account_move_line (
                create_uid,
                create_date,
                write_date,
                write_uid,
                move_id,
                name,
                ref,
                currency_id,
                credit,
                date_maturity,
                period_id,
                debit,
                date,
                partner_id,
                account_id,
                journal_id,
                state,
                centralisation,
                company_id,
                branch_id,
                division,
                analytic_account_id
                ) VALUES ("""+ ','.join(['%s' for x in range(0, len(data_structure))])+""")""",move_lines)

        finish_time = datetime.now()
        msg = 'Duration to insert %s of account move lines = %s' % (len(data) * 2, format(finish_time - start_time))
        _logger.warning(msg)
        invoice_ids = dict(invoice_ids)

        for num,dt in enumerate(data,start=0):
            invoice_id = invoice_ids[dt['Source Document']]
            cr.execute("""UPDATE account_invoice set move_id = %s where id=%s""", (move_ids[num],invoice_id))

        end_time = datetime.now()
        msg = 'Duration to upload all datas = %s' % (format(end_time - begin_time))
        _logger.warning(msg)
        '''

        result = {}
        return json.dumps({'status': 'OK', 'message': result})
Пример #26
0
# -*- coding: utf-8 -*-