← Back to team overview

clearcorp team mailing list archive

lp:~miguel-gutierrez-j/openerp-ccorp-addons/6.1-purchase_import into lp:openerp-ccorp-addons

 

Miguel Gutierrez has proposed merging lp:~miguel-gutierrez-j/openerp-ccorp-addons/6.1-purchase_import into lp:openerp-ccorp-addons.

Requested reviews:
  CLEARCORP drivers (clearcorp-drivers)

For more details, see:
https://code.launchpad.net/~miguel-gutierrez-j/openerp-ccorp-addons/6.1-purchase_import/+merge/142560
-- 
https://code.launchpad.net/~miguel-gutierrez-j/openerp-ccorp-addons/6.1-purchase_import/+merge/142560
Your team CLEARCORP development team is subscribed to branch lp:openerp-ccorp-addons.
=== added directory 'product_search_improver'
=== added file 'product_search_improver/__init__.py'
--- product_search_improver/__init__.py	1970-01-01 00:00:00 +0000
+++ product_search_improver/__init__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,1 @@
+import product

=== added file 'product_search_improver/__openerp__.py'
--- product_search_improver/__openerp__.py	1970-01-01 00:00:00 +0000
+++ product_search_improver/__openerp__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,25 @@
+
+{
+    "name" : "Products Search Extends",
+    "version" : "1.0",
+    "author" : "SIESA",
+    "category" : "Generic Modules/Inventory Control",
+    "depends" : ["base", "process","product","sale", "decimal_precision","stock"],
+    'complexity': "easy",
+    "website" : "http://www.siesacr.com";,
+    "description": """
+    This module add to product
+    currency_id,
+    part_number,
+    fob_currency_id,
+    cost_fob,
+    and improve the search logic.
+
+    """,
+    'update_xml': [
+        'product_view.xml',
+    ],
+    'installable': True,
+    'active': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'product_search_improver/product.py'
--- product_search_improver/product.py	1970-01-01 00:00:00 +0000
+++ product_search_improver/product.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,165 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import osv, fields
+import decimal_precision as dp
+
+import math
+import logging
+import re
+from tools.translate import _
+
+
+class product_product(osv.osv):
+    _inherit = "product.product"
+    def _get_currency(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for order in self.browse(cr, uid, ids):
+            res[order.id] = 0
+            for oline in order.order_line:
+                res[order.id] += oline.price_unit * oline.product_qty
+        return res
+
+    def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
+        res = {}
+        new_args = []
+        cont=0
+
+        if not args:
+            args = []
+        number_params = len(args)
+
+        while cont<number_params:
+            param=args[cont]
+            if ('part_number' in param) or ('default_code' in param) or ('name' in param):
+                search_vals = param[2].split()
+                for val in search_vals:
+                    new_args = new_args + [[param[0],'ilike', val]]
+
+            cont = cont +1
+        if len(new_args) > 0:
+            args = new_args
+
+        res = super(product_product, self).search(cr, uid, args, offset, limit, order, context, count)
+
+        return res
+
+
+
+    def _product_price(self, cr, uid, ids, name, arg, context=None):
+        res = {}
+        if context is None:
+            context = {}
+        quantity = context.get('quantity') or 1.0
+        pricelist = context.get('pricelist', False)
+        if pricelist:
+            for id in ids:
+                try:
+                    price = self.pool.get('product.pricelist').price_get(cr,uid,[pricelist], id, quantity, context=context)[pricelist]
+                except:
+                    price = 0.0
+                res[id] = price
+        for id in ids:
+            res.setdefault(id, 0.0)
+        return res
+
+    def _product_partner_ref(self, cr, uid, ids, name, arg, context=None):
+        res = {}
+        if context is None:
+            context = {}
+        for p in self.browse(cr, uid, ids, context=context):
+            data = self._get_partner_code_name(cr, uid, [], p, context.get('partner_id', None), context=context)
+            if not data['code']:
+                data['code'] = p.code
+            if not data['name']:
+                data['name'] = p.name
+            res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + \
+                    (data['name'] or '')
+        return res
+
+    _columns = {
+        'currency_id': fields.many2one('res.currency','Currency'),
+        'part_number': fields.char('Part Number', size=90),
+        'default_code' : fields.char('Reference', size=64, select=True),
+        'import_ok': fields.boolean('Could be imported'),
+        'cost_fob': fields.float('Cost FOB o Ex Works'),
+        'fob_currency_id': fields.many2one('res.currency','FoB Currency'),
+    }
+    _sql_constraints = [
+        ('default_code_uniq', 'unique (default_code)', 'El code must be unique!')
+    ]
+    _defaults = {
+        'import_ok': lambda *a: 1,
+    }
+
+
+    def price_get(self, cr, uid, ids, ptype='list_price', context=None):
+        if context is None:
+            context = {}
+
+        if 'currency_id' in context:
+            pricetype_obj = self.pool.get('product.price.type')
+            price_type_id = pricetype_obj.search(cr, uid, [('field','=',ptype)])[0]
+            price_type_currency_id = pricetype_obj.browse(cr,uid,price_type_id).currency_id.id
+
+        res = {}
+        product_uom_obj = self.pool.get('product.uom')
+        for product in self.browse(cr, uid, ids, context=context):
+            res[product.id] = product[ptype] or 0.0
+            if ptype == 'list_price':
+                res[product.id] = (res[product.id] * (product.price_margin or 1.0)) + \
+                        product.price_extra
+            if 'uom' in context:
+                uom = product.uos_id or product.uom_id
+                res[product.id] = product_uom_obj._compute_price(cr, uid,
+                        uom.id, res[product.id], context['uom'])
+            if 'currency_id' in context:
+                res[product.id] = self.pool.get('res.currency').compute(cr, uid, price_type_currency_id,
+                    context['currency_id'], res[product.id],context=context)
+
+        return res
+
+    def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
+        if not args:
+            args = []
+        if name:
+            ids = self.search(cr, user, [['default_code','ilike',name]]+ args, limit=limit, context=context)
+            if not ids:
+                ids = self.search(cr, user, [['part_number','ilike',name]]+ args, limit=limit, context=context)
+            if not ids:
+                ids = set()
+                ids.update(self.search(cr, user, args + [['default_code',operator,name]], limit=limit, context=context))
+                if len(ids) < limit:
+                    ids.update(self.search(cr, user, args + [['name',operator,name]], limit=(limit-len(ids)), context=context))
+                ids = list(ids)
+            if not ids:
+                ptrn = re.compile('(\[(.*?)\])')
+                res = ptrn.search(name)
+                if res:
+                    ids = self.search(cr, user, [('default_code','=', res.group(2))] + args, limit=limit, context=context)
+        else:
+            ids = self.search(cr, user, args, limit=limit, context=context)
+        result = self.name_get(cr, user, ids, context=context)
+        return result
+
+product_product()
+
+

=== added file 'product_search_improver/product_view.xml'
--- product_search_improver/product_view.xml	1970-01-01 00:00:00 +0000
+++ product_search_improver/product_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="siesa_product_search_form_view" model="ir.ui.view">
+            <field name="name">product.search.form</field>
+            <field name="model">product.product</field>
+            <field name="type">search</field>
+            <field name="inherit_id" ref="product.product_search_form_view"/>
+            <field name="arch" type="xml">
+                   <field name="name" position="replace">
+                       <field name="name"/>
+                       <field name="part_number"/>
+                       <field name="default_code" string="Código"/>
+                   </field>
+            </field>
+        </record>
+        <record id="siesa_product_product_tree_view" model="ir.ui.view">
+            <field name="name">product.product.tree</field>
+            <field name="model">product.product</field>
+            <field name="type">tree</field>
+            <field name="inherit_id" ref="product.product_product_tree_view"/>
+            <field eval="7" name="priority"/>
+            <field name="arch" type="xml">
+                    <field name="default_code" string="Codigo" position="after">
+                        <field name="part_number" />
+                    </field>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="siesa_view_product_form">
+            <field name="name">product.normal.form</field>
+            <field name="model">product.product</field>
+            <field name="inherit_id" ref="product.product_normal_form_view" />
+            <field name="type">form</field>
+            <field eval="2" name="priority"/>
+            <field name="arch" type="xml">
+                <xpath expr="/form/group/group/field[@name='name']" position="after">
+                    <field name="part_number" />
+                </xpath>
+                <xpath expr="/form/group/group/field[@name='purchase_ok']" position="after">
+                    <field name="import_ok"/>
+                </xpath>
+                <xpath expr="/form/notebook/page[@string='Information']/group/field[@name='standard_price']" position="replace">
+                    <field  groups="base.group_sale_manager" name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"  sequence="3"/>
+                </xpath>
+                <xpath expr="/form/notebook/page[@string='Information']/group/field[@name='uom_po_id']" position="after">
+                     <separator string="Import Product" colspan="2" attrs="{'invisible':[('import_ok','!=','1')]}"/>
+                    <field name="fob_currency_id" string="Import Currency" attrs="{'invisible':[('import_ok','!=','1')]}"/>
+                    <field name="cost_fob" string="Import Cost" attrs="{'invisible':[('import_ok','!=','1')]}"/>
+                </xpath>
+            </field>
+        </record>
+    </data>
+</openerp>

=== added directory 'purchase_import'
=== added file 'purchase_import/__init__.py'
--- purchase_import/__init__.py	1970-01-01 00:00:00 +0000
+++ purchase_import/__init__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,4 @@
+import imports
+import purchase
+import tariff
+import product

=== added file 'purchase_import/__openerp__.py'
--- purchase_import/__openerp__.py	1970-01-01 00:00:00 +0000
+++ purchase_import/__openerp__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,23 @@
+{
+    'name': 'Purchase Import',
+    'version': '1.1',
+    'category': 'Purchases',
+    'description': """
+        Add a module that facilitates the purchase of imports, adding tax charges and
+        change the price of the product cost for the total price movement.
+
+    """,
+    'author': 'SIESA',
+    'website': 'http://www.siesacr.com',
+    'depends': ['purchase','product','product_search_improver'],
+    'data': [
+        'import_view.xml',
+        'voucher_view.xml',
+        'purchase_import_workflow.xml',
+        'product_view.xml',
+        'tariff_view.xml',
+        'import_sequence.xml'
+    ],
+    'installable': True,
+    'active': False,
+}

=== added file 'purchase_import/import_sequence.xml'
--- purchase_import/import_sequence.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/import_sequence.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+        <!-- Sequences for sale.order -->
+        <record id="seq_type_purchase_import_order" model="ir.sequence.type">
+            <field name="name">Purchase Import Order</field>
+            <field name="code">purchase.import.order</field>
+        </record>
+
+        <record id="seq_purchase_import_order" model="ir.sequence">
+            <field name="name">Purchase Import Order</field>
+            <field name="code">purchase.import.order</field>
+            <field name="prefix">IO</field>
+            <field name="padding">3</field>
+            <field name="company_id" eval="False"/>
+        </record>
+
+    </data>
+</openerp>

=== added file 'purchase_import/import_view.xml'
--- purchase_import/import_view.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/import_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <!--Purchase Import Order-->
+        <record id="view_purchase_import_order_filter" model="ir.ui.view">
+            <field name="name">purchase.import.order.list.select</field>
+            <field name="model">purchase.import.order</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Purchase Import">
+                    <field name="name"/>
+                    <field name="create_date"/>
+                    <field name="provenance_id"/>
+                    <newline/>
+                    <group expand="0" string="Group By..." groups="base.group_extended">
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <record id="view_purchase_import_order_form" model="ir.ui.view">
+            <field name="name">purchase.import.order.form</field>
+            <field name="model">purchase.import.order</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Purchase Import">
+                    <group col="6" colspan="4">
+                        <field name="name"/>
+                        <field name="create_date"/>
+                        <field name="date_arrive"/>
+                    </group>
+                    <notebook>
+                        <page string="Asigned Invoice">
+                            <group string="Product Invoices" col="4" colspan="4">
+                                <field name="imports_order_id"  nolabel="1" domain="[('type', '=', 'in_invoice'),('state','not in',['draft','cancel'])]">
+                                    <tree string="Products">
+                                        <field name="number"/>
+                                        <field name="partner_id"/>
+                                        <field name="date_invoice"/>
+                                        <field name="currency_id"/>
+                                        <field name="amount_total"/>
+                                    </tree>
+                                </field>
+                            </group>
+                            <group string="Orders" col="3" colspan="2">
+                                <newline/>
+                                    <field name="freight_order_id" domain="[('type', '=', 'in_invoice'),('state','not in',['draft','cancel'])]" /><field name="freight_currency" nolabel="1" readonly="1"/>
+                                    <field name="tax_order_id" domain="[('type', '=', 'in_invoice'),('state','not in',['draft','cancel'])]"/><field name="taxes_currency" nolabel="1" readonly="1"/>
+                            </group>
+
+                            <group col="2" string="Freight Details" colspan="2">
+                                <newline/>
+                                <field name="provenance_id"/>
+                                <field name="fob"/>
+                            </group>
+                            <group col="2" string="Import Total (CRC)" colspan="2">
+                                <field name="total_freight"/>
+                                <field name="tax_total"/>
+                                <field name="total_paid"/>
+
+                            </group>
+                            <group col="2" string="State" colspan="2">
+                                <field name="total_products"/>
+                                <group colspan="3">
+                                    <button name="import_approve" states="draft" string="Approve" icon="gtk-go-forward"/>
+                                    <button name="import_confirm" states="confirmed" string="Confirme" icon="gtk-go-forward"/>
+                                    <button name="import_draft" states="cancel" string="Draft" icon="gtk-go-forward"/>
+                                    <button name="import_cancel" states="confirmed" string="Cancel" icon="gtk-cancel"/>
+                                </group>
+                                <newline/>
+                                <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"cancel":"red","draft":"blue","confirmed":"blue","done":"blue"}' readonly="1"/>
+                            </group>
+
+                        </page>
+                        <page string="Invoice Lines">
+                            <group>
+                                <field name="lines_id" nolabel="1" readonly="1">
+                                   <tree string="Products">
+                                        <field name="name"/>
+                                        <field name="quantity"/>
+                                        <field name="uos_id"/>
+                                        <field name="price_unit"/>
+                                        <field name="price_subtotal"/>
+                                    </tree>
+                                </field>
+                            </group>
+                        </page>
+                        <page string="Freight">
+                            <group>
+                                <newline/>
+                                <field name="freight" nolabel="1" readonly="1"/>
+                            </group>
+                        </page>
+                        <page string="Tax">
+                            <group>
+                                <newline/>
+                                <field name="taxes" nolabel="1" readonly="1"/>
+                            </group>
+                        </page>
+                        <page string="Voucher">
+                            <field colspan="4" mode="form,tree" name="voucher_id" nolabel="1" select="1" height="260"/>
+                        </page>
+                        <page string="Notes">
+                            <field name="note" nolabel="1"/>
+                        </page>
+                    </notebook>
+                </form>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="view_purchase_import_order_tree">
+        <field name="name">purchase.import.order.tree</field>
+        <field name="model">purchase.import.order</field>
+        <field name="type">tree</field>
+        <field name="arch" type="xml">
+            <tree string="Import Purchase">
+                    <field name="name"/>
+                    <field name="provenance_id"/>
+                    <field name="state"/>
+            </tree>
+        </field>
+        </record>
+        <record model="ir.actions.act_window" id="action_purchase_import_order">
+            <field name="name">Import Purchase</field>
+            <field name="res_model">purchase.import.order</field>
+            <field name="view_type">form</field>
+        </record>
+        <menuitem
+            id="menu_purchase_import_order"
+            name="Import Purchase"
+            parent="purchase.menu_procurement_management"
+            action="action_purchase_import_order"
+            sequence="11"
+        />
+        <!--Purchase Import Order-->
+    </data>
+</openerp>

=== added file 'purchase_import/imports.py'
--- purchase_import/imports.py	1970-01-01 00:00:00 +0000
+++ purchase_import/imports.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,269 @@
+from osv import osv, fields
+import decimal_precision as dp
+import math
+import logging
+import re
+from tools.translate import _
+
+class purchase_import_voucher(osv.osv):
+    def _calc_amount_cif(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for voucher in self.browse(cr, uid, ids):
+            res[voucher.id] = voucher.order_id.total_products +  voucher.order_id.total_freight
+        return res
+    def _calc_amount_cif_dolars(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for voucher in self.browse(cr, uid, ids):
+            res[voucher.id] = voucher.currency_rate * voucher.cif_real
+        return res
+
+    def button_dummy(self, cr, uid, ids, context=None):
+        return True
+
+    _name = 'purchase.import.voucher'
+    _columns = {
+        'name': fields.char('Number',size=64),
+        'date_voucher' : fields.datetime('Create Date'),
+        'location_id' : fields.many2one('res.partner.address', 'Origin'),
+        'bidder_id' : fields.many2one('res.partner', 'Bidder'),
+        'agent_number': fields.char('Agent Number',size=64),
+        'state_voucher': fields.char('State',size=64),
+        'regime': fields.char('Regime',size=64),
+        'importexport': fields.char('Import/Export',size=64),
+        'mode': fields.char('Mode',size=64),
+        'type_audit': fields.char('Audit Type',size=64),
+        'num_bags': fields.float('Bag Number'),
+        'weight': fields.float('Weight'),
+        'weight_net': fields.float('Weight Net'),
+        'cif_real': fields.function(_calc_amount_cif, method=True, string='CIF Real', type='float',help='Cost, insurance, freight'),
+        'cif_paid': fields.float('CIF Paid', required=True),
+        'cif_dolars': fields.function(_calc_amount_cif_dolars, method=True, string='CIF USD', type='float',help='(Cost, insurance, freight)* Currency Rate'),
+        'currency_rate': fields.float('Currency Rate'),
+        'tax': fields.related('tax_order_id','order_line',type='one2many',relation='purchase.order.line',string='Currency', store=False),
+        'order_id': fields.many2one('purchase.import.order', 'Order',ondelete='set null', select=True),
+    }
+    _defaults = {
+    }
+purchase_import_voucher()
+
+class purchase_import_order(osv.osv):
+    def create(self, cr, uid, vals, context=None):
+        res = []
+        line_ids = []
+        inv_obj = self.pool.get('account.invoice')
+        vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'purchase.import.order')
+        invoices = vals['imports_order_id']
+
+        for inv in inv_obj.browse(cr, uid, invoices[0][2]):
+            for line in inv.invoice_line:
+                line_ids.append(line.id)
+
+        vals['lines_id'] = [[6,False,line_ids]]
+
+        res= super(purchase_import_order, self).create(cr, uid, vals, context=context)
+        return res
+
+    def write(self, cr, uid, ids, vals, context=None):
+        res =[]
+        line_ids = []
+        inv_obj = self.pool.get('account.invoice')
+        if 'imports_order_id' in vals:
+            invoices = vals['imports_order_id']
+            for inv in inv_obj.browse(cr, uid, invoices[0][2]):
+                for line in inv.invoice_line:
+                    line_ids.append(line.id)
+            vals['lines_id'] = [[6,False,line_ids]]
+
+        res = super(purchase_import_order, self).write(cr, uid, ids, vals, context=context)
+        return res
+
+    def _calc_amount_total(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for order in self.browse(cr, uid, ids):
+            res[order.id] = order.tax_total+ order.total_freight
+        return res
+
+    def _calc_amount_tax(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for order in self.browse(cr, uid, ids):
+            if order.tax_order_id:
+                if order.tax_order_id.currency_id.id == order.tax_order_id.company_id.currency_id.id:
+                    currency = 1
+                else:
+                    currency = order.tax_order_id.currency_id.rate * order.tax_order_id.company_id.currency_id.rate
+                res[order.id] = order.tax_order_id.amount_untaxed * currency
+
+            else:
+                res[order.id] = 0
+        return res
+    def _calc_amount_prod(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        total = 0
+        for imports in self.browse(cr, uid, ids):
+            for order in imports.imports_order_id:
+                if order.currency_id.id == order.company_id.currency_id.id:
+                    currency = 1
+                else:
+                    currency = order.currency_id.rate * order.company_id.currency_id.rate
+                total = total + (order.amount_untaxed * currency)
+
+            res[imports.id] = total
+        return res
+
+    def _calc_amount_freight(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for order in self.browse(cr, uid, ids):
+            if order.freight_order_id:
+                if order.freight_order_id.currency_id.rate == order.freight_order_id.company_id.currency_id.rate:
+                    currency = 1
+                else:
+                    currency = order.freight_order_id.currency_id.rate * order.freight_order_id.company_id.currency_id.rate
+
+                res[order.id] = (order.freight_order_id.amount_untaxed + order.fob) * currency
+            else:
+                res[order.id] = 0
+        return res
+    def _calc_amount_insurance(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        for order in self.browse(cr, uid, ids):
+            if order.insurance_order_id:
+                if order.insurance_order_id.currency_id.rate == order.insurance_order_id.company_id.currency_id.rate:
+                    currency = 1
+                else:
+                    currency = order.insurance_order_id.currency_id.rate * order.insurance_order_id.company_id.currency_id.rate
+
+                res[order.id] = order.insurance_order_id.amount_untaxed * currency
+            else:
+                res[order.id] = 0
+        return res
+
+    def action_set_average_price(self, cr, uid, ids, context=None):
+        res = {}
+        total_weight = 0
+        order_tax = 0
+        product_freight = 0
+        product_tax = 0
+        product_insurance  = 0
+
+        for imports in self.browse(cr, uid, ids):
+            if imports.cif_paid == 0:
+                raise osv.except_osv(_('Invalid Document!'), _('Update CiF Cost" '))
+
+            if imports.tax_order_id:
+                if imports.tax_order_id.currency_id.id == imports.tax_order_id.company_id.currency_id.id:
+                    tax_currency_rate = 1
+                else:
+                    tax_currency_rate = imports.tax_order_id.currency_id.rate * imports.tax_order_id.company_id.currency_id.rate
+
+
+            for line in imports.lines_id:
+                uos_ratio = 1
+                if line.uos_id.uom_type =='reference':
+                        uos_ratio = 1
+                else:
+                    if line.uos_id.uom_type =='bigger':
+                        uos_ratio = line.uos_id.factor_inv
+                    else:
+                        uos_ratio = line.uos_id.factor
+                line_qty = line.quantity * uos_ratio
+
+                product = self.pool.get('product.product').browse(cr, uid, line.product_id.id, context=context)
+                total_weight = total_weight + (line_qty * product.weight)
+                order_tax = order_tax + product.tax_total
+
+                if (line_qty * product.weight) <= 0:
+                    raise osv.except_osv(_('Product with weight 0 !'), _('Update the product with part number "%s" ') % (product.part_number))
+
+                if (line_qty * product.tax_total) <= 0:
+                    raise osv.except_osv(_('Product without tariff !'), _('Update the product with part number  "%s" ') % (product.part_number))
+
+            for order in imports.imports_order_id:
+                if order.currency_id.id == order.company_id.currency_id.id:
+                    import_currency_rate = 1
+                else:
+                    import_currency_rate = order.currency_id.rate * order.company_id.currency_id.rate
+
+                for line in order.invoice_line:
+                    if line.uos_id.uom_type =='reference':
+                        uos_ratio = 1
+                    else:
+                        if line.uos_id.uom_type =='bigger':
+                            uos_ratio = line.uos_id.factor_inv
+                        else:
+                            uos_ratio = line.uos_id.factor
+                    line_qty = line.quantity * uos_ratio
+
+
+                    product = self.pool.get('product.product').browse(cr, uid, line.product_id.id, context=context)
+
+                    #Update price per weight
+                    if imports.freight_order_id:
+                        product_freight_percentage = product.weight * line_qty / total_weight
+                        product_freight = imports.total_freight * product_freight_percentage / line_qty
+
+                    #Update price per taxes
+                    if imports.tax_order_id:
+                        product_tax_percentage = product.tax_total / order_tax
+                        product_tax= imports.tax_total * product_tax_percentage / line_qty
+
+
+
+
+                    add_cost = (line.price_unit/ uos_ratio * import_currency_rate) + product_freight + product_tax + product_insurance
+
+                    if product.qty_available <= line_qty:
+                        cost = add_cost
+                    else:
+                        cost = (add_cost * line_qty  + product.standard_price * (product.qty_available - line_qty))/ product.qty_available
+
+                    product.write({'costo_fob': line.price_unit}, context=context)
+                    product.write({'standard_price': cost}, context=context)
+
+        self.write(cr, uid, ids, {'state': 'done'}, context=context)
+        return True
+
+    _name = 'purchase.import.order'
+    _columns = {
+        'name': fields.char('Number',size=64,readonly=True),
+        'fob': fields.float('FoB', required=True),
+
+        'voucher_id': fields.one2many('purchase.import.voucher', 'order_id', 'Voucher'),
+        'provenance_id' : fields.many2one('res.country', 'Origin',required=True),
+
+
+        'imports_order_id': fields.many2many('account.invoice', 'import_invoice_id', 'imports_id', 'invoice_id', 'Product Invoices'),
+
+        'freight_order_id':fields.many2one('account.invoice', 'Freight Invoice'),
+        'tax_order_id':fields.many2one('account.invoice', 'Tax Invoice'),
+
+        'date_arrive' : fields.datetime('Land Date'),
+        'date_due' : fields.datetime('Due Date'),
+
+        'total_products': fields.function(_calc_amount_prod, method=True, string='Product total', type='float'),
+
+        'tax_total': fields.function(_calc_amount_tax, method=True, string='Tax Total', type='float'),
+        'total_freight': fields.function(_calc_amount_freight, method=True, string='Freight Total', type='float'),
+        'total_paid': fields.function(_calc_amount_total, method=True, string='Import Total', type='float'),
+
+        'lines_id': fields.many2many('account.invoice.line', 'import_line_id', 'imports_id', 'line_id', 'Products',readonly=True),
+
+        'freight': fields.related('freight_order_id','invoice_line',type='one2many',relation='account.invoice.line',string='Freight', store=False),
+        'freight_currency': fields.related('freight_order_id','currency_id',type='many2one',relation='res.currency',string='Freight Currency', store=False),
+
+        'taxes': fields.related('tax_order_id','invoice_line',type='one2many',relation='account.invoice.line',string='Taxes', store=False),
+        'taxes_currency': fields.related('tax_order_id','currency_id',type='many2one',relation='res.currency',string='Tax Currency', store=False),
+
+
+        'cif_paid': fields.related('voucher_id', 'cif_paid', type='float', string='CIF Paid'),
+        'cif_real': fields.related('voucher_id', 'cif_real', type='float', string='CIF Real'),
+
+        'note': fields.text('Notes'),
+        'create_date' : fields.datetime('Create Date', readonly=True),
+        'state': fields.selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancel')], 'State', required=True, readonly=True)
+    }
+    _defaults = {
+        'state': lambda *args: 'draft',
+    }
+
+purchase_import_order()
+

=== added file 'purchase_import/product.py'
--- purchase_import/product.py	1970-01-01 00:00:00 +0000
+++ purchase_import/product.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,24 @@
+from osv import osv, fields
+import decimal_precision as dp
+import math
+import logging
+import re
+from tools.translate import _
+
+class product_product(osv.osv):
+    _inherit = "product.product"
+    def _calc_amount_tax(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        total_tax = 0
+        for product in self.browse(cr, uid, ids):
+            for tax in product.import_taxes:
+                total_tax = total_tax + tax.value
+            res[product.id] = total_tax
+        return res
+
+    _columns = {
+        'tariff_id' : fields.many2one('purchase.import.tariff', 'Arancel'),
+        'tax_total': fields.function(_calc_amount_tax, method=True, string='Impuestos', type='float',help='Taxes from import'),
+        'import_taxes': fields.related('tariff_id','tax_id',type='one2many',relation='purchase.import.tax',string='Detalle'),
+    }
+product_product()

=== added file 'purchase_import/product_view.xml'
--- purchase_import/product_view.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/product_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="view_product_form_siesa">
+            <field name="name">product.normal.form</field>
+            <field name="model">product.product</field>
+            <field name="inherit_id" ref="product.product_normal_form_view" />
+            <field name="type">form</field>
+            <field eval="2" name="priority"/>
+            <field name="arch" type="xml">
+                <xpath expr="/form/notebook/page[@string='Information']/group/field[@name='uom_po_id']" position="after">
+                    <separator string="Import Tariff" colspan="2" attrs="{'invisible':[('import_ok','!=','1')]}" groups="purchase.group_purchase_manager"/>
+                    <field name="tariff_id" string="Tariff" attrs="{'invisible':[('import_ok','!=','1')]}" groups="purchase.group_purchase_manager"/>
+                    <field name="tax_total" string="Tariff" attrs="{'invisible':[('import_ok','!=','1')]}" groups="purchase.group_purchase_manager"/>
+                    <field name="import_taxes" string="import_taxes" attrs="{'invisible':[('import_ok','!=','1')]}" groups="purchase.group_purchase_manager"/>
+                </xpath>
+            </field>
+        </record>
+    </data>
+</openerp>

=== added file 'purchase_import/purchase.py'
--- purchase_import/purchase.py	1970-01-01 00:00:00 +0000
+++ purchase_import/purchase.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,19 @@
+import time
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+from osv import osv, fields
+import netsvc
+import pooler
+from tools.translate import _
+import decimal_precision as dp
+from osv.orm import browse_record, browse_null
+import logging
+
+
+class purchase_order_line(osv.osv):
+    _inherit = 'purchase.order.line'
+    _columns = {
+        'numero_parte': fields.related('product_id','numero_parte',string='Numero Parte',readonly=True,type="char")
+    }
+purchase_order_line()

=== added file 'purchase_import/purchase_import_workflow.xml'
--- purchase_import/purchase_import_workflow.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/purchase_import_workflow.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <record id="wkf_import" model="workflow">
+            <field name="name">purchase.import.order.basic</field>
+            <field name="osv">purchase.import.order</field>
+            <field name="on_create">True</field>
+        </record>
+
+        <record id="act_draft" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_import"/>
+            <field name="flow_start">True</field>
+            <field name="name">draft</field>
+            <field name="action">write({'state':'draft'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="act_done" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_import"/>
+            <field name="name">done</field>
+            <field name="action">action_set_average_price()</field>
+            <field name="kind">function</field>
+            <field name="flow_stop">True</field>
+        </record>
+
+        <record id="act_confirmed" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_import"/>
+            <field name="name">confirm</field>
+            <field name="action">write({'state':'confirmed'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="act_cancel" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_import"/>
+            <field name="name">cancel</field>
+            <field name="action">write({'state':'cancel'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="t2" model="workflow.transition">
+            <field name="act_from" ref="act_draft"/>
+            <field name="act_to" ref="act_confirmed"/>
+            <field name="signal">import_approve</field>
+        </record>
+
+        <record id="t7" model="workflow.transition">
+            <field name="act_from" ref="act_confirmed"/>
+            <field name="act_to" ref="act_done"/>
+            <field name="signal">import_confirm</field>
+        </record>
+
+        <record id="t8" model="workflow.transition">
+            <field name="act_from" ref="act_confirmed"/>
+            <field name="act_to" ref="act_cancel"/>
+            <field name="signal">import_cancel</field>
+        </record>
+
+        <record id="t9" model="workflow.transition">
+            <field name="act_from" ref="act_cancel"/>
+            <field name="act_to" ref="act_draft"/>
+            <field name="signal">import_draft</field>
+        </record>
+    </data>
+</openerp>

=== added file 'purchase_import/tariff.py'
--- purchase_import/tariff.py	1970-01-01 00:00:00 +0000
+++ purchase_import/tariff.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,50 @@
+from osv import osv, fields
+import decimal_precision as dp
+
+import math
+import logging
+import re
+from tools.translate import _
+
+class purchase_import_tariff_category(osv.osv):
+    _name = 'purchase.import.tariff.category'
+    _columns = {
+        'code': fields.char('Code',size=64),
+        'name': fields.char('Name',size=64),
+        'description': fields.char('Description',size=64),
+    }
+purchase_import_tariff_category()
+
+
+class purchase_import_tariff(osv.osv):
+    _name = 'purchase.import.tariff'
+
+    def _calc_amount_tax(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+        res = {}
+        total_tax = 0
+        for tariff in self.browse(cr, uid, ids):
+            for tax in tariff.tax_id:
+                total_tax = total_tax + tax.value
+            res[tariff.id] = total_tax
+        return res
+
+    _columns = {
+        'name': fields.char('Code',size=64),
+        'description': fields.char('Description',size=64),
+        'category' : fields.many2one('purchase.import.tariff.category', 'Category'),
+        'tax_id': fields.one2many('purchase.import.tax', 'tariff_id', 'Tax'),
+
+        'tariff_total': fields.function(_calc_amount_tax, method=True, string='Total Tax', type='float',help='Taxes from import'),
+    }
+purchase_import_tariff()
+
+class purchase_import_tax(osv.osv):
+    _name = 'purchase.import.tax'
+    _columns = {
+        'code': fields.char('Code',size=64, required=True),
+        'name': fields.char('Name',size=64, required=True),
+        'description': fields.char('Description',size=64),
+        'value': fields.float('Value', required=True),
+        'tariff_id' : fields.many2one('purchase.import.tariff', 'Tariff'),
+    }
+purchase_import_tax()

=== added file 'purchase_import/tariff_view.xml'
--- purchase_import/tariff_view.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/tariff_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <!--Purchase Import Voucher-->
+        <record id="view_purchase_import_tariff_filter" model="ir.ui.view">
+            <field name="name">purchase.import.tariff.list.select</field>
+            <field name="model">purchase.import.tariff</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Tariff Search">
+                    <field name="name"/>
+                    <field name="category"/>
+              </search>
+            </field>
+        </record>
+        <record id="view_purchase_import_tariff_form" model="ir.ui.view">
+            <field name="name">purchase.import.tariff.form</field>
+            <field name="model">purchase.import.tariff</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Import Tariff">
+                    <group string="Tariff" col="4" colspan="4">
+                        <field name="name"/>
+                        <field name="description"/>
+                        <field name="category"/>
+                        <field name="tariff_total"/>
+                    </group>
+                    <notebook>
+                        <page string="Taxes">
+                            <group>
+                                <field name="tax_id" nolabel="1" colspan="2"/>
+                            </group>
+                        </page>
+                    </notebook>
+                </form>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_purchase_import_tariff_tree">
+        <field name="name">purchase.import.tariff.tree</field>
+        <field name="model">purchase.import.tariff</field>
+        <field name="type">tree</field>
+        <field name="arch" type="xml">
+            <tree string="Import Tariff">
+                    <field name="name"/>
+                    <field name="category"/>
+                    <field name="tariff_total"/>
+            </tree>
+        </field>
+        </record>
+        <!--Purchase Import Tariff-->
+        <record model="ir.ui.view" id="view_purchase_import_tax_tree">
+        <field name="name">purchase.import.tax.tree</field>
+        <field name="model">purchase.import.tax</field>
+        <field name="type">tree</field>
+        <field name="arch" type="xml">
+            <tree string="Import Tax">
+                <field name="code"/>
+                <field name="name"/>
+                <field name="value"/>
+            </tree>
+        </field>
+        </record>
+    </data>
+</openerp>

=== added file 'purchase_import/voucher_view.xml'
--- purchase_import/voucher_view.xml	1970-01-01 00:00:00 +0000
+++ purchase_import/voucher_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <!--Purchase Import Voucher-->
+        <record id="view_purchase_import_voucher_filter" model="ir.ui.view">
+            <field name="name">purchase.import.voucher.list.select</field>
+            <field name="model">purchase.import.voucher</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Import Voucher Search">
+                    <field name="name"/>
+                    <field name="bidder_id"/>
+                    <field name="agent_number"/>
+              </search>
+            </field>
+        </record>
+        <record id="view_purchase_import_voucher_form" model="ir.ui.view">
+            <field name="name">purchase.import.voucher.form</field>
+            <field name="model">purchase.import.voucher</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Import Voucher">
+                    <group string="Voucher" col="2" colspan="2">
+                        <field name="name"/>
+                        <field name="date_voucher"/>
+                        <field name="location_id"/>
+                        <field name="bidder_id"/>
+                        <field name="agent_number"/>
+                    </group>
+                    <group string="State" col="2" colspan="2">
+                        <field name="state_voucher"/>
+                        <field name="regime"/>
+                        <field name="importexport"/>
+                        <field name="mode"/>
+                    </group>
+                    <group string="Product" col="2" colspan="2">
+                            <field name="type_audit"/>
+                            <field name="num_bags"/>
+                            <field name="weight"/>
+                            <field name="weight_net"/>
+                    </group>
+                    <group string="Total" col="2" colspan="2">
+                        <field name="currency_rate"/>
+                        <field name="cif_dolars"/>
+                        <field name="cif_real"/>
+                        <field name="cif_paid"/>
+                        <button name="button_dummy" string="Compute" type="object" icon="gtk-execute"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="view_purchase_import_voucher_tree">
+        <field name="name">purchase.import.voucher.tree</field>
+        <field name="model">purchase.import.voucher</field>
+        <field name="type">tree</field>
+        <field name="arch" type="xml">
+            <tree string="Import Voucher">
+                    <field name="name"/>
+                    <field name="date_voucher"/>
+                    <field name="cif_real"/>
+                    <field name="cif_paid"/>
+            </tree>
+        </field>
+        </record>
+        <!--Purchase Import Voucher-->
+    </data>
+</openerp>

=== added directory 'sale_extends'
=== added file 'sale_extends/__init__.py'
--- sale_extends/__init__.py	1970-01-01 00:00:00 +0000
+++ sale_extends/__init__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,26 @@
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import sale
+import wizard
+import sale_make_invoice
+import sale_commission
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'sale_extends/__openerp__.py'
--- sale_extends/__openerp__.py	1970-01-01 00:00:00 +0000
+++ sale_extends/__openerp__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,48 @@
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+{
+    "name":"Sales Order Extends",
+    "version":"1.0",
+    "category" : "Generic Modules/Sales & Purchases",
+    "description": """
+This module adds=
+    # sale order validity
+    # client purchase order required
+    # sale order part number
+    # client credit check before invoice create
+    # update sale order line qty to stock available
+    # add delivery time to sale order line
+    # remove change_product_id in product_uom_qty
+    """,
+    "author":"SIESA",
+    "depends":['sale','account_invoice_extends','partner_extends'],
+    "demo_xml":[],
+    "update_xml":['wizard/sale_change_currency_view.xml',
+                   'sale_view.xml',
+                   'sale_commision_view.xml',
+                   'commision_sequence.xml',
+                   'sale_commission_workflow.xml'
+                  ],
+    "active": False,
+    "installable": True,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'sale_extends/commision_sequence.xml'
--- sale_extends/commision_sequence.xml	1970-01-01 00:00:00 +0000
+++ sale_extends/commision_sequence.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+        <!-- Sequences for sale.order -->
+        <record id="seq_type_commision" model="ir.sequence.type">
+            <field name="name">Comisiones</field>
+            <field name="code">sale.commission</field>
+        </record>
+
+        <record id="seq_commission" model="ir.sequence">
+            <field name="name">Comisiones</field>
+            <field name="code">sale.commission</field>
+            <field name="prefix">COM</field>
+            <field name="padding">3</field>
+            <field name="company_id" eval="False"/>
+        </record>
+
+    </data>
+</openerp>

=== added file 'sale_extends/sale.py'
--- sale_extends/sale.py	1970-01-01 00:00:00 +0000
+++ sale_extends/sale.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,75 @@
+from datetime import datetime, timedelta
+from dateutil.relativedelta import relativedelta
+import time
+import pooler
+from osv import fields, osv
+from tools.translate import _
+from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, float_compare
+import decimal_precision as dp
+import netsvc
+import logging
+
+
+
+class sale_order(osv.osv):
+    _inherit = "sale.order"
+    _columns = {
+        'name': fields.char('Order Reference', size=64, required=True,readonly=True),
+        'local': fields.boolean('Local'),
+        'oc': fields.binary('Data'),
+        'credit_app': fields.boolean('Credit Aprove'),
+        'validez': fields.selection([
+            ('7', '7 Days'),
+            ('15', '15 Days'),
+            ('30', '30 Days'),
+            ('45', '45 Days'),
+        ], 'Validity', required=True),
+        'create_user_id': fields.many2one('res.users', 'Create by', readonly=True),
+    }
+    _defaults = {
+        'create_user_id': lambda obj, cr, uid, context: uid,
+    }
+    def action_wait(self, cr, uid, ids, context=None):
+        due_invoice= []
+        inv_obj = self.pool.get('account.invoice')
+        today = datetime.now().strftime('%Y-%m-%d')
+
+        for order in self.pool.get('sale.order').browse(cr, uid, ids,context=context):
+            partner = order.partner_id
+            due_invoices = inv_obj.search(cr, uid, [('date_due','<',today),('partner_id','=',partner.id),('state','=','open'),('type','=','out_invoice')], context=context)
+            if order.payment_term.credit:
+                if not order.credit_app:
+                    if (partner.credit + order.amount_total) > partner.credit_limit:
+                        raise osv.except_osv(_('Invalid Order!'), _('Customer has no credit'))
+                    if len(due_invoices)>0:
+                        raise osv.except_osv(_('Invalid Order!'), _('customer with overdue bills'))
+            if not order.client_order_ref:
+                raise osv.except_osv(_('Invalid Order!'), _('Add a client purchase order or customer reference.'))
+        res = super(sale_order, self).action_wait(cr, uid, ids, context=context)
+        return res
+
+sale_order()
+
+class sale_order_line(osv.osv):
+    _inherit = "sale.order.line"
+    _columns = {
+        'part_number': fields.char('Part Number', size=64),
+        'delivery_time': fields.char('Delivery Time', size=64, required=True),
+    }
+    _defaults = {
+        'delivery_time': '1 day',
+    }
+    def product_id_change(self, cr, uid, ids, pricelist, product, qty=0,
+            uom=False, qty_uos=0, uos=False, name='', partner_id=False,
+            lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, context=None):
+        res = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty,uom, qty_uos, uos, name, partner_id, lang, update_tax, date_order, packaging, fiscal_position, flag, context)
+        product_obj = self.pool.get('product.product').browse(cr, uid, product,context=context)
+
+        if 'name' in res['value']:
+            res['value']['part_number']=product_obj.part_number
+            if product_obj.qty_available >0:
+                res['value']['product_uom_qty']=product_obj.virtual_available
+            else:
+                res['value']['product_uom_qty']=1
+        return res
+sale_order_line()

=== added file 'sale_extends/sale_commision_view.xml'
--- sale_extends/sale_commision_view.xml	1970-01-01 00:00:00 +0000
+++ sale_extends/sale_commision_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+        <record id="siesa_view_commission_filter" model="ir.ui.view">
+            <field name="name">sale.commission.select</field>
+            <field name="model">sale.commission</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Commissions Analisys">
+                    <field name="name"/>
+                    <field name="commission_start"/>
+                    <field name="commission_end"/>
+                    <field name="user_id"/>
+              </search>
+            </field>
+        </record>
+        <record id="siesa_view_sale_commission_form" model="ir.ui.view">
+            <field name="name">sale.commission.form</field>
+            <field name="model">sale.commission</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Commissions Analisys">
+                    <group col="6" colspan="4">
+                        <field name="name"/>
+                        <field name="create_date"/>
+                        <field name="user_id"/>
+                        <field name="total_pay"/>
+                        <field name="total_nc"/>
+                        <field name="total_sale_paid"/>
+                        <field name="total_sale"/>
+                        <field name="commission_start"/>
+                        <field name="commission_end"/>
+                    </group>
+                    <notebook>
+                        <page string="Paid Invoices">
+                            <group col="2"  colspan="2">
+                            <field name="account_invoice_paid_id" nolabel="1" domain="[('type', '=', 'out_invoice'),('state','in',['paid'])]"/>
+                                <group colspan="3" string="Estado">
+                                    <button name="commission_approve" states="draft" string="Aprovar" icon="gtk-go-forward"/>
+                                    <button name="commission_confirm" states="confirmed" string="confirmar" icon="gtk-go-forward"/>
+                                    <button name="commission_draft" states="cancel" string="Cambiar a Borrador" icon="gtk-go-forward"/>
+                                    <button name="commission_cancel" states="confirmed" string="Cancelar" icon="gtk-cancel"/>
+                                    <newline/>
+                                    <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"cancel":"red","draft":"blue","confirmed":"blue","done":"blue"}' readonly="1"/>
+                                </group>
+
+
+                            </group>
+                        </page>
+                        <page string="Refund">
+                            <field name="account_invoice_nc_id" nolabel="1"/>
+                        </page>
+                        <page string="OverDue Invoice">
+                            <field name="account_invoice_expiry_id" nolabel="1"/>
+                        </page>
+                    </notebook>
+                </form>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="view_sale_comision_tree">
+            <field name="name">sale.commission.tree</field>
+            <field name="model">sale.commission</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="Commissions Analisys">
+                    <field name="name"/>
+                    <field name="commission_start"/>
+                    <field name="commission_end"/>
+                    <field name="total_pay"/>
+                    <field name="total_nc"/>
+                    <field name="total_sale"/>
+                    <field name="user_id"/>
+                </tree>
+            </field>
+        </record>
+        <record model="ir.actions.act_window" id="action_sale_commission_user">
+            <field name="name">Commissions Analisys</field>
+            <field name="res_model">sale.commission</field>
+            <field name="view_type">form</field>
+        </record>
+        <menuitem
+            id="menu_sale_commision"
+            name="Commissions Analisys"
+            groups="base.group_extended"
+            parent="base.next_id_64"
+            action="action_sale_commission_user"
+            sequence="16"
+        />
+</data>
+</openerp>

=== added file 'sale_extends/sale_commission.py'
--- sale_extends/sale_commission.py	1970-01-01 00:00:00 +0000
+++ sale_extends/sale_commission.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,200 @@
+from datetime import datetime, timedelta
+from dateutil.relativedelta import relativedelta
+import time
+import pooler
+from osv import fields, osv
+from tools.translate import _
+from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, float_compare
+import decimal_precision as dp
+import netsvc
+import logging
+
+
+
+class sale_commission(osv.osv):
+    def write(self, cr, uid, ids, vals, context=None):
+        res = []
+        invoices_id = []
+        nc_id = []
+        commission_total = 0
+        total_paid = 0
+        total_nc = 0
+        total_all = 0
+        today = datetime.now().strftime('%Y-%m-%d')
+        voucher_obj = self.pool.get('account.voucher')
+        part_obj = self.pool.get('res.partner')
+        user_obj = self.pool.get('res.user')
+        inv_all_obj = self.pool.get('account.invoice')
+        inv_paid_obj = self.pool.get('account.invoice')
+        inv_expiry_obj = self.pool.get('account.invoice')
+        inv_nc_obj = self.pool.get('account.invoice')
+        res = super(sale_commission, self).write(cr, uid, ids, vals, context=context)
+
+        for commission in self.browse(cr, uid, ids, context=context):
+
+            # Facturas Vencidas
+            inv_expiry_obj = commission.account_invoice_expiry_id
+
+            for inv in inv_expiry_obj:
+                if inv.currency_id.id == inv.company_id.currency_id.id:
+                    rate = 1
+                else:
+                    rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+                total_all = total_all + (inv.amount_untaxed * rate)
+
+
+
+            # Facturas pagadas
+
+            inv_paid_obj = commission.account_invoice_paid_id
+
+            for inv in inv_paid_obj:
+
+
+                if inv.currency_id.id == inv.company_id.currency_id.id:
+                    rate = 1
+                else:
+                    rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+
+                if not inv.id in invoices_id:
+                    invoices_id.append(inv.id)
+                    total_paid = total_paid + (inv.amount_untaxed * rate)
+                    commission_total = commission_total + (inv.amount_untaxed * rate * inv.partner_id.commission)
+
+
+
+            # Notas de credito
+            inv_nc_obj = commission.account_invoice_nc_id
+
+            for inv in inv_nc_obj:
+                if inv.currency_id.id == inv.company_id.currency_id.id:
+                    rate = 1
+                else:
+                    rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+
+                if not inv.id in nc_id:
+                    nc_id.append(inv.id)
+                    total_nc = total_nc + (inv.amount_untaxed * rate)
+                    commission_total = commission_total - (inv.amount_untaxed * rate * inv.partner_id.commission)
+
+
+            vals['total_sale'] = total_all + total_paid
+            vals['total_sale_paid'] = total_paid
+            vals['total_nc'] = total_nc
+            vals['total_pay'] = commission_total
+        res = super(sale_commission, self).write(cr, uid, ids, vals, context=context)
+        return res
+
+    def create(self, cr, uid, vals, context=None):
+        res = []
+        invoices_id = []
+        nc_id = []
+        commission = 0
+        total_paid = 0
+        total_nc = 0
+        total_all = 0
+        today = datetime.now().strftime('%Y-%m-%d')
+        voucher_obj = self.pool.get('account.voucher')
+        part_obj = self.pool.get('res.partner')
+        user_obj = self.pool.get('res.user')
+        inv_all_obj = self.pool.get('account.invoice')
+        inv_paid_obj = self.pool.get('account.invoice')
+        inv_expiry_obj = self.pool.get('account.invoice')
+        inv_nc_obj = self.pool.get('account.invoice')
+        vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.commission')
+
+        # Facturas Ventas
+        inv_all_obj = inv_all_obj.search(cr, uid, [('date_invoice','<',vals['commission_end']),('date_invoice','>',vals['commission_start']),('user_id','=',vals['user_id']),('state','in',('paid','open','cancel')),('type','=','out_invoice')], context=context)
+
+        for inv in inv_all_obj:
+            inv = self.pool.get('account.invoice').browse(cr, uid, inv, context=context)
+            if inv.currency_id.id == inv.company_id.currency_id.id:
+                rate = 1
+            else:
+                rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+            total_all = total_all + (inv.amount_untaxed * rate)
+
+
+
+        # Facturas pagadas
+        inv_paid_obj = inv_paid_obj.search(cr, uid, [('date_invoice','<',vals['commission_end']),('date_invoice','>',vals['commission_start']),('user_id','=',vals['user_id']),('state','=','paid'),('type','=','out_invoice')], context=context)
+
+        for inv in inv_paid_obj:
+            inv = self.pool.get('account.invoice').browse(cr, uid, inv, context=context)
+
+            if inv.currency_id.id == inv.company_id.currency_id.id:
+                rate = 1
+            else:
+                rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+
+            if not inv.id in invoices_id:
+                invoices_id.append(inv.id)
+                total_paid = total_paid + (inv.amount_untaxed * rate)
+                commission = commission + (inv.amount_untaxed * rate * inv.partner_id.commission)
+
+
+
+        # Notas de credito
+        inv_nc_obj = inv_nc_obj.search(cr, uid, [('date_invoice','<',vals['commission_end']),('date_invoice','>',vals['commission_start']),('user_id','=',vals['user_id']),('state','=','paid'),('type','=','out_refund')], context=context)
+
+        for inv in inv_nc_obj:
+            inv = self.pool.get('account.invoice').browse(cr, uid, inv, context=context)
+            if inv.currency_id.id == inv.company_id.currency_id.id:
+                rate = 1
+            else:
+                rate = inv.currency_id.rate * inv.company_id.currency_id.rate
+
+
+            if not inv.id in nc_id:
+                nc_id.append(inv.id)
+                total_nc = total_nc + (inv.amount_untaxed * rate)
+                commission = commission - (inv.amount_untaxed * rate * inv.partner_id.commission)
+
+
+        # Facturas Vencidas
+        inv_expiry_obj = inv_expiry_obj.search(cr, uid, [('date_invoice','<',vals['commission_end']),('date_invoice','>',vals['commission_start']),('user_id','=',vals['user_id']),('state','=','open'),('type','=','out_invoice')], context=context)
+
+        vals['total_sale'] = total_all
+        vals['total_sale_paid'] = total_paid
+        vals['account_invoice_paid_id'] = [[6,0,invoices_id]]
+        vals['total_nc'] = total_nc
+        vals['account_invoice_nc_id'] = [[6,0,nc_id]]
+        vals['total_pay'] = commission
+        vals['account_invoice_expiry_id'] = [[6,0,inv_expiry_obj]]
+
+
+        res= super(sale_commission, self).create(cr, uid, vals, context=context)
+        return res
+    def action_set_invoice_commision(self, cr, uid, ids, context=None):
+        res = {}
+        for comm in self.browse(cr, uid, ids):
+            for inv in comm.account_invoice_paid_id:
+                inv.write({'commision_paid': True}, context=context)
+        self.write(cr, uid, ids, {'state': 'done'}, context=context)
+        return True
+
+    _name = "sale.commission"
+    _columns = {
+        'name': fields.char('Nombre',size=64,readonly=True),
+        'total_pay': fields.float('Comision', readonly=True),
+        'total_nc': fields.float('Total NC', readonly=True),
+        'total_sale_paid': fields.float('Total Pagas', readonly=True),
+        'total_sale': fields.float('Total Ventas', readonly=True),
+        'commission_start' : fields.date('Fecha Inicio', required=True),
+        'commission_end' : fields.date('Fecha Fin', required=True),
+        'create_date' : fields.datetime('Fecha Creacion', readonly=True),
+        'user_id': fields.many2one('res.users', 'Vendedor', required=True),
+        'account_invoice_paid_id': fields.many2many('account.invoice', 'commision_invoice_paid_id', 'sale_commission_id', 'invoice_id', 'Facturas Pagadas'),
+        'account_invoice_expiry_id': fields.many2many('account.invoice', 'commision_invoice_expiry_id', 'sale_commission_id', 'invoice_id', 'Facturas Vencidas'),
+        'account_invoice_nc_id': fields.many2many('account.invoice', 'commision_invoice_nc_id', 'sale_commission_id', 'invoice_id', 'Notas Credito'),
+        'state': fields.selection([('draft', 'Borrador'), ('confirmed', 'Confirmado'), ('done', 'Procesado'), ('cancel', 'Cancelado')], 'Estado', required=True, readonly=True)
+    }
+    _defaults = {
+        'state': lambda *args: 'draft',
+    }
+sale_commission()

=== added file 'sale_extends/sale_commission_workflow.xml'
--- sale_extends/sale_commission_workflow.xml	1970-01-01 00:00:00 +0000
+++ sale_extends/sale_commission_workflow.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <record id="wkf_commission" model="workflow">
+            <field name="name">sale.commission.basic</field>
+            <field name="osv">sale.commission</field>
+            <field name="on_create">True</field>
+        </record>
+
+        <record id="act_draft" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_commission"/>
+            <field name="flow_start">True</field>
+            <field name="name">draft</field>
+            <field name="action">write({'state':'draft'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="act_done" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_commission"/>
+            <field name="name">done</field>
+            <field name="action">action_set_invoice_commision()</field>
+            <field name="kind">function</field>
+            <field name="flow_stop">True</field>
+        </record>
+
+        <record id="act_confirmed" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_commission"/>
+            <field name="name">confirm</field>
+            <field name="action">write({'state':'confirmed'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="act_cancel" model="workflow.activity">
+            <field name="wkf_id" ref="wkf_commission"/>
+            <field name="name">cancel</field>
+            <field name="action">write({'state':'cancel'})</field>
+            <field name="kind">function</field>
+        </record>
+
+        <record id="t2" model="workflow.transition">
+            <field name="act_from" ref="act_draft"/>
+            <field name="act_to" ref="act_confirmed"/>
+            <field name="signal">commission_approve</field>
+        </record>
+
+        <record id="t7" model="workflow.transition">
+            <field name="act_from" ref="act_confirmed"/>
+            <field name="act_to" ref="act_done"/>
+            <field name="signal">commission_confirm</field>
+        </record>
+
+        <record id="t8" model="workflow.transition">
+            <field name="act_from" ref="act_confirmed"/>
+            <field name="act_to" ref="act_cancel"/>
+            <field name="signal">commission_cancel</field>
+        </record>
+
+        <record id="t9" model="workflow.transition">
+            <field name="act_from" ref="act_cancel"/>
+            <field name="act_to" ref="act_draft"/>
+            <field name="signal">commission_draft</field>
+        </record>
+    </data>
+</openerp>

=== added file 'sale_extends/sale_make_invoice.py'
--- sale_extends/sale_make_invoice.py	1970-01-01 00:00:00 +0000
+++ sale_extends/sale_make_invoice.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,58 @@
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+from tools.translate import _
+import logging
+import netsvc
+
+class sale_make_invoice(osv.osv_memory):
+    _inherit = "sale.make.invoice"
+
+    def make_invoices(self, cr, uid, ids, context=None):
+        logging.getLogger("sale_extends.py").info("ids = %s",ids)
+        order_obj = self.pool.get('sale.order')
+        mod_obj = self.pool.get('ir.model.data')
+        act_obj = self.pool.get('ir.actions.act_window')
+        newinv = []
+        if context is None:
+            context = {}
+        data = self.read(cr, uid, ids)[0]
+        logging.getLogger("sale_extends.py").info("total_freight = %s",data)
+
+        order_obj.action_invoice_create(cr, uid, context.get(('active_ids'), []), data['grouped'], date_inv = data['invoice_date'])
+        wf_service = netsvc.LocalService("workflow")
+        for id in context.get(('active_ids'), []):
+            wf_service.trg_validate(uid, 'sale.order', id, 'manual_invoice', cr)
+
+        for o in order_obj.browse(cr, uid, context.get(('active_ids'), []), context=context):
+            for i in o.invoice_ids:
+                newinv.append(i.id)
+
+        result = mod_obj.get_object_reference(cr, uid, 'account', 'action_invoice_tree1')
+        id = result and result[1] or False
+        result = act_obj.read(cr, uid, [id], context=context)[0]
+        result['domain'] = "[('id','in', ["+','.join(map(str,newinv))+"])]"
+
+        return result
+
+sale_make_invoice()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'sale_extends/sale_view.xml'
--- sale_extends/sale_view.xml	1970-01-01 00:00:00 +0000
+++ sale_extends/sale_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+    <record id="view_sale_order_form_CC" model="ir.ui.view">
+        <field name="name">sale.order.form</field>
+        <field name="model">sale.order</field>
+        <field name="type">form</field>
+        <field name="inherit_id" ref="sale.view_order_form"/>
+        <field name="arch" type="xml">
+            <field name="pricelist_id" position="after">
+                <button name="%(action_sale_change_currency)d" type="action" icon="terp-stock_effects-object-colorize" string="Change" attrs="{'invisible':[('state','!=','draft')]}" groups="account.group_account_user"/>
+            </field>
+            <field name="product_uom_qty" position="replace">
+                <field  context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}" name="product_uom_qty"/>
+            </field>
+            <field name="client_order_ref" position="replace">
+                <field name="client_order_ref" select="1" attrs="{'invisible':[('local','=',False)]}"/>
+                <field name="oc" string="Purchase Order" filename="client_order_ref" attrs="{'invisible':[('local','=',True)]}"/>
+            </field>
+            <field name="user_id" position="replace">
+                <field name="user_id" readonly="1"/>
+                <field name="user_id" groups="base.group_sale_manager"/>
+            </field>
+            <field name="user_id" position="after">
+                <field name="create_user_id"/>
+            </field>
+            <field name="payment_term" position="after">
+                <field name="validez"/>
+                <field name="credit_app"  groups="base.group_sale_manager"/>
+                <field name="local" string='Cliente sin OC'/>
+
+            </field>
+            <xpath expr="/form/notebook/page[@string='Sales Order']/field[@name='order_line']/tree/field[@name='name']" position="after">
+                <field name="part_number" />
+                <field name="delivery_time"/>
+            </xpath>
+            <xpath expr="/form/notebook/page[@string='Sales Order']/field[@name='order_line']/form/notebook/page[@string='Order Line']/group/field[@name='discount']" position="after">
+                <field name="part_number" colspan="3"/>
+                <field name="delivery_time"/>
+            </xpath>
+        </field>
+    </record>
+</data>
+</openerp>

=== added directory 'sale_extends/wizard'
=== added file 'sale_extends/wizard/__init__.py'
--- sale_extends/wizard/__init__.py	1970-01-01 00:00:00 +0000
+++ sale_extends/wizard/__init__.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,1 @@
+import sale_change_currency

=== added file 'sale_extends/wizard/sale_change_currency.py'
--- sale_extends/wizard/sale_change_currency.py	1970-01-01 00:00:00 +0000
+++ sale_extends/wizard/sale_change_currency.py	2013-01-09 17:22:43 +0000
@@ -0,0 +1,83 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import osv, fields
+import logging
+from tools.translate import _
+
+class sale_change_currency(osv.osv_memory):
+    _name = 'sale.change.currency'
+    _columns = {
+       'pricelist_id': fields.many2one('product.pricelist', 'Change to', required=True, help="Seleccione un diario."),
+    }
+
+    def view_init(self, cr , uid , fields_list, context=None):
+        obj_order = self.pool.get('sale.order')
+        if context is None:
+            context = {}
+        if context.get('active_id',False):
+            if obj_order.browse(cr, uid, context['active_id']).state != 'draft':
+                raise osv.except_osv(_('Error'), _('You can only change currency for Draft Invoice !'))
+            pass
+
+    def change_currency(self, cr, uid, ids, context=None):
+
+        for wiz in self.browse(cr, uid, ids, context=context):
+            obj_order = self.pool.get('sale.order')
+            obj_order_line = self.pool.get('sale.order.line')
+            obj_pricelist = self.pool.get('product.pricelist')
+            obj_currency = self.pool.get('res.currency')
+            order = obj_order.browse(cr, uid, context['active_id'], context=context)
+
+
+            data = {}
+            if context is None:
+                context = {}
+            for obj in self.browse(cr, uid, ids, context=context):
+                data = obj
+
+            if data.pricelist_id.currency_id.id:
+                new_currency = data.pricelist_id.currency_id.id
+            else:
+                new_currency = order.company_id.currency_id.id
+
+            new_pricelist = data.pricelist_id
+            old_pricelist = order.pricelist_id
+
+            if order.pricelist_id.currency_id.id == new_currency:
+                return {}
+
+            while order.pricelist_id.currency_id.id != new_currency:
+                order.write({'pricelist_id': new_pricelist.id},context=context)
+                order = obj_order.browse(cr, uid, context['active_id'], context=context)
+
+            rate = obj_currency.browse(cr, uid, new_currency, context=context).rate
+
+            for line in order.order_line:
+
+                new_price = line.price_unit * new_pricelist.currency_id.rate/ old_pricelist.currency_id.rate
+                obj_order_line.write(cr, uid, [line.id], {'price_unit': new_price})
+
+        return {'type': 'ir.actions.act_window_close'}
+
+sale_change_currency()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'sale_extends/wizard/sale_change_currency_view.xml'
--- sale_extends/wizard/sale_change_currency_view.xml	1970-01-01 00:00:00 +0000
+++ sale_extends/wizard/sale_change_currency_view.xml	2013-01-09 17:22:43 +0000
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="view_sale_change_currency" model="ir.ui.view">
+            <field name="name">Change Currency</field>
+            <field name="model">sale.change.currency</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Invoice Currency">
+                    <separator colspan="4" string="This wizard will change the currency of the invoice"/>
+                    <field name="pricelist_id" domain="[('type', '=', 'sale')]" />
+                    <separator colspan="4"/>
+                    <group colspan="2" col="4">
+                        <button special="cancel" string="Cancel"  icon="gtk-cancel"/>
+                        <button name="change_currency" string="Cambiar Divisa" type="object" icon="terp-stock_effects-object-colorize"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+
+        <record id="action_sale_change_currency" model="ir.actions.act_window">
+            <field name="name">Change Currency</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">sale.change.currency</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">form</field>
+            <field name="view_id" ref="view_sale_change_currency"/>
+            <field name="context">{}</field>
+            <field name="target">new</field>
+        </record>
+    </data>
+</openerp>


Follow ups