Mayur Maheshwari(OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-Purchase_wkf-mma into 
lp:openobject-addons.

Requested reviews:
  OpenERP Core Team (openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-Purchase_wkf-mma/+merge/96060

Hello,

I have improved the following things:

Purchase:
1] Add a send Button & state in work flow for send a quotation by e-mail 
2] Improve a label name of state and set button position
3] Removed a print button 
4] Improve in purchase search view: used the same for RfQ and Purchase Orders
5] Added a Receive invoice and Receive products button for open it's related 
view from purchase order

purchase_double_validation:
1] added new xml for search view

purchase_requisition:
1] removed a inherited search view

Thanks.
mma
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-Purchase_wkf-mma/+merge/96060
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-Purchase_wkf-mma.
=== modified file 'purchase/purchase.py'
--- purchase/purchase.py	2012-02-28 14:08:16 +0000
+++ purchase/purchase.py	2012-03-06 05:34:22 +0000
@@ -142,13 +142,14 @@
         return res
 
     STATE_SELECTION = [
-        ('draft', 'Request for Quotation'),
+        ('draft', 'Draft PO'),
         ('wait', 'Waiting'),
+        ('send', 'RFQ Sent'),
         ('confirmed', 'Waiting Approval'),
-        ('approved', 'Approved'),
+        ('approved', 'Purchase Order'),
         ('except_picking', 'Shipping Exception'),
         ('except_invoice', 'Invoice Exception'),
-        ('done', 'Done'),
+        ('done', 'Paid'),
         ('cancel', 'Cancelled')
     ]
 
@@ -179,7 +180,7 @@
         'picking_ids': fields.one2many('stock.picking', 'purchase_id', 'Picking List', readonly=True, help="This is the list of picking list that have been generated for this purchase"),
         'shipped':fields.boolean('Received', readonly=True, select=True, help="It indicates that a picking has been done"),
         'shipped_rate': fields.function(_shipped_rate, string='Received', type='float'),
-        'invoiced': fields.function(_invoiced, string='Invoiced & Paid', type='boolean', help="It indicates that an invoice has been paid"),
+        'invoiced': fields.function(_invoiced, string='Invoice Received', type='boolean', help="It indicates that an invoice has been paid"),
         'invoiced_rate': fields.function(_invoiced_rate, string='Invoiced', type='float'),
         'invoice_method': fields.selection([('manual','Based on Purchase Order lines'),('order','Based on generated draft invoice'),('picking','Based on receptions')], 'Invoicing Control', required=True,
             help="Based on Purchase Order lines: place individual lines in 'Invoice Control > Based on P.O. lines' from where you can selectively create an invoice.\n" \
@@ -273,10 +274,91 @@
         fiscal_position = supplier.property_account_position and supplier.property_account_position.id or False
         return {'value':{'partner_address_id': supplier_address['default'], 'pricelist_id': pricelist, 'fiscal_position': fiscal_position}}
 
+    def view_invoice(self, cr, uid, ids, context=None):
+        mod_obj = self.pool.get('ir.model.data')
+        wizard_obj = self.pool.get('purchase.order.line_invoice')
+        inv_ids = []
+        for po in self.browse(cr, uid, ids, context=context):
+            if po.invoice_method == 'manual':
+                if not po.invoice_ids:
+                    context.update({'active_ids' :  [line.id for line in po.order_line]})
+                    wizard_obj.makeInvoices(cr, uid, [], context=context)
+            
+        for po in self.browse(cr, uid, ids, context=context):
+            inv_ids+= [invoice.id for invoice in po.invoice_ids]
+        res = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_supplier_form')
+        res_id = res and res[1] or False
+
+        return {
+            'name': _('Supplier Invoices'),
+            'view_type': 'form',
+            'view_mode': 'form',
+            'view_id': [res_id],
+            'res_model': 'account.invoice',
+            'context': "{'type':'in_invoice', 'journal_type': 'purchase'}",
+            'type': 'ir.actions.act_window',
+            'nodestroy': True,
+            'target': 'current',
+            'res_id': inv_ids and inv_ids[0] or False,
+        }
+
+    def view_picking(self, cr, uid, ids, context=None):
+        mod_obj = self.pool.get('ir.model.data')
+        pick_ids = []
+        for po in self.browse(cr, uid, ids, context=context):
+            pick_ids += [picking.id for picking in po.picking_ids]
+
+        res = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_in_form')
+        res_id = res and res[1] or False
+
+        return {
+            'name': _('Receptions'),
+            'view_type': 'form',
+            'view_mode': 'form',
+            'view_id': [res_id],
+            'res_model': 'stock.picking',
+            'context': "{'contact_display': 'partner'}",
+            'type': 'ir.actions.act_window',
+            'nodestroy': True,
+            'target': 'current',
+            'res_id': pick_ids and pick_ids[0] or False,
+        }
+
     def wkf_approve_order(self, cr, uid, ids, context=None):
         self.write(cr, uid, ids, {'state': 'approved', 'date_approve': fields.date.context_today(self,cr,uid,context=context)})
         return True
 
+    def _hook_message_sent(self, cr, uid, purchase_id, context=None):
+        wf_service = netsvc.LocalService("workflow")
+        wf_service.trg_validate(uid, 'purchase.order', purchase_id, 'send_rfq', cr)
+        return True
+
+    def wkf_send_rfq(self, cr, uid, ids, context=None):
+        mod_obj = self.pool.get('ir.model.data')
+        template_id = self.pool.get('email.template').search(cr, uid, [('model_id', '=', 'purchase.order')])
+
+        res = mod_obj.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')
+        res_id = res and res[1] or False
+
+        #EDI EXport data
+        id = ids[0]
+        order = self.browse(cr, uid, id, context)
+        #if not order.partner_id.opt_out: 
+            #order.edi_export_and_email(template_ext_id='purchase.email_template_edi_purchase', context=context)
+        ctx = context.copy()
+        ctx.update({'active_model': 'purchase.order', 'active_id': id, 'mail.compose.template_id': template_id})
+        return {
+            'view_type': 'form',
+            'view_mode': 'form',
+            'res_model': 'mail.compose.message',
+            'views': [(res_id,'form')],
+            'view_id': res_id,
+            'type': 'ir.actions.act_window',
+            'target': 'new',
+            'context': ctx,
+            'nodestroy': True,
+        }
+
     #TODO: implement messages system
     def wkf_confirm_order(self, cr, uid, ids, context=None):
         todo = []

=== modified file 'purchase/purchase_view.xml'
--- purchase/purchase_view.xml	2012-02-07 13:17:19 +0000
+++ purchase/purchase_view.xml	2012-03-06 05:34:22 +0000
@@ -194,17 +194,19 @@
                                 <field name="amount_total" sum="Total amount"/>
                                 <button name="button_dummy" states="draft" string="Compute" type="object" icon="gtk-execute"/>
                             </group>
-                            <group col="11" colspan="4">
+                            <group col="16" colspan="4">
                                 <field name="state" widget="statusbar" statusbar_visible="draft,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue","wait":"blue"}' readonly="1"/>
-                                <button name="purchase_cancel" states="draft,confirmed,wait_auth" string="Cancel" icon="gtk-cancel"/>
-                                <button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object" icon="gtk-convert"/>
-                                <button name="action_cancel" states="approved,except_picking,except_invoice,wait" string="Cancel Purchase Order" type="object" icon="gtk-cancel"/>
+                                <button name="wkf_send_rfq" states="draft" string="Send" type="object" icon="terp-mail-message-new"/>
+                                <button name="action_cancel" states="except_picking,except_invoice,wait" string="Cancel" type="object" icon="gtk-cancel"/>
                                 <button name="picking_ok" states="except_picking" string="Manually Corrected" icon="gtk-convert"/>
                                 <button name="invoice_ok" states="except_invoice" string="Manually Corrected" icon="gtk-convert"/>
-                                <button name="purchase_confirm" states="draft" string="Convert to Purchase Order" icon="gtk-go-forward"/>
+                                <button name="purchase_confirm" states="draft,send" string="Confirm Order" icon="gtk-go-forward"/>
                                 <button name="purchase_appbuyer" states="wait_auth" string="Approve Purchase" icon="gtk-ok"/>
-                                <button name="purchase_approve" states="confirmed" string="Approved" icon="gtk-go-forward"/>
-                                <button name="%(report_purchase_order)d" string="Print" states="approved" type="action" icon="gtk-print"/>
+                                <button name="purchase_approve" states="confirmed" string="Approve Order" icon="gtk-go-forward"/>
+                                <button name="view_invoice" string="Receive Invoice" icon="gtk-go-forward" type="object" attrs="{'invisible': ['|', ('invoice_method','=','picking'), '|', ('state','!=', 'approved'), ('invoiced','=',True) ]}"/>
+                                <button name="view_picking" string="Receive Products" icon="gtk-go-forward" type="object" attrs="{'invisible': ['|', ('shipped','=',True), ('state','!=', 'approved')]}"/>
+                                <button name="action_cancel_draft" states="cancel,send,confirmed" string="Set to Draft" type="object" icon="gtk-convert"/>
+                                <button name="purchase_cancel" states="draft,confirmed,wait_auth,send" string="Cancel" icon="gtk-cancel"/>
                             </group>
                         </page>
                         <page string="Delivery &amp; Invoicing" groups="base.group_extended">
@@ -235,40 +237,6 @@
             </field>
         </record>
 
-       <record id="view_request_for_quotation_filter" model="ir.ui.view">
-            <field name="name">request.quotation.select</field>
-            <field name="model">purchase.order</field>
-            <field name="type">search</field>
-            <field name="arch" type="xml">
-                <search string="Search Purchase Order">
-                 <group>
-                    <filter icon="terp-document-new" name="draft" string="Quotations" domain="[('state','=','draft')]"  help="Purchase order which are in draft state"/>
-                    <filter icon="terp-check" name="approved" string="Approved" domain="[('state','in',('approved','done'))]"  help="Approved purchase order"/>
-                    <separator orientation="vertical"/>
-                    <filter icon="terp-emblem-important" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]"  help="Purchase order which are in the exception state"/>
-                    <separator orientation="vertical"/>
-                    <filter icon="terp-gtk-go-back-rtl" name="not_invoiced" string="Not invoiced" domain="[('invoice_ids','=', False)]"  help="Purchase orders that include lines not invoiced." groups="base.group_extended"/>
-                    <separator orientation="vertical"/>
-                    <field name="name" string="Reference"/>
-                    <field name="partner_id"/>
-                    <field name="product_id"/>
-                    <field name="create_uid"/>
-                </group>
-                <newline/>
-                  <group expand="0" string="Group By..." groups="base.group_extended">
-                    <filter string="Supplier" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
-                     <separator orientation="vertical"/>
-                    <filter string="Origin" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'origin'}"/>
-                    <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
-                     <separator orientation="vertical"/>
-                    <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
-                    <filter string="Expected Date" icon="terp-go-month" domain="[]" context="{'group_by':'minimum_planned_date'}"/>
-
-                </group>
-              </search>
-            </field>
-        </record>
-
         <record id="view_purchase_order_filter" model="ir.ui.view">
             <field name="name">purchase.order.list.select</field>
             <field name="model">purchase.order</field>
@@ -277,14 +245,11 @@
                 <search string="Search Purchase Order">
                  <group>
                     <filter icon="terp-document-new" name="draft" string="Quotations" domain="[('state','=','draft')]"  help="Purchase orders which are in draft state"/>
-                    <filter icon="terp-gtk-jump-to-ltr" name="to_approve" string="To Approve" domain="[('state','in',('draft','wait','confirmed'))]" help="Purchase orders which are not approved yet."/>
-                    <filter icon="terp-check" name="approved" string="Approved" domain="[('state','=','approved')]"  help="Approved purchase orders"/>
-                    <filter icon="terp-accessories-archiver+" string="Done" domain="[('state','=','done')]" help="Purchase orders which are in done state."/>
+                    <filter icon="terp-check" name="approved" string="Purchase Orders" domain="[('state','not in',('draft','cancel'))]"  help="Approved purchase orders"/>
                     <separator orientation="vertical"/>
+                    <filter icon="terp-gtk-go-back-rtl" name="not_invoiced" string="Not invoiced" domain="[('invoice_ids','=', False)]"  help="Purchase orders that include lines not invoiced." groups="base.group_extended"/>
                     <filter icon="terp-emblem-important" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]" help="Purchase orders which are in exception state"/>
                     <separator orientation="vertical"/>
-                    <filter icon="terp-gtk-go-back-rtl" name="not_invoiced" string="Not invoiced" domain="[('invoice_ids','=', False)]"  help="Purchase orders that include lines not invoiced." groups="base.group_extended"/>
-                    <separator orientation="vertical"/>
                     <field name="name" string="Reference"/>
                     <field name="partner_id"/>
                     <field name="product_id"/>
@@ -327,12 +292,12 @@
         </record>
 
         <record id="purchase_rfq" model="ir.actions.act_window">
-            <field name="name">Requests for Quotation</field>
+            <field name="name">Quotations</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">purchase.order</field>
             <field name="context">{'search_default_draft': 1}</field>
             <field name="view_mode">tree,form,graph,calendar</field>
-            <field name="search_view_id" ref="view_request_for_quotation_filter"/>
+            <field name="search_view_id" ref="view_purchase_order_filter"/>
             <field name="help">You can create a request for quotation when you want to buy products to a supplier but the purchase is not confirmed yet. Use also this menu to review requests for quotation created automatically based on your logistic rules (minimum stock, MTO, etc). You can convert the request for quotation into a purchase order once the order is confirmed. If you use the extended interface (from user's preferences), you can select the way to control your supplier invoices: based on the order, based on the receptions or manual encoding.</field>
         </record>
         <menuitem action="purchase_rfq" id="menu_purchase_rfq"

=== modified file 'purchase/purchase_workflow.xml'
--- purchase/purchase_workflow.xml	2011-11-09 11:49:08 +0000
+++ purchase/purchase_workflow.xml	2012-03-06 05:34:22 +0000
@@ -13,6 +13,12 @@
             <field name="flow_start">True</field>
             <field name="name">draft</field>
         </record>
+        <record id="act_send" model="workflow.activity">
+            <field name="wkf_id" ref="purchase_order"/>
+            <field name="name">send</field>
+            <field name="kind">function</field>
+            <field name="action">write({'state':'send'})</field>
+        </record>
         <record id="act_confirmed" model="workflow.activity">
             <field name="wkf_id" ref="purchase_order"/>
             <field name="name">confirmed</field>
@@ -90,6 +96,22 @@
             <field name="act_to" ref="act_confirmed"/>
             <field name="signal">purchase_confirm</field>
         </record>
+         <record id="trans_draft_send" model="workflow.transition">
+            <field name="act_from" ref="act_draft"/>
+            <field name="act_to" ref="act_send"/>
+            <field name="signal">send_rfq</field>
+        </record>
+        <record id="trans_send_confirmed" model="workflow.transition">
+            <field name="act_from" ref="act_send"/>
+            <field name="act_to" ref="act_confirmed"/>
+            <field name="signal">purchase_confirm</field>
+        </record>
+        <record id="trans_send_cancel" model="workflow.transition">
+            <field name="act_from" ref="act_send"/>
+            <field name="act_to" ref="act_cancel"/>
+            <field name="signal">purchase_cancel</field>
+        </record>
+        
         <record id="trans_confirmed_cancel" model="workflow.transition">
             <field name="act_from" ref="act_confirmed"/>
             <field name="act_to" ref="act_cancel"/>

=== modified file 'purchase_double_validation/__openerp__.py'
--- purchase_double_validation/__openerp__.py	2012-01-31 13:36:57 +0000
+++ purchase_double_validation/__openerp__.py	2012-03-06 05:34:22 +0000
@@ -39,6 +39,7 @@
     'update_xml': [
         'purchase_double_validation_workflow.xml',
         'purchase_double_validation_installer.xml',
+        'purchase_double_validation_view.xml',
         'board_purchase_view.xml'
     ],
     'test': [

=== added file 'purchase_double_validation/purchase_double_validation_view.xml'
--- purchase_double_validation/purchase_double_validation_view.xml	1970-01-01 00:00:00 +0000
+++ purchase_double_validation/purchase_double_validation_view.xml	2012-03-06 05:34:22 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+     <record model="ir.ui.view" id="purchase_order_search_inherit">
+        <field name="name">purchase.order.list.select.inherit</field>
+        <field name="type">form</field>
+        <field name="model">purchase.order</field>
+        <field name="inherit_id" ref="purchase.view_purchase_order_filter"/>
+        <field name="arch" type="xml">
+            <xpath expr="/search/group/filter[@name='draft']" position="after">
+             <filter icon="terp-gtk-jump-to-ltr" name="to_approve" string="To Approve" domain="[('state','in',('wait','confirmed'))]" help="Purchase orders which are not approved yet."/>
+            </xpath>
+        </field>
+    </record>
+    </data>
+</openerp>

=== modified file 'purchase_requisition/purchase_requisition_view.xml'
--- purchase_requisition/purchase_requisition_view.xml	2011-12-19 16:54:40 +0000
+++ purchase_requisition/purchase_requisition_view.xml	2012-03-06 05:34:22 +0000
@@ -21,20 +21,7 @@
         <field name="model">purchase.order</field>
         <field name="inherit_id" ref="purchase.view_purchase_order_filter"/>
         <field name="arch" type="xml">
-            <xpath expr="/search/group/filter[@name='not_invoiced']" position="after">
-             <separator orientation="vertical"/>
-             <filter icon="terp-gtk-jump-to-rtl" string="Requisition" domain="[('requisition_id','!=',False)]"  help="Purchase Orders with requisition"/>
-            </xpath>
-        </field>
-    </record>
-
-    <record model="ir.ui.view" id="request_for_quotation_inherit">
-        <field name="name">request.for.quotation.select.inherit</field>
-        <field name="type">form</field>
-        <field name="model">purchase.order</field>
-        <field name="inherit_id" ref="purchase.view_request_for_quotation_filter"/>
-        <field name="arch" type="xml">
-            <xpath expr="/search/group/filter[@name='not_invoiced']" position="after">
+            <xpath expr="/search/group/filter[@name='approved']" position="after">
              <separator orientation="vertical"/>
              <filter icon="terp-gtk-jump-to-rtl" string="Requisition" domain="[('requisition_id','!=',False)]"  help="Purchase Orders with requisition"/>
             </xpath>

_______________________________________________
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