1
# -*- coding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Addons modules by SIESA
6
# Copyright (C) 2009-TODAY Soluciones Industriales Electromecanicas S.A. (<http://siesacr.com>).
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU Affero General Public License as
10
# published by the Free Software Foundation, either version 3 of the
11
# License, or (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU Affero General Public License for more details.
18
# You should have received a copy of the GNU Affero General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
22
from osv import osv, fields
23
import decimal_precision as dp
27
from tools.translate import _
29
class purchase_import_voucher(osv.osv):
30
def _calc_amount_cif(self, cr, uid, ids, prop, unknow_none, unknow_dict):
32
for voucher in self.browse(cr, uid, ids):
33
res[voucher.id] = voucher.order_id.total_products + voucher.order_id.total_freight
35
def _calc_amount_cif_dolars(self, cr, uid, ids, prop, unknow_none, unknow_dict):
37
for voucher in self.browse(cr, uid, ids):
38
res[voucher.id] = voucher.currency_rate * voucher.cif_real
41
def button_dummy(self, cr, uid, ids, context=None):
44
_name = 'purchase.import.voucher'
46
'name': fields.char('Number',size=64),
47
'date_voucher' : fields.datetime('Create Date'),
48
'location_id' : fields.many2one('res.partner.address', 'Origin'),
49
'bidder_id' : fields.many2one('res.partner', 'Bidder'),
50
'agent_number': fields.char('Agent Number',size=64),
51
'state_voucher': fields.char('State',size=64),
52
'regime': fields.char('Regime',size=64),
53
'importexport': fields.char('Import/Export',size=64),
54
'mode': fields.char('Mode',size=64),
55
'type_audit': fields.char('Audit Type',size=64),
56
'num_bags': fields.float('Bag Number'),
57
'weight': fields.float('Weight'),
58
'weight_net': fields.float('Weight Net'),
59
'cif_real': fields.function(_calc_amount_cif, method=True, string='CIF Real', type='float',help='Cost, insurance, freight'),
60
'cif_paid': fields.float('CIF Paid', required=True),
61
'cif_dolars': fields.function(_calc_amount_cif_dolars, method=True, string='CIF USD', type='float',help='(Cost, insurance, freight)* Currency Rate'),
62
'currency_rate': fields.float('Currency Rate'),
63
'tax': fields.related('tax_order_id','order_line',type='one2many',relation='purchase.order.line',string='Currency', store=False),
64
'order_id': fields.many2one('purchase.import.order', 'Order',ondelete='set null', select=True),
68
purchase_import_voucher()
70
class purchase_import_order(osv.osv):
71
def create(self, cr, uid, vals, context=None):
74
inv_obj = self.pool.get('account.invoice')
75
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'purchase.import.order')
76
invoices = vals['imports_order_id']
78
for inv in inv_obj.browse(cr, uid, invoices[0][2]):
79
for line in inv.invoice_line:
80
line_ids.append(line.id)
82
vals['lines_id'] = [[6,False,line_ids]]
84
res= super(purchase_import_order, self).create(cr, uid, vals, context=context)
87
def write(self, cr, uid, ids, vals, context=None):
90
inv_obj = self.pool.get('account.invoice')
91
if 'imports_order_id' in vals:
92
invoices = vals['imports_order_id']
93
for inv in inv_obj.browse(cr, uid, invoices[0][2]):
94
for line in inv.invoice_line:
95
line_ids.append(line.id)
96
vals['lines_id'] = [[6,False,line_ids]]
98
res = super(purchase_import_order, self).write(cr, uid, ids, vals, context=context)
101
def _calc_amount_total(self, cr, uid, ids, prop, unknow_none, unknow_dict):
103
for order in self.browse(cr, uid, ids):
104
res[order.id] = order.tax_total+ order.total_freight
107
def _calc_amount_tax(self, cr, uid, ids, prop, unknow_none, unknow_dict):
109
for order in self.browse(cr, uid, ids):
110
if order.tax_order_id:
111
if order.tax_order_id.currency_id.id == order.tax_order_id.company_id.currency_id.id:
114
currency = order.tax_order_id.currency_id.rate * order.tax_order_id.company_id.currency_id.rate
115
res[order.id] = order.tax_order_id.amount_untaxed * currency
120
def _calc_amount_prod(self, cr, uid, ids, prop, unknow_none, unknow_dict):
123
for imports in self.browse(cr, uid, ids):
124
for order in imports.imports_order_id:
125
if order.currency_id.id == order.company_id.currency_id.id:
128
currency = order.currency_id.rate * order.company_id.currency_id.rate
129
total = total + (order.amount_untaxed * currency)
131
res[imports.id] = total
134
def _calc_amount_freight(self, cr, uid, ids, prop, unknow_none, unknow_dict):
136
for order in self.browse(cr, uid, ids):
137
if order.freight_order_id:
138
if order.freight_order_id.currency_id.rate == order.freight_order_id.company_id.currency_id.rate:
141
currency = order.freight_order_id.currency_id.rate * order.freight_order_id.company_id.currency_id.rate
143
res[order.id] = (order.freight_order_id.amount_untaxed + order.fob) * currency
147
def _calc_amount_insurance(self, cr, uid, ids, prop, unknow_none, unknow_dict):
149
for order in self.browse(cr, uid, ids):
150
if order.insurance_order_id:
151
if order.insurance_order_id.currency_id.rate == order.insurance_order_id.company_id.currency_id.rate:
154
currency = order.insurance_order_id.currency_id.rate * order.insurance_order_id.company_id.currency_id.rate
156
res[order.id] = order.insurance_order_id.amount_untaxed * currency
161
def action_set_average_price(self, cr, uid, ids, context=None):
167
product_insurance = 0
169
for imports in self.browse(cr, uid, ids):
170
if imports.cif_paid == 0:
171
raise osv.except_osv(_('Invalid Document!'), _('Update CiF Cost" '))
173
if imports.tax_order_id:
174
if imports.tax_order_id.currency_id.id == imports.tax_order_id.company_id.currency_id.id:
175
tax_currency_rate = 1
177
tax_currency_rate = imports.tax_order_id.currency_id.rate * imports.tax_order_id.company_id.currency_id.rate
180
for line in imports.lines_id:
182
if line.uos_id.uom_type =='reference':
185
if line.uos_id.uom_type =='bigger':
186
uos_ratio = line.uos_id.factor_inv
188
uos_ratio = line.uos_id.factor
189
line_qty = line.quantity * uos_ratio
191
product = self.pool.get('product.product').browse(cr, uid, line.product_id.id, context=context)
192
total_weight = total_weight + (line_qty * product.weight)
193
order_tax = order_tax + product.tax_total
195
if (line_qty * product.weight) <= 0:
196
raise osv.except_osv(_('Product with weight 0 !'), _('Update the product with part number "%s" ') % (product.part_number))
198
if (line_qty * product.tax_total) <= 0:
199
raise osv.except_osv(_('Product without tariff !'), _('Update the product with part number "%s" ') % (product.part_number))
201
for order in imports.imports_order_id:
202
if order.currency_id.id == order.company_id.currency_id.id:
203
import_currency_rate = 1
205
import_currency_rate = order.currency_id.rate * order.company_id.currency_id.rate
207
for line in order.invoice_line:
208
if line.uos_id.uom_type =='reference':
211
if line.uos_id.uom_type =='bigger':
212
uos_ratio = line.uos_id.factor_inv
214
uos_ratio = line.uos_id.factor
215
line_qty = line.quantity * uos_ratio
218
product = self.pool.get('product.product').browse(cr, uid, line.product_id.id, context=context)
220
#Update price per weight
221
if imports.freight_order_id:
222
product_freight_percentage = product.weight * line_qty / total_weight
223
product_freight = imports.total_freight * product_freight_percentage / line_qty
225
#Update price per taxes
226
if imports.tax_order_id:
227
product_tax_percentage = product.tax_total / order_tax
228
product_tax= imports.tax_total * product_tax_percentage / line_qty
233
add_cost = (line.price_unit/ uos_ratio * import_currency_rate) + product_freight + product_tax + product_insurance
235
if product.qty_available <= line_qty:
238
cost = (add_cost * line_qty + product.standard_price * (product.qty_available - line_qty))/ product.qty_available
240
product.write({'costo_fob': line.price_unit}, context=context)
241
product.write({'standard_price': cost}, context=context)
243
self.write(cr, uid, ids, {'state': 'done'}, context=context)
246
_name = 'purchase.import.order'
248
'name': fields.char('Number',size=64,readonly=True),
249
'fob': fields.float('FoB', required=True),
251
'voucher_id': fields.one2many('purchase.import.voucher', 'order_id', 'Voucher'),
252
'provenance_id' : fields.many2one('res.country', 'Origin',required=True),
255
'imports_order_id': fields.many2many('account.invoice', 'import_invoice_id', 'imports_id', 'invoice_id', 'Product Invoices'),
257
'freight_order_id':fields.many2one('account.invoice', 'Freight Invoice'),
258
'tax_order_id':fields.many2one('account.invoice', 'Tax Invoice'),
260
'date_arrive' : fields.datetime('Land Date'),
261
'date_due' : fields.datetime('Due Date'),
263
'total_products': fields.function(_calc_amount_prod, method=True, string='Product total', type='float'),
265
'tax_total': fields.function(_calc_amount_tax, method=True, string='Tax Total', type='float'),
266
'total_freight': fields.function(_calc_amount_freight, method=True, string='Freight Total', type='float'),
267
'total_paid': fields.function(_calc_amount_total, method=True, string='Import Total', type='float'),
269
'lines_id': fields.many2many('account.invoice.line', 'import_line_id', 'imports_id', 'line_id', 'Products',readonly=True),
271
'freight': fields.related('freight_order_id','invoice_line',type='one2many',relation='account.invoice.line',string='Freight', store=False),
272
'freight_currency': fields.related('freight_order_id','currency_id',type='many2one',relation='res.currency',string='Freight Currency', store=False),
274
'taxes': fields.related('tax_order_id','invoice_line',type='one2many',relation='account.invoice.line',string='Taxes', store=False),
275
'taxes_currency': fields.related('tax_order_id','currency_id',type='many2one',relation='res.currency',string='Tax Currency', store=False),
278
'cif_paid': fields.related('voucher_id', 'cif_paid', type='float', string='CIF Paid'),
279
'cif_real': fields.related('voucher_id', 'cif_real', type='float', string='CIF Real'),
281
'note': fields.text('Notes'),
282
'create_date' : fields.datetime('Create Date', readonly=True),
283
'state': fields.selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancel')], 'State', required=True, readonly=True)
286
'state': lambda *args: 'draft',
289
purchase_import_order()