~slobodni-programi/addons-sp/61

« back to all changes in this revision

Viewing changes to account_tax_nondeductable/invoice.py

  • Committer: Goran Kliska
  • Date: 2011-11-10 09:30:26 UTC
  • Revision ID: goran.kliska@slobodni-programi.hr-20111110093026-q4dqc6lmfoo60ngh
croatian VAT rules and postings on payment

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
class account_invoice_line(osv.osv):
35
35
    _inherit = 'account.invoice.line' 
36
36
 
37
 
    #Copy of account.invoice.py.Renamig varables tax=>base, it was confusing. New accounts for nondeductable part of base 
 
37
    _columns = {
 
38
        'name': fields.char('Description', size=256, required=True),
 
39
        'account2_id': fields.many2one('account.account', 'Account 2', required=False, domain=[('type','<>','view'), ('type', '<>', 'closed')], help="Second account related to the selected product."),
 
40
        }
 
41
    
 
42
    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
 
43
        res_prod = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id=currency_id, context=context)
 
44
        if product: # get second account related to product 
 
45
            res = self.pool.get('product.product').browse(cr, uid, product, context=context)
 
46
            if type in ('out_invoice','out_refund'):
 
47
                a2 = res.product_tmpl_id.account_income2_id.id
 
48
                if not a2:
 
49
                    a2 = res.categ_id.account_income2_categ_id.id
 
50
            else:
 
51
                a2 = res.product_tmpl_id.account_expense2_id.id
 
52
                if not a2:
 
53
                    a2 = res.categ_id.account_expense2_categ_id.id
 
54
            a2 = self.pool.get('account.fiscal.position').map_account(cr, uid, fposition_id, a2)
 
55
            if a2:
 
56
                result['account2_id'] = a2
 
57
        return res_prod
 
58
    
 
59
    
 
60
    #Copy of account.invoice.py. New accounts for nondeductable part of base 
38
61
    def move_line_get(self, cr, uid, invoice_id, context=None):
39
62
        res = []
40
63
        tax_obj = self.pool.get('account.tax')
81
104
                        base_account_id = tax_base.base_account_collected_id.id
82
105
                    if tax_base.base_account_paid_id and inv.type in ('in_invoice', 'in_refund'):
83
106
                        base_account_id = tax_base.base_account_paid_id.id
84
 
                #TODO use get_product_accounts2 
85
 
                product_accounts = self.pool.get('product.template').get_product_accounts2(cr, uid, line.product_id.id, context=None)
86
 
                if tax_base.base_account == 'product2': 
87
 
                    if inv.type in ('in_invoice', 'in_refund'):
88
 
                        base_account_id = product_accounts.get('account_expense2_id', False)
89
 
                    if inv.type in ('out_invoice', 'out_refund'):
90
 
                        base_account_id = product_accounts.get('account_income2_id', False)
 
107
                if tax_base.base_account == 'product_2' and line.account2_id: 
 
108
                    base_account_id =  line.account2_id.id
 
109
                if tax_base.base_account == 'product_2' and not line.account2_id: 
 
110
                    #TODO use get_product_accounts2 
 
111
                    product_accounts = self.pool.get('product.template').get_product_accounts2(cr, uid, line.product_id.id, context=None)
 
112
                    base_account_id = res[-1]['account2_id']   #account2 for base when tax_base.base_account == 'product_2')
 
113
                    if not base_account_id:
 
114
                        if inv.type in ('in_invoice', 'in_refund'):
 
115
                            base_account_id = product_accounts.get('account_expense2_id', False)
 
116
                        if inv.type in ('out_invoice', 'out_refund'):
 
117
                            base_account_id = product_accounts.get('account_income2_id', False)
91
118
 
92
119
                res[-1]['account_id'] = base_account_id
93
120
                res[-1]['price'] = tax['price_unit'] * line.quantity
100
127
                res[-1]['price'] = rest
101
128
                res[-1]['tax_code_id'] = False
102
129
                res[-1]['tax_amount'] = 0.0
103
 
 
104
130
        return res   
 
131
    
 
132
    def move_line_get_item(self, cr, uid, line, context=None):
 
133
        res = super(account_invoice_line, self).move_line_get_item(cr, uid, line, context=context)
 
134
        res['account2_id'] = line.account2_id.id
 
135
        return res
 
136
 
 
137
    #
 
138
    # Set the tax field according to the account and the fiscal position
 
139
    #
 
140
    def onchange_account2_id(self, cr, uid, ids, fposition_id, account_id, account2_id):
 
141
        res12 = {}
 
142
        if account_id:
 
143
            res1 = super(account_invoice_line, self).onchange_account_id(cr, uid, ids, fposition_id, account_id)
 
144
        if account2_id:
 
145
            taxes = self.pool.get('account.account').browse(cr, uid, account2_id).tax_ids
 
146
            fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False
 
147
            res2 = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
 
148
            if not account_id:
 
149
                return {'value':{'invoice_line_tax_id': res2}}
 
150
            return {'value':{'invoice_line_tax_id': res2 + res1['value']['invoice_line_tax_id'] }}
 
151
        return res12
 
152
account_invoice_line()
 
153
 
 
154
 
 
155
class account_invoice_tax(osv.osv):
 
156
    _inherit = "account.invoice.tax"
 
157
    
 
158
    def compute(self, cr, uid, invoice_id, context=None):
 
159
        tax_grouped = {}
 
160
        tax_obj = self.pool.get('account.tax')
 
161
        cur_obj = self.pool.get('res.currency')
 
162
        inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context)
 
163
        cur = inv.currency_id
 
164
        company_currency = inv.company_id.currency_id.id
 
165
 
 
166
        for line in inv.invoice_line:
 
167
            for tax in tax_obj.compute_all(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id)['taxes']:
 
168
                val={}
 
169
                val['invoice_id'] = inv.id
 
170
                val['name'] = tax['name']
 
171
                val['amount'] = tax['amount']
 
172
                val['manual'] = False
 
173
                val['sequence'] = tax['sequence']
 
174
                val['base'] = tax['price_unit'] * line['quantity']
 
175
 
 
176
                if inv.type in ('out_invoice','in_invoice'):
 
177
                    val['base_code_id'] = tax['base_code_id']
 
178
                    val['tax_code_id'] = tax['tax_code_id']
 
179
                    val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
 
180
                    val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
 
181
                    val['account_id'] = tax['account_collected_id'] or line.account_id.id
 
182
                    #KGB start
 
183
                    if not tax['account_collected_id']:
 
184
                        if tax['base_account']=='product_2' and line.account2_id:
 
185
                            val['account_id'] = line.account2_id.id 
 
186
                        if tax['base_account']=='tax_base' and tax['base_account_collected_id']:
 
187
                            val['account_id'] = tax['base_account_collected_id'] 
 
188
                    #KGB end
 
189
                else:
 
190
                    val['base_code_id'] = tax['ref_base_code_id']
 
191
                    val['tax_code_id'] = tax['ref_tax_code_id']
 
192
                    val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['ref_base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
 
193
                    val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['ref_tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
 
194
                    val['account_id'] = tax['account_paid_id'] or line.account_id.id
 
195
                    #KGB start
 
196
                    if not tax['account_collected_id']:
 
197
                        if tax['base_account']=='product_2' and line.account2_id:
 
198
                            val['account_id'] = line.account2_id.id 
 
199
                        if tax['base_account']=='tax_base' and tax['base_account_paid_id']:
 
200
                            val['account_id'] = tax['base_account_paid_id'] 
 
201
                    #KGB end
 
202
 
 
203
                key = (val['tax_code_id'], val['base_code_id'], val['account_id'])
 
204
                if not key in tax_grouped:
 
205
                    tax_grouped[key] = val
 
206
                else:
 
207
                    tax_grouped[key]['amount'] += val['amount']
 
208
                    tax_grouped[key]['base'] += val['base']
 
209
                    tax_grouped[key]['base_amount'] += val['base_amount']
 
210
                    tax_grouped[key]['tax_amount'] += val['tax_amount']
 
211
 
 
212
        for t in tax_grouped.values():
 
213
            t['base'] = cur_obj.round(cr, uid, cur, t['base'])
 
214
            t['amount'] = cur_obj.round(cr, uid, cur, t['amount'])
 
215
            t['base_amount'] = cur_obj.round(cr, uid, cur, t['base_amount'])
 
216
            t['tax_amount'] = cur_obj.round(cr, uid, cur, t['tax_amount'])
 
217
        return tax_grouped
 
218
 
 
219
account_invoice_tax()