~laetitia-gangloff/account-invoicing/account_invoice_merge

« back to all changes in this revision

Viewing changes to account_invoice_merge/invoice.py

  • Committer: Laetitia Gangloff (Acsone)
  • Date: 2013-07-17 10:33:35 UTC
  • Revision ID: laetitia.gangloff@acsone.eu-20130717103335-yzf8lyn48awgqfla
account_invoice_merge : rename order to invoice

Show diffs side-by-side

added added

removed removed

Lines of Context:
66
66
            list_key.sort()
67
67
            return tuple(list_key)
68
68
 
69
 
    # compute what the new orders should contain
70
 
 
71
 
        new_orders = {}
72
 
 
73
 
        for porder in [order for order in self.browse(cr, uid, ids, context=context) if order.state == 'draft']:
74
 
            order_key = make_key(porder, ('partner_id', 'user_id', 'type', 'account_id', 'currency_id', 'journal_id', 'company_id'))
75
 
            new_order = new_orders.setdefault(order_key, ({}, []))
76
 
            new_order[1].append(porder.id)
77
 
            order_infos = new_order[0]
78
 
            if not order_infos:
79
 
                order_infos.update({
80
 
                    'origin': '%s' % (porder.origin or '',),
81
 
                    'partner_id': porder.partner_id.id,
82
 
                    'journal_id': porder.journal_id.id,
83
 
                    'user_id': porder.user_id.id,
84
 
                    'currency_id': porder.currency_id.id,
85
 
                    'company_id': porder.company_id.id,
86
 
                    'type': porder.type,
87
 
                    'account_id': porder.account_id.id,
 
69
    # compute what the new invoices should contain
 
70
 
 
71
        new_invoices = {}
 
72
 
 
73
        for account_invoice in [invoice for invoice in self.browse(cr, uid, ids, context=context) if invoice.state == 'draft']:
 
74
            invoice_key = make_key(account_invoice, ('partner_id', 'user_id', 'type', 'account_id', 'currency_id', 'journal_id', 'company_id'))
 
75
            new_invoice = new_invoices.setdefault(invoice_key, ({}, []))
 
76
            new_invoice[1].append(account_invoice.id)
 
77
            invoice_infos = new_invoice[0]
 
78
            if not invoice_infos:
 
79
                invoice_infos.update({
 
80
                    'origin': '%s' % (account_invoice.origin or '',),
 
81
                    'partner_id': account_invoice.partner_id.id,
 
82
                    'journal_id': account_invoice.journal_id.id,
 
83
                    'user_id': account_invoice.user_id.id,
 
84
                    'currency_id': account_invoice.currency_id.id,
 
85
                    'company_id': account_invoice.company_id.id,
 
86
                    'type': account_invoice.type,
 
87
                    'account_id': account_invoice.account_id.id,
88
88
                    'state': 'draft',
89
89
                    'invoice_line': {},
90
 
                    'reference': '%s' % (porder.reference or '',),
91
 
                    'name': '%s' % (porder.name or '',),
92
 
                    'fiscal_position': porder.fiscal_position and porder.fiscal_position.id or False,
93
 
                    'period_id': porder.period_id and porder.period_id.id or False,
 
90
                    'reference': '%s' % (account_invoice.reference or '',),
 
91
                    'name': '%s' % (account_invoice.name or '',),
 
92
                    'fiscal_position': account_invoice.fiscal_position and account_invoice.fiscal_position.id or False,
 
93
                    'period_id': account_invoice.period_id and account_invoice.period_id.id or False,
94
94
                })
95
95
            else:
96
 
                if porder.name:
97
 
                    order_infos['name'] = (order_infos['name'] or '') + (' %s' % (porder.name,))
98
 
                if porder.origin:
99
 
                    order_infos['origin'] = (order_infos['origin'] or '') + ' ' + porder.origin
100
 
                if porder.reference:
101
 
                    order_infos['reference'] = (order_infos['reference'] or '') + (' %s' % (porder.reference,))
 
96
                if account_invoice.name:
 
97
                    invoice_infos['name'] = (invoice_infos['name'] or '') + (' %s' % (account_invoice.name,))
 
98
                if account_invoice.origin:
 
99
                    invoice_infos['origin'] = (invoice_infos['origin'] or '') + ' ' + account_invoice.origin
 
100
                if account_invoice.reference:
 
101
                    invoice_infos['reference'] = (invoice_infos['reference'] or '') + (' %s' % (account_invoice.reference,))
102
102
 
103
 
            for order_line in porder.invoice_line:
104
 
                line_key = make_key(order_line, ('name', 'origin', 'discount', 'invoice_line_tax_id', 'price_unit', 'product_id', 'account_id', 'account_analytic_id'))
105
 
                o_line = order_infos['invoice_line'].setdefault(line_key, {})
 
103
            for invoice_line in account_invoice.invoice_line:
 
104
                line_key = make_key(invoice_line, ('name', 'origin', 'discount', 'invoice_line_tax_id', 'price_unit', 'product_id', 'account_id', 'account_analytic_id'))
 
105
                o_line = invoice_infos['invoice_line'].setdefault(line_key, {})
106
106
                if o_line:
107
107
                    # merge the line with an existing line
108
 
                    o_line['quantity'] += order_line.quantity * order_line.uos_id.factor / o_line['uom_factor']
 
108
                    o_line['quantity'] += invoice_line.quantity * invoice_line.uos_id.factor / o_line['uom_factor']
109
109
                else:
110
110
                    # append a new "standalone" line
111
111
                    for field in ('quantity', 'uos_id'):
112
 
                        field_val = getattr(order_line, field)
 
112
                        field_val = getattr(invoice_line, field)
113
113
                        if isinstance(field_val, browse_record):
114
114
                            field_val = field_val.id
115
115
                        o_line[field] = field_val
116
 
                    o_line['uom_factor'] = order_line.uos_id and order_line.uos_id.factor or 1.0
 
116
                    o_line['uom_factor'] = invoice_line.uos_id and invoice_line.uos_id.factor or 1.0
117
117
 
118
 
        allorders = []
119
 
        orders_info = {}
120
 
        for order_key, (order_data, old_ids) in new_orders.iteritems():
121
 
            # skip merges with only one order
 
118
        allinvoices = []
 
119
        invoices_info = {}
 
120
        for invoice_key, (invoice_data, old_ids) in new_invoices.iteritems():
 
121
            # skip merges with only one invoice
122
122
            if len(old_ids) < 2:
123
 
                allorders += (old_ids or [])
 
123
                allinvoices += (old_ids or [])
124
124
                continue
125
125
 
126
 
            # cleanup order line data
127
 
            for key, value in order_data['invoice_line'].iteritems():
 
126
            # cleanup invoice line data
 
127
            for key, value in invoice_data['invoice_line'].iteritems():
128
128
                del value['uom_factor']
129
129
                value.update(dict(key))
130
 
            order_data['invoice_line'] = [(0, 0, value) for value in order_data['invoice_line'].itervalues()]
131
 
 
132
 
            # create the new order
133
 
            neworder_id = self.create(cr, uid, order_data)
134
 
            orders_info.update({neworder_id: old_ids})
135
 
            allorders.append(neworder_id)
136
 
 
137
 
            # make triggers pointing to the old orders point to the new order
 
130
            invoice_data['invoice_line'] = [(0, 0, value) for value in invoice_data['invoice_line'].itervalues()]
 
131
 
 
132
            # create the new invoice
 
133
            newinvoice_id = self.create(cr, uid, invoice_data)
 
134
            invoices_info.update({newinvoice_id: old_ids})
 
135
            allinvoices.append(newinvoice_id)
 
136
 
 
137
            # make triggers pointing to the old invoices point to the new invoice
138
138
            for old_id in old_ids:
139
 
                wf_service.trg_redirect(uid, 'account.invoice', old_id, neworder_id, cr)
 
139
                wf_service.trg_redirect(uid, 'account.invoice', old_id, newinvoice_id, cr)
140
140
                wf_service.trg_validate(uid, 'account.invoice', old_id, 'invoice_cancel', cr)
141
141
 
142
142
        # make link between original sale order or purchase order
143
143
        so_obj = self.pool.get('sale.order')
144
144
        po_obj = self.pool.get('purchase.order')
145
 
        for new_order in orders_info:
146
 
            todo_ids = so_obj.search(cr, uid, [('invoice_ids', 'in', orders_info[new_order])], context=context)
 
145
        for new_invoice in invoices_info:
 
146
            todo_ids = so_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice])], context=context)
147
147
            for org_order in so_obj.browse(cr, uid, todo_ids, context=context):
148
 
                so_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_order)]}, context)
149
 
            todo_ids = po_obj.search(cr, uid, [('invoice_ids', 'in', orders_info[new_order])], context=context)
 
148
                so_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_invoice)]}, context)
 
149
            todo_ids = po_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice])], context=context)
150
150
            for org_order in po_obj.browse(cr, uid, todo_ids, context=context):
151
 
                po_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_order)]}, context)
152
 
        # print orders_info
153
 
        return orders_info
 
151
                po_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_invoice)]}, context)
 
152
        # print invoices_info
 
153
        return invoices_info
154
154
 
155
155
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: