[IMP] point_of_sales: Add the POS Session
authorStephane Wirtel <stw@openerp.com>
Tue, 10 Apr 2012 11:24:29 +0000 (13:24 +0200)
committerStephane Wirtel <stw@openerp.com>
Tue, 10 Apr 2012 11:24:29 +0000 (13:24 +0200)
bzr revid: stw@openerp.com-20120410112429-dckcpq3hfemlnr5n

addons/account/account_view.xml
addons/point_of_sale/point_of_sale.py
addons/point_of_sale/point_of_sale_sequence.xml
addons/point_of_sale/point_of_sale_view.xml
addons/point_of_sale/point_of_sale_workflow.xml
addons/point_of_sale/wizard/pos_box_entries.py
addons/point_of_sale/wizard/pos_box_entries.xml
addons/point_of_sale/wizard/pos_box_out.py
addons/point_of_sale/wizard/pos_box_out.xml

index 66e5201..cd3bda4 100644 (file)
@@ -2617,7 +2617,7 @@ action = pool.get('res.config').next(cr, uid, [], context)
                     <group col="6" colspan="4">
                         <field name="name" select="1"/>
                         <field name='company_id' widget="selection" groups="base.group_multi_company" />
-                        <field name="journal_id" on_change="onchange_journal_id(journal_id)" select="1" widget="selection"/>
+                        <field name="journal_id" on_change="onchange_journal_id(journal_id)" select="1" widget="selection" domain="[('type', '=', 'cash')]"/>
                         <field name="user_id" select="1" readonly="1"/>
                         <field name="period_id" select="1"/>
                         <field name="currency" invisible="1"/>
index 012de38..10b51a2 100644 (file)
@@ -61,6 +61,9 @@ class pos_config(osv.osv):
 
         'state' : fields.selection(POS_CONFIG_STATE, 'State', required=True, readonly=True),
 
+        #'sequence_id' : fields.many2one('ir.sequence', 'Sequence'),
+        # Add a sequence when we create a new pos.config object
+
     }
 
     _defaults = {
@@ -84,10 +87,45 @@ pos_config()
 class pos_session(osv.osv):
     _name = 'pos.session'
 
+    POS_SESSION_STATE = [('new', 'New'),('opened', 'Opened'),('closed', 'Closed'),('posted', 'Posted')]
+
     _columns = {
-        'config_id' : fields.many2one('pos.config', 'Configuration', required=True, select=1),
+        'config_id' : fields.many2one('pos.config', 'PoS', required=True, select=1),
+
+        'name' : fields.char('Session Sequence', size=32, required=True, select=1, readonly=1),
+        'user_id' : fields.many2one('res.users', 'User', required=True, select=1),
+        'start_at' : fields.datetime('Opening Date'), #, readonly=True),
+        'stop_at' : fields.datetime('Closing Date'),
+
+        'state' : fields.selection(POS_SESSION_STATE, 'State', required=True, readonly=True, select=1),
+    }
+
+    _defaults = {
+        'name' : '/',
+        'user_id' : lambda obj, cr, uid, context: uid,
+        'state' : 'new',
     }
 
+    def create(self, cr, uid, values, context=None):
+        if values.pop('name', '/') == '/':
+            values['name'] = self.pool.get('ir.sequence').get(cr, uid, 'pos.session')
+
+        return super(pos_session, self).create(cr, uid, values, context=context)
+
+    def wkf_action_open(self, cr, uid, ids, context=None):
+        # si pas de date start_at, je balance une date, sinon on utilise celle de l'utilisateur
+        values = {
+            #'start_at' : time.strftime('%Y-%m-%d %H:%M:%S'),
+            'state' : 'opened',
+        }
+        return self.write(cr, uid, ids, values, context=context)
+
+    def wkf_action_close(self, cr, uid, ids, context=None):
+        return self.write(cr, uid, ids, {'state' : 'close'}, context=context)
+
+    def wkf_action_post(self, cr, uid, ids, context=None):
+        return self.write(cr, uid, ids, {'state' : 'post'}, context=context)
+
 pos_session()
 
 class pos_config_journal(osv.osv):
@@ -204,6 +242,8 @@ class pos_order(osv.osv):
         'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, states={'draft': [('readonly', False)]}, readonly=True),
         'partner_id': fields.many2one('res.partner', 'Customer', change_default=True, select=1, states={'draft': [('readonly', False)], 'paid': [('readonly', False)]}),
 
+        'session_id' : fields.many2one('pos.session', 'Session', required=True, select=1),
+
         'state': fields.selection([('draft', 'New'),
                                    ('cancel', 'Cancelled'),
                                    ('paid', 'Paid'),
index bf83fe1..4bcab24 100644 (file)
         <field name="padding">4</field>
     </record>
 
+    <record model="ir.sequence.type" id="seq_type_pos_session">
+        <field name="name">POS Session</field>
+        <field name="code">pos.session</field>
+    </record>
+
+    <record model="ir.sequence" id="seq_pos_session">
+        <field name="name">POS Session</field>
+        <field name="code">pos.session</field>
+        <field name="prefix">POS/%(day)s/(month)s/%(year)s/</field>
+        <field name="padding">4</field>
+    </record>
+
 </data>
 </openerp>
index 4e1fcc7..1896622 100644 (file)
                             <field name="journal_id" widget="selection" />
 
                             <separator string="Cash Differences" colspan="4" />
-                            <field name="profit_account_id" widget="selection" />
-                            <field name="loss_account_id" widget="selection" />
+                            <field name="profit_account_id" />
+                            <field name="loss_account_id" />
                             <field name="authorized_cashbox_diff" />
                             <field name="authorized_cashbox_diff_fixed" />
 
                     </notebook>
 
                     <group colspan="4" col="6">
-                        <field name="state" />
+                        <field name="state" widget="statusbar" statusbar_visible="draft,active,inactive,deprecated" statusbar_colors='{"active":"green", "deprecated" : "red"}'/>
                         <button string="Set to Draft" name="set_draft" type="object" states="deprecated"/>
                         <button string="Set to Active" name="set_active" type="object" states="draft,inactive"/>
                         <button string="Set to Inactive" name="set_inactive" type="object" states="active" />
             </field>
         </record>
 
+        <act_window 
+            id="act_pos_config_sessions" 
+            name="Sessions"
+            src_model="pos.config"
+            res_model="pos.session"
+            domain="[('config_id', '=', active_id)]" />         
+
         <record model="ir.actions.act_window" id="action_pos_config_pos">
             <field name="name">Point of Sales</field>
             <field name="type">ir.actions.act_window</field>
             groups="group_pos_manager"/>
 
 
+        <record model="ir.ui.view" id="view_pos_session_form">
+            <field name="name">pos.session.form.view</field>
+            <field name="model">pos.session</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="PoS Session">
+                    <group colspan="4" col="6">
+                        <field name="config_id" />
+                        <field name="name" />
+                        <field name="user_id" />
+                        <field name="start_at" />
+                        <field name="stop_at" />
+                    </group>
+                    <notebook colspan="4">
+                        <page string="Cash">
+                        </page>
+                        <page string="Others">
+                        </page>
+                        <page string="Nothing">
+                        </page>
+                    </notebook>
+
+                    <group colspan="4" col="2">
+                        <field name="state" widget="statusbar" statusbar_visible="new,opened,closed,posted" statusbar_colors='{"posted":"green"}'/>
+                        <button name="open" type="workflow" string="Open" states="new" />
+                        <button name="close" type="workflow" string="Close" states="opened" />
+                        <button name="post" type="workflow" string="Post" states="closed" />
+                    </group>
+                </form>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_pos_session_tree">
+            <field name="name">pos.session.tree.view</field>
+            <field name="model">pos.session</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="PoS Session">
+                    <field name="config_id" />
+                    <field name="name" />
+                    <field name="user_id" />
+                    <field name="start_at" />
+                    <field name="stop_at" />
+                </tree>
+            </field>
+        </record>
+
+        <act_window 
+            id="act_pos_session_orders" 
+            name="Orders"
+            src_model="pos.session"
+            res_model="pos.order"
+            domain="[('session_id', '=', active_id)]" />         
+
+
+        <record id="view_pos_order_filter" model="ir.ui.view">
+            <field name="name">pos.order.list.select</field>
+            <field name="model">pos.order</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Search Sales Order">
+                    <filter icon="terp-document-new" string="New" domain="[('state','=','draft')]"/>
+                    <filter icon="gtk-apply" string="Done" domain="[('state','in',('paid','invoiced','done'))]"/>
+                    <separator orientation="vertical"/>
+                    <filter icon="terp-check" string="Invoiced" domain="[('state','=','invoiced')]"/>
+                    <filter icon="gtk-convert" string="Posted" domain="[('state','=','done')]"/>
+                    <separator orientation="vertical"/>
+                    <filter icon="terp-go-month" string="Today" domain="[('date_order','&gt;=',datetime.date.today().strftime('%%Y-%%m-%%d 00:00:00')),('date_order','&lt;=',datetime.date.today().strftime('%%Y-%%m-%%d 23:59:59'))]"/>
+                    <filter icon="gtk-go-forward" string="Yesterday" domain="[('date_order','&lt;',datetime.date.today().strftime('%%Y-%%m-%%d 00:00:00')),('date_order','&gt;=',(datetime.date.today() - relativedelta(days=1)).strftime('%%Y-%%m-%%d 00:00:00'))]"/>
+                    <separator orientation="vertical"/>
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <newline/>
+                    <group expand="0" string="Group By..." groups="base.group_extended">
+                        <filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
+                        <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
+                        <separator string="" orientation="vertical"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                        <separator string="" orientation="vertical"/>
+                        <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
+                    </group>
+               </search>
+            </field>
+        </record>
+
+
+        <record model="ir.ui.view" id="view_pos_session_search">
+            <field name="name">pos.session.search.view</field>
+            <field name="model">pos.session</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="PoS Session">
+                    <filter string="Open" domain="[('state', '=', 'opened')]" />
+                    <separator orientation="vertical"/>
+                    <filter string="Today" domain="[('start_at', '>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]" />
+                    <separator orientation="vertical"/>
+                    <field name="config_id" />
+                    <field name="name" />
+                    <field name="user_id" />
+
+                    <newline />
+                    <group expand="0" string="Group By...">
+                        <filter string="User" icon="terp-personal" domain="[]" context="{'group_by' : 'user_id'}" />
+                        <filter string="PoS" domain="[]" context="{'group_by': 'user_id'}" />
+                    </group>
+                </search>
+            </field>
+        </record>
+
+
+        <record model="ir.actions.act_window" id="action_pos_session">
+            <field name="name">Point of Sales Session</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">pos.session</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <!--
+            <field name="search_view_id" ref="view_pos_session_search" />
+        -->
+        </record>
+
+        <menuitem
+            parent="menu_point_of_sale"
+            action="action_pos_session"
+            id="menu_pos_session"
+            groups="group_pos_manager"/>
 
     </data>
 </openerp>
index 4daa2d1..90f5f61 100644 (file)
 
 
   </data>
+
+  <data>
+    <record model="workflow" id="wkf_pos_session">
+      <field name="name">POS Session Workflow</field>
+      <field name="osv">pos.session</field>
+      <field name="on_create">True</field>
+    </record>
+
+    <!-- Activities -->
+
+    <record model="workflow.activity" id="act_new">
+      <field name="wkf_id" ref="wkf_pos_session"/>
+      <field name="flow_start">True</field>
+      <field name="name">new</field>
+    </record>
+
+    <record model="workflow.activity" id="act_open">
+      <field name="wkf_id" ref="wkf_pos_session"/>
+      <field name="name">open</field>
+    </record>
+
+    <record model="workflow.activity" id="act_close">
+      <field name="wkf_id" ref="wkf_pos_session"/>
+      <field name="name">close</field>
+    </record>
+
+    <record model="workflow.activity" id="act_post">
+      <field name="wkf_id" ref="wkf_pos_session"/>
+      <field name="flow_stop">True</field>
+      <field name="name">post</field>
+    </record>
+
+    <!-- Transitions -->
+    <record model="workflow.transition" id="trans_new_open">
+      <field name="act_from" ref="act_new"/>
+      <field name="act_to" ref="act_open"/>
+      <field name="signal">open</field>
+    </record>
+
+    <record model="workflow.transition" id="trans_open_close">
+      <field name="act_from" ref="act_open"/>
+      <field name="act_to" ref="act_close"/>
+      <field name="signal">close</field>
+    </record>
+
+    <record model="workflow.transition" id="trans_close_post">
+      <field name="act_from" ref="act_close"/>
+      <field name="act_to" ref="act_post"/>
+      <field name="signal">post</field>
+    </record>
+
+  </data>
 </openerp>
index 3a4675a..fe8281c 100644 (file)
@@ -73,10 +73,13 @@ class pos_box_entries(osv.osv_memory):
         'product_id': fields.selection(_get_income_product, "Operation", required=True, size=-1),
         'amount': fields.float('Amount', digits=(16, 2), required=True),
         'ref': fields.char('Ref', size=32),
+        'session_id' : fields.many2one('pos.session', 'Session'),
+        'user_id' : fields.many2one('res.users', 'User'),
     }
     _defaults = {
-         'journal_id': 1,
-         'product_id': 1,
+        'journal_id': 1,
+        'product_id': 1,
+        'user_id' : lambda obj, cr, uid, context: uid,
     }
 
     def get_in(self, cr, uid, ids, context=None):
index 2db10e3..92df1a1 100644 (file)
             <field name="arch" type="xml">
                 <form string="Put Money">
                     <separator string="Fill in this form if you put money in the cash register:" colspan="4"/>
-                    <field name="name"/>
-                    <field name="product_id"/>
                     <field name="journal_id"/>
+                    <field name="product_id"/>
                     <field name="amount"/>
+                    <field name="session_id" />
+                    <field name="user_id" invisible="1" />
+                    <field name="name"/>
                     <separator colspan="4"/>
                     <group colspan="4" col="4">
                         <group col="2" colspan="2"/>
index f07c05c..f09ea4e 100644 (file)
@@ -52,10 +52,13 @@ class pos_box_out(osv.osv_memory):
         'journal_id': fields.selection(pos_box_entries.get_journal, "Cash Register", required=True, size=-1),
         'product_id': fields.selection(_get_expense_product, "Operation", required=True, size=-1),
         'amount': fields.float('Amount', digits=(16, 2), required=True),
+        'session_id' : fields.many2one('pos.session', 'Session'),
+        'user_id' : fields.many2one('res.users', 'User'),
     }
     _defaults = {
-         'journal_id': 1,
-         'product_id': 1,
+        'journal_id': 1,
+        'product_id': 1,
+        'user_id' : lambda obj, cr, uid, context: uid,
     }
     def get_out(self, cr, uid, ids, context=None):
 
index 4f19a40..e7e7056 100644 (file)
             <field name="arch" type="xml">
                 <form string="Output Operation">
                         <separator string="Describe why you take money from the cash register:" colspan="4"/>
-                        <field name="name"/>
-                        <field name="product_id"/>
                         <field name="journal_id"/>
+                        <field name="product_id"/>
                         <field name="amount"/>
+                        <field name="session_id" />
+                        <field name="name"/>
+                        <field name="user_id" invisible="1" />
                         <separator colspan="4"/>
                         <group colspan="4" col="4">
                             <group col="2" colspan="2"/>