Ravi Gadhia (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-social-rga into 
lp:~openerp-dev/openobject-addons/trunk-social-jra.

Requested reviews:
  OpenERP R&D Team (openerp-dev)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-social-rga/+merge/96094
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-social-rga/+merge/96094
Your team OpenERP R&D Team is requested to review the proposed merge of 
lp:~openerp-dev/openobject-addons/trunk-social-rga into 
lp:~openerp-dev/openobject-addons/trunk-social-jra.
=== modified file 'mail/mail_message.py'
--- mail/mail_message.py	2012-03-06 11:05:24 +0000
+++ mail/mail_message.py	2012-03-06 11:08:23 +0000
@@ -110,7 +110,7 @@
     _name = 'mail.message'
     _inherit = 'mail.message.common'
     _description = 'Generic Message (Email, Comment, Notification)'
-    _order = 'date desc'
+    _order = 'id desc, date desc'
 
     # XXX to review - how to determine action to use?
     def open_document(self, cr, uid, ids, context=None):

=== modified file 'purchase/purchase.py'
--- purchase/purchase.py	2012-02-22 16:48:15 +0000
+++ purchase/purchase.py	2012-03-06 11:08:23 +0000
@@ -223,9 +223,16 @@
         ('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
     ]
     _name = "purchase.order"
+    _inherit = "mail.thread"
     _description = "Purchase Order"
     _order = "name desc"
-
+    
+    def create(self, cr, uid, vals, context=None):
+        order =  super(purchase_order, self).create(cr, uid, vals, context=context)
+        if order:
+            self.create_notificate(cr, uid, [order], context=context)
+        return order
+    
     def unlink(self, cr, uid, ids, context=None):
         purchase_orders = self.read(cr, uid, ids, ['state'], context=context)
         unlink_ids = []
@@ -292,6 +299,7 @@
         self.pool.get('purchase.order.line').action_confirm(cr, uid, todo, context)
         for id in ids:
             self.write(cr, uid, [id], {'state' : 'confirmed', 'validator' : uid})
+        self.confirm_notificate(cr, uid, ids, context)
         return True
 
     def _prepare_inv_line(self, cr, uid, account_id, order_line, context=None):
@@ -393,8 +401,15 @@
             # Link this new invoice to related purchase order
             order.write({'invoice_ids': [(4, inv_id)]}, context=context)
             res = inv_id
+        if res:
+            self.invoice_notificate(cr, uid, ids, res, context)
         return res
-
+    
+    def invoice_done(self, cr, uid, ids, context=None):
+        self.write(cr, uid, ids, {'state':'approved'}, context=context)
+        self.invoice_paid_notificate(cr, uid, ids, context=context)
+        return True
+        
     def has_stockable_product(self,cr, uid, ids, *args):
         for order in self.browse(cr, uid, ids):
             for order_line in order.order_line:
@@ -497,7 +512,7 @@
         stock_move.force_assign(cr, uid, todo_moves)
         wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
         return [picking_id]
-
+    
     def action_picking_create(self,cr, uid, ids, context=None):
         picking_ids = []
         for order in self.browse(cr, uid, ids):
@@ -507,8 +522,15 @@
         # In case of multiple (split) pickings, we should return the ID of the critical one, i.e. the
         # one that should trigger the advancement of the purchase workflow.
         # By default we will consider the first one as most important, but this behavior can be overridden.
+        if picking_ids:
+            self.shipment_notificate(cr, uid, ids, picking_ids[0], context=context)
         return picking_ids[0] if picking_ids else False
 
+    def picking_done(self, cr, uid, ids, context=None):
+        self.write(cr, uid, ids, {'shipped':1,'state':'approved'}, context=context)
+        self.shipment_done_notificate(cr, uid, ids, context=context)
+        return True
+
     def copy(self, cr, uid, id, default=None, context=None):
         if not default:
             default = {}
@@ -633,6 +655,55 @@
                 wf_service.trg_redirect(uid, 'purchase.order', old_id, neworder_id, cr)
                 wf_service.trg_validate(uid, 'purchase.order', old_id, 'purchase_cancel', cr)
         return orders_info
+        
+    # -----------------------------
+    # OpenChatter and notifications
+    # -----------------------------
+    def create_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Request for quotation <b>created</b>."""),
+                        type='notification', context=context)
+
+    def confirm_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_subscribe(cr, uid, ids, [obj.validator.id], context=context)
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Quotation <em>%s</em> <b>converted</b> to a Purchase Order of  %s %s.""")
+                    % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol), type='notification', context=context)
+    
+    def shipment_notificate(self, cr, uid, ids, picking_id, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        for picking in (pck for pck in order.picking_ids if pck.id == picking_id):
+            pck_date =  datetime.strptime(picking.min_date, '%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y')
+            self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Shipment <em>%s</em> <b>scheduled</b> for %s.""")
+                    % (picking.name, pck_date), type='notification', context=context)
+    
+    def invoice_notificate(self, cr, uid, ids, invoice_id, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id):
+            self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Draft Invoice of %s %s <b>waiting for validation</b>.""")
+                    % (invoice.amount_total, invoice.currency_id.symbol), type='notification', context=context)
+    
+    def shipment_done_notificate(self, cr, uid, ids, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Shipment <b>Received</b>.""")
+                     ,type='notification', context=context)
+     
+    def invoice_paid_notificate(self, cr, uid, ids, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Invoice <b>paid</b>.""")
+                     ,type='notification', context=context)
+    
+    def cancel_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Purchase Order for <em>%s</em> <b>cancelled</b>.""")
+                    % (obj.partner_id.name), type='notification', context=context)
 
 purchase_order()
 

=== modified file 'purchase/purchase_view.xml'
--- purchase/purchase_view.xml	2012-02-07 13:17:19 +0000
+++ purchase/purchase_view.xml	2012-03-06 11:08:23 +0000
@@ -231,6 +231,7 @@
                             <field colspan="4" name="notes" nolabel="1"/>
                         </page>
                     </notebook>
+                   <field name="message_ids_social" colspan="4" widget="ThreadView" nolabel="1"/>
                 </form>
             </field>
         </record>

=== modified file 'purchase/purchase_workflow.xml'
--- purchase/purchase_workflow.xml	2011-11-09 11:49:08 +0000
+++ purchase/purchase_workflow.xml	2012-03-06 11:08:23 +0000
@@ -55,7 +55,7 @@
         <record id="act_invoice_done" model="workflow.activity">
             <field name="wkf_id" ref="purchase_order"/>
             <field name="name">invoice_done</field>
-            <field name="action">write({'state':'approved'})</field>
+            <field name="action">invoice_done()</field>
             <field name="kind">function</field>
         </record>
         <record id="act_invoice_end" model="workflow.activity">
@@ -72,7 +72,7 @@
         <record id="act_picking_done" model="workflow.activity">
             <field name="wkf_id" ref="purchase_order"/>
             <field name="name">picking_done</field>
-            <field name="action">write({'shipped':1,'state':'approved'})</field>
+            <field name="action">picking_done()</field>
             <field name="kind">function</field>
             <field name="signal_send">subflow.delivery_done</field>
         </record>

=== modified file 'sale/sale.py'
--- sale/sale.py	2012-02-16 16:52:53 +0000
+++ sale/sale.py	2012-03-06 11:08:23 +0000
@@ -48,7 +48,9 @@
 
 class sale_order(osv.osv):
     _name = "sale.order"
+    _inherit = 'mail.thread'
     _description = "Sales Order"
+    
 
     def copy(self, cr, uid, id, default=None, context=None):
         if not default:
@@ -321,9 +323,6 @@
             # Deleting the existing instance of workflow for SO
             wf_service.trg_delete(uid, 'sale.order', inv_id, cr)
             wf_service.trg_create(uid, 'sale.order', inv_id, cr)
-        for (id,name) in self.name_get(cr, uid, ids):
-            message = _("The sales order '%s' has been set in draft state.") %(name,)
-            self.log(cr, uid, id, message)
         return True
 
     def onchange_pricelist_id(self, cr, uid, ids, pricelist_id, order_lines, context={}):
@@ -391,7 +390,10 @@
                 vals.update({'invoice_quantity': 'order'})
             if vals['order_policy'] == 'picking':
                 vals.update({'invoice_quantity': 'procurement'})
-        return super(sale_order, self).create(cr, uid, vals, context=context)
+        order =  super(sale_order, self).create(cr, uid, vals, context=context)
+        if order:
+            self.create_notificate(cr, uid, [order], context=context)
+        return order
 
     def button_dummy(self, cr, uid, ids, context=None):
         return True
@@ -487,7 +489,6 @@
 
         res = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_form')
         res_id = res and res[1] or False,
-
         return {
             'name': _('Customer Invoices'),
             'view_type': 'form',
@@ -556,6 +557,8 @@
                     if order.order_policy == 'picking':
                         picking_obj.write(cr, uid, map(lambda x: x.id, order.picking_ids), {'invoice_state': 'invoiced'})
                     cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%s,%s)', (order.id, res))
+        if res:
+            self.invoice_notificate(cr, uid, ids, res, context)
         return res
 
     def action_invoice_cancel(self, cr, uid, ids, context=None):
@@ -607,6 +610,7 @@
             #
             if order.state == 'invoice_except':
                 self.write(cr, uid, [order.id], {'state': 'progress'}, context=context)
+        self.invoice_paid_notificate(cr, uid, ids, context=None)
         return True
 
     def action_cancel(self, cr, uid, ids, context=None):
@@ -640,8 +644,7 @@
                     wf_service.trg_validate(uid, 'account.invoice', inv, 'invoice_cancel', cr)
             sale_order_line_obj.write(cr, uid, [l.id for l in  sale.order_line],
                     {'state': 'cancel'})
-            message = _("The sales order '%s' has been cancelled.") % (sale.name,)
-            self.log(cr, uid, sale.id, message)
+            self.cancel_notificate(cr, uid, [sale.id], context=None)
         self.write(cr, uid, ids, {'state': 'cancel'})
         return True
 
@@ -654,8 +657,7 @@
             else:
                 self.write(cr, uid, [o.id], {'state': 'progress', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)})
             self.pool.get('sale.order.line').button_confirm(cr, uid, [x.id for x in o.order_line])
-            message = _("The quotation '%s' has been converted to a sales order.") % (o.name,)
-            self.log(cr, uid, o.id, message)
+            self.confirm_notificate(cr, uid, ids, context)
         return True
 
     def procurement_lines_get(self, cr, uid, ids, *args):
@@ -840,6 +842,8 @@
         wf_service = netsvc.LocalService("workflow")
         if picking_id:
             wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
+            self.delivery_notificate(cr, uid, [order.id], picking_id, context)
+
 
         for proc_id in proc_ids:
             wf_service.trg_validate(uid, 'procurement.order', proc_id, 'button_confirm', cr)
@@ -878,7 +882,9 @@
                     towrite.append(line.id)
                 if towrite:
                     self.pool.get('sale.order.line').write(cr, uid, towrite, {'state': 'done'}, context=context)
-            self.write(cr, uid, [order.id], val)
+            res = self.write(cr, uid, [order.id], val)
+            if res:
+                self.delivery_end_notificate(cr, uid, [order.id], context=context)
         return True
 
     def _log_event(self, cr, uid, ids, factor=0.7, name='Open Order'):
@@ -910,6 +916,57 @@
                 if order_line.product_id and order_line.product_id.product_tmpl_id.type in ('product', 'consu'):
                     return True
         return False
+    
+    # -----------------------------
+    # OpenChatter and notifications
+    # -----------------------------
+    def create_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_subscribe(cr, uid, ids, [obj.user_id.id], context=context)
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Quotation for <em>%s</em> <b>Created</b>.""")
+                    % (obj.partner_id.name), type='notification', context=context)
+    
+    def confirm_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Quotation <em>%s</em> <b>converted</b> to a Sale Order of  %s %s.""")
+                    % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol ), type='notification', need_action_user_id = obj.user_id.id, context=context)
+    
+    def cancel_notificate(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Sale Order for <em>%s</em> <b>cancelled</b>.""")
+                    % (obj.partner_id.name), type='notification', context=context)
+    
+    def delivery_notificate(self, cr, uid, ids, picking_id, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        for picking in (pck for pck in order.picking_ids if pck.id == picking_id):
+            pck_date =  datetime.strptime(picking.min_date, '%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y')
+            self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Delivery Order(%s) <b>scheduled</b> for  %s.""")
+                    % (picking.name, pck_date), type='notification', context=context)
+    
+    def delivery_end_notificate(self, cr, uid, ids, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Order <b>delivered</b>.""")
+                     ,type='notification', context=context)
+     
+    def invoice_paid_notificate(self, cr, uid, ids, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Invoice <b>paid</b>.""")
+                     ,type='notification', context=context)
+        
+    def invoice_notificate(self, cr, uid, ids, invoice_id, context=None):
+        order = self.browse(cr, uid, ids, context=context)[0]
+        for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id):
+            self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Draft Invoice of %s %s <b>waiting for validation</b>.""")
+                    % (invoice.amount_total, invoice.currency_id.symbol), type='notification', context=context)
+        
+        
 sale_order()
 
 # TODO add a field price_unit_uos

=== modified file 'sale/sale_view.xml'
--- sale/sale_view.xml	2012-01-31 13:36:57 +0000
+++ sale/sale_view.xml	2012-03-06 11:08:23 +0000
@@ -235,11 +235,6 @@
                                 <field name="fiscal_position" widget="selection"/>
                                 <field name="company_id" widget="selection" groups="base.group_multi_company"/>
                             </group>
-                            <group colspan="2" col="2" groups="base.group_extended">
-                                <separator string="Dates" colspan="2"/>
-                                <field name="create_date"/>
-                                <field name="date_confirm"/>
-                            </group>
                             <separator colspan="4" string="Notes"/>
                             <field colspan="4" name="note" nolabel="1"/>
                         </page>
@@ -250,6 +245,7 @@
                             <field colspan="4" name="picking_ids" nolabel="1"/>
                         </page>
                     </notebook>
+                <field name="message_ids_social" colspan="4" widget="ThreadView" nolabel="1"/>
                 </form>
             </field>
         </record>

=== modified file 'stock/stock.py'
--- stock/stock.py	2012-02-15 18:00:28 +0000
+++ stock/stock.py	2012-03-06 11:08:23 +0000
@@ -536,6 +536,7 @@
 #----------------------------------------------------------
 class stock_picking(osv.osv):
     _name = "stock.picking"
+    _inherit = 'mail.thread'
     _description = "Picking List"
 
     def _set_maximum_date(self, cr, uid, ids, name, value, arg, context=None):
@@ -610,6 +611,8 @@
             seq_obj_name =  'stock.picking.' + vals['type']
             vals['name'] = self.pool.get('ir.sequence').get(cr, user, seq_obj_name)
         new_id = super(stock_picking, self).create(cr, user, vals, context)
+        if new_id:
+            self.create_notificate(cr, user, [new_id], context=context)
         return new_id
 
     _columns = {
@@ -723,7 +726,6 @@
                 if r.state == 'draft':
                     todo.append(r.id)
 
-        self.log_picking(cr, uid, ids, context=context)
 
         todo = self.action_explode(cr, uid, todo, context)
         if len(todo):
@@ -796,7 +798,6 @@
         @return: True
         """
         self.write(cr, uid, ids, {'state': 'assigned'})
-        self.log_picking(cr, uid, ids, context=context)
         return True
 
     def test_finished(self, cr, uid, ids):
@@ -837,7 +838,6 @@
             ids2 = [move.id for move in pick.move_lines]
             self.pool.get('stock.move').action_cancel(cr, uid, ids2, context)
         self.write(cr, uid, ids, {'state': 'cancel', 'invoice_state': 'none'})
-        self.log_picking(cr, uid, ids, context=context)
         return True
 
     #
@@ -1310,14 +1310,18 @@
                 wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_done', cr)
                 wf_service.trg_write(uid, 'stock.picking', pick.id, cr)
                 delivered_pack_id = new_picking
+                move_lines = self.browse(cr, uid, delivered_pack_id, context=context).move_lines
+                for move in move_lines:
+                    self.receive_notificate(cr, uid, ids, move.product_qty, move.product_id.name, context)
             else:
                 self.action_move(cr, uid, [pick.id])
                 wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_done', cr)
                 delivered_pack_id = pick.id
+                self.ship_done_notificate(cr, uid, ids, context)
 
             delivered_pack = self.browse(cr, uid, delivered_pack_id, context=context)
             res[pick.id] = {'delivered_picking': delivered_pack.id or False}
-
+            
         return res
 
     def log_picking(self, cr, uid, ids, context=None):
@@ -1358,8 +1362,33 @@
             res = data_obj.get_object_reference(cr, uid, 'stock', view_list.get(pick.type, 'view_picking_form'))
             context.update({'view_id': res and res[1] or False})
             message += state_list[pick.state]
-            self.log(cr, uid, pick.id, message, context=context)
         return True
+    
+    
+    # -----------------------------
+    # OpenChatter and notifications
+    # -----------------------------
+    def create_notificate(self, cr, uid, ids, context=None):
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Shipment <b>Created</b>."""),
+                      type='notification', context=context)
+    
+    def scrap_notificate(self, cr, uid, ids, quantity, name, context=None):
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""%s  %s <b>moved to</b> scrap.""")
+                    % (quantity, name), type='notification', context=context)
+    
+    def receive_notificate(self, cr, uid, ids, quantity, name, context=None):
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""%s  %s <b>Received</b>.""")
+                    % (quantity, name), type='notification', context=context)
+    
+    
+    def ship_done_notificate(self, cr, uid, ids, context=None):
+        self.message_append_note(cr, uid, ids, _('System notification'),
+                    _("""Product <b>Received</b>.""")
+                     ,type='notification', context=context)
+        
 
 stock_picking()
 
@@ -2361,7 +2390,7 @@
             res += [new_move]
             product_obj = self.pool.get('product.product')
             for (id, name) in product_obj.name_get(cr, uid, [move.product_id.id]):
-                self.log(cr, uid, move.id, "%s x %s %s" % (quantity, name, _("were scrapped")))
+                move.picking_id.scrap_notificate(quantity, name)
 
         self.action_done(cr, uid, res, context=context)
         return res
@@ -2483,11 +2512,6 @@
                 }
                 self.write(cr, uid, [move.id], update_val)
 
-            product_obj = self.pool.get('product.product')
-            for new_move in self.browse(cr, uid, res, context=context):
-                for (id, name) in product_obj.name_get(cr, uid, [new_move.product_id.id]):
-                    message = _("Product  '%s' is consumed with '%s' quantity.") %(name, new_move.product_qty)
-                    self.log(cr, uid, new_move.id, message)
         self.action_done(cr, uid, res, context=context)
 
         return res
@@ -2697,8 +2721,6 @@
                             'location_dest_id': location_id,
                         })
                     move_ids.append(self._inventory_line_hook(cr, uid, line, value))
-            message = _("Inventory '%s' is done.") %(inv.name)
-            self.log(cr, uid, inv.id, message)
             self.write(cr, uid, [inv.id], {'state': 'confirm', 'move_ids': [(6, 0, move_ids)]})
             self.pool.get('stock.move').action_confirm(cr, uid, move_ids, context=context)
         return True

=== modified file 'stock/stock_view.xml'
--- stock/stock_view.xml	2012-01-31 13:36:57 +0000
+++ stock/stock_view.xml	2012-03-06 11:08:23 +0000
@@ -1227,6 +1227,7 @@
                             <field colspan="4" name="note" nolabel="1"/>
                         </page>
                     </notebook>
+                    <field name="message_ids_social" colspan="4" widget="ThreadView" nolabel="1"/>
                 </form>
             </field>
         </record>

_______________________________________________
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