Turkesh Patel (openERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-advance_invoice-tpa into 
lp:openobject-addons.

Requested reviews:
  Tejas Tank (OpenERP) (tta-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-advance_invoice-tpa/+merge/105613

Improved Advance Invoice.

Optimized more wizard steps.

Now amount can be set as percentage or fixed rate by selection.

Set value of product named Advance as default value.
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-advance_invoice-tpa/+merge/105613
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-advance_invoice-tpa.
=== modified file 'sale/sale_demo.xml'
--- sale/sale_demo.xml	2012-04-02 05:35:06 +0000
+++ sale/sale_demo.xml	2012-05-14 06:33:20 +0000
@@ -268,6 +268,7 @@
             <field name="supply_method">produce</field>
             <field name="uom_id" ref="product.uom_day"/>
             <field name="uom_po_id" ref="product.uom_day"/>
+            <field name="company_id" eval="[]"/>
         </record>
 
     <record id="base.user_demo" model="res.users">

=== modified file 'sale/wizard/sale_make_invoice_advance.py'
--- sale/wizard/sale_make_invoice_advance.py	2012-04-03 20:57:06 +0000
+++ sale/wizard/sale_make_invoice_advance.py	2012-05-14 06:33:20 +0000
@@ -24,16 +24,55 @@
 class sale_advance_payment_inv(osv.osv_memory):
     _name = "sale.advance.payment.inv"
     _description = "Sales Advance Payment Invoice"
+
+    def _default_product_id(self, cr, uid, context=None):
+        if context is None:
+            context = {}
+        product_id = False
+        data_obj = self.pool.get('ir.model.data')
+        try:
+            product_id = data_obj.get_object_reference(cr, uid, 'sale', 'advance_product_0')[1]
+        finally:
+            return product_id
+
     _columns = {
-        'product_id': fields.many2one('product.product', 'Advance Product', required=True,
+        'product_id': fields.many2one('product.product', 'Advance Product', required=False,
             help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."),
         'amount': fields.float('Advance Amount', digits=(16, 2), required=True, help="The amount to be invoiced in advance."),
         'qtty': fields.float('Quantity', digits=(16, 2), required=True),
+        'pay_type':fields.selection([('percentage','Percentage'), ('fixed','Fixed Price')], 'Pay Type', required=True),
+        'advance': fields.boolean('Advance'),
     }
+
     _defaults = {
-        'qtty': 1.0
+        'qtty': 1.0,
+        'pay_type': 'fixed',
+        'product_id': _default_product_id,
     }
 
+    def onchange_pay_type(self, cr, uid, ids, pay_type,product_id, context=None):
+        if not product_id:
+            return {'value': {'amount': 0}}
+        if pay_type == 'percentage':
+            return {'value': {'amount':0,'product_id':False }}
+        product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+        return {'value': {'amount':product.list_price}}
+
+    def onchange_advance_product(self, cr, uid, ids, product_id, context=None):
+        data_obj = self.pool.get('ir.model.data')
+        value = {}
+        value['advance'] = 'False'
+        if not product_id:
+            return {'value': {'amount': 0,'advance': False}}
+        product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+        value['amount'] = product.list_price
+        try:
+            advance_id = data_obj.get_object_reference(cr, uid, 'sale', 'advance_product_0')[1]
+            if product.id ==  advance_id:
+                value['advance'] = 'True'
+        finally:
+            return {'value': value}
+
     def create_invoices(self, cr, uid, ids, context=None):
         """
              To create invoices.
@@ -66,21 +105,52 @@
                 val = obj_lines.product_id_change(cr, uid, [], sale_adv_obj.product_id.id,
                         uom = False, partner_id = sale.partner_id.id, fposition_id = sale.fiscal_position.id)
                 res = val['value']
+
+                if not sale_adv_obj.product_id.id :
+                    prop = self.pool.get('ir.property').get(cr, uid,
+                                         'property_account_income_categ', 'product.category',
+                                         context=context)
+                    account_id = prop and prop.id or False
+                    account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, sale.fiscal_position.id or False, account_id)
+                    res['account_id'] = account_id
+                    if not res.get('account_id'):
+                        raise osv.except_osv(_('Configuration Error !'),
+                                _('There is no income account defined '))
+
                 if not res.get('account_id'):
                     raise osv.except_osv(_('Configuration Error !'),
                                 _('There is no income account defined ' \
                                         'for this product: "%s" (id:%d)') % \
                                         (sale_adv_obj.product_id.name, sale_adv_obj.product_id.id,))
-                
+
+                final_amount = 0
+                if sale_adv_obj.amount <= 0.00:
+                    raise osv.except_osv(_('Data Insufficient !'),
+                        _('Please check the Advance Amount, it should not be 0 or less!'))
+                else:
+                    if sale_adv_obj.pay_type == 'percentage':
+                        final_amount = sale.amount_total * sale_adv_obj.amount / 100
+                        if not res.get('name'):
+                            res['name'] = "Advance of %s"%(final_amount)
+                    else:
+                        final_amount = sale_adv_obj.amount
+                        if not res.get('name'):
+                            res['name'] = "Advance of %s %s"%(final_amount,sale.pricelist_id.currency_id.symbol)
+
+                if res.get('invoice_line_tax_id'):
+                    res['invoice_line_tax_id'] = [(6, 0, res.get('invoice_line_tax_id'))]
+                else:
+                    res['invoice_line_tax_id'] = False
+
                 line_id = obj_lines.create(cr, uid, {
                     'name': res.get('name'),
                     'account_id': res['account_id'],
-                    'price_unit': sale_adv_obj.amount,
-                    'quantity': sale_adv_obj.qtty,
+                    'price_unit': final_amount,
+                    'quantity': sale_adv_obj.qtty or 1.0,
                     'discount': False,
-                    'uos_id': res.get('uos_id'),
+                    'uos_id': res.get('uos_id') or False,
                     'product_id': sale_adv_obj.product_id.id,
-                    'invoice_line_tax_id': [(6, 0, res.get('invoice_line_tax_id'))],
+                    'invoice_line_tax_id': res.get('invoice_line_tax_id'),
                     'account_analytic_id': sale.project_id.id or False,
                     #'note':'',
                 })
@@ -112,49 +182,29 @@
         # If not, the advance will be deduced when generating the final invoice
         #
                 if sale.order_policy == 'picking':
-                    self.pool.get('sale.order.line').create(cr, uid, {
+                    vals = {
                         'order_id': sale.id,
-                        'name': res.get('name'),
-                        'price_unit': -sale_adv_obj.amount,
-                        'product_uom_qty': sale_adv_obj.qtty,
-                        'product_uos_qty': sale_adv_obj.qtty,
-                        'product_uos': res.get('uos_id'),
-                        'product_uom': res.get('uos_id'),
-                        'product_id': sale_adv_obj.product_id.id,
+                        'name': res.get('name')  or ("%s %s %s "%(sale_adv_obj.amount,sale_adv_obj.pay_type,"Advance.")),
+                        'price_unit': -final_amount,
+                        'product_uom_qty': sale_adv_obj.qtty or 1.0,
+                        'product_uos_qty': sale_adv_obj.qtty or 1.0,
+                        'product_uos': res.get('uos_id') or False,
+                        'product_id': sale_adv_obj.product_id.id or False,
                         'discount': False,
-                        'tax_id': [(6, 0, res.get('invoice_line_tax_id'))],
-                    }, context)
+                        'tax_id': res.get('invoice_line_tax_id'),
+                    }
+                    if res.get('uos_id'):
+                        vals.update({'product_uom': res.get('uos_id')})
+                    self.pool.get('sale.order.line').create(cr, uid, vals, context)
 
         context.update({'invoice_id':list_inv})
 
-        return {
-            'name': 'Open Invoice',
-            'view_type': 'form',
-            'view_mode': 'form',
-            'res_model': 'sale.open.invoice',
-            'type': 'ir.actions.act_window',
-            'target': 'new',
-            'context': context
-        }
-
-sale_advance_payment_inv()
-
-class sale_open_invoice(osv.osv_memory):
-    _name = "sale.open.invoice"
-    _description = "Sales Open Invoice"
-
-    def open_invoice(self, cr, uid, ids, context=None):
-
-        """
-             To open invoice.
-             @param self: The object pointer.
-             @param cr: A database cursor
-             @param uid: ID of the user currently logged in
-             @param ids: the ID or list of IDs if we want more than one
-             @param context: A standard dictionary
-             @return:
-
-        """
+        if context.get('open_invoices'):
+            return self.open_invoices( cr, uid, ids, context=context)
+        else:
+            return {'type': 'ir.actions.act_window_close'}
+
+    def open_invoices(self, cr, uid, ids, context=None):
         if context is None:
             context = {}
         mod_obj = self.pool.get('ir.model.data')
@@ -176,6 +226,6 @@
             'type': 'ir.actions.act_window',
          }
 
-sale_open_invoice()
+sale_advance_payment_inv()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== modified file 'sale/wizard/sale_make_invoice_advance.xml'
--- sale/wizard/sale_make_invoice_advance.xml	2011-01-14 00:11:01 +0000
+++ sale/wizard/sale_make_invoice_advance.xml	2012-05-14 06:33:20 +0000
@@ -7,15 +7,24 @@
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <form string="Advance Invoice">
-                    <field name="product_id"/>
+                    <group colspan="2">
+                        <field name="product_id" on_change="onchange_advance_product(product_id)" context="{'search_default_services':1}" attrs="{'invisible': [('pay_type','=','percentage')]}" />
+                    </group>
                     <newline />
-                    <field name="qtty" invisible="1"/>
-                    <field name="amount"/>
+                    <group colspan="2" col="6">
+                        <field name="qtty" invisible="1"/>
+                        <field name="amount"/>
+                        <field name="pay_type" nolabel="1" attrs="{'readonly':[('advance','=','True')]}" on_change="onchange_pay_type(pay_type,product_id)"/>
+                        <field name="advance" invisible="1"/>
+                    </group>
                     <newline />
                     <separator string="" colspan="4"/>
-                    <label string=""  colspan="2" />
-                    <button special="cancel" string="Cancel" icon="gtk-cancel"/>
-                    <button name="create_invoices" string="Create Invoice" type="object" icon="gtk-go-forward"/>
+                    <label string="" colspan="6" />
+                    <group colspan="4">
+                        <button special="cancel" string="Cancel" icon="gtk-cancel"/>
+                        <button name="create_invoices" string="Create Invoice" type="object" icon="gtk-go-forward" context="{'open_invoices': False}"/>
+                        <button name="create_invoices" string="Create and view Invoice" type="object" icon="terp-camera_test" context="{'open_invoices': True}" />
+                    </group>
                 </form>
             </field>
         </record>
@@ -28,31 +37,5 @@
             <field name="view_mode">form</field>
             <field name="target">new</field>
         </record>
-
-        <record id="view_sale_open_invoice" model="ir.ui.view">
-            <field name="name">Open Invoice</field>
-            <field name="model">sale.open.invoice</field>
-            <field name="type">form</field>
-            <field name="arch" type="xml">
-                <form string="Invoices">
-                    <label string="You invoice has been successfully created!" />
-                    <newline />
-                    <separator string="" colspan="4"/>
-                    <group colspan="4">
-                        <button special="cancel" string="Close" icon="gtk-cancel"/>
-                        <button name="open_invoice" string="Open Invoice" type="object" icon="gtk-go-forward"/>
-                    </group>
-                 </form>
-            </field>
-        </record>
-
-        <record id="action_view_sale_open_invoice" model="ir.actions.act_window">
-            <field name="name">Open Invoice</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">sale.open.invoice</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">form</field>
-            <field name="target">new</field>
-        </record>
     </data>
 </openerp>

=== modified file 'sale_analytic_plans/sale_analytic_plans_view.xml'
--- sale_analytic_plans/sale_analytic_plans_view.xml	2011-03-08 05:46:26 +0000
+++ sale_analytic_plans/sale_analytic_plans_view.xml	2012-05-14 06:33:20 +0000
@@ -18,7 +18,7 @@
         <field name="type">form</field>
         <field name="inherit_id" ref="sale.view_order_form"/>
         <field name="arch" type="xml">
-           <xpath expr="/form/notebook/page/field[@name='order_line']/form/notebook/page/field[@name='delay']" position="after">
+           <xpath expr="/form/sheet/notebook/page/field[@name='order_line']/form/notebook/page/field[@name='delay']" position="after">
                <field name="analytics_id" domain="[('plan_id','&lt;&gt;',False)]" groups="analytic.group_analytic_accounting"/>
            </xpath>
         </field>

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to