--- /dev/null
+##############################################################################
+#
+# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
+# Fabien Pinckaers <fp@tiny.Be>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
--- /dev/null
+{
+ "name":"Board for accountant",
+ "version":"1.0",
+ "author":"Tiny",
+ "category":"Board",
+ "depends":["account","hr_timesheet_invoice","board"],
+ "demo_xml":[],
+ "update_xml":["board_account_view.xml"],
+ "active":False,
+ "installable":True,
+}
--- /dev/null
+<?xml version="1.0"?>
+<terp>
+ <data>
+
+ <record model="board.note.type" id="note_account_type">
+ <field name="name">Accountants</field>
+ </record>
+
+ <record model="ir.ui.view" id="view_task_tree">
+ <field name="name">project.task.tree</field>
+ <field name="model">project.task</field>
+ <field name="type">tree</field>
+ <field name="priority" eval="99"/>
+ <field name="arch" type="xml">
+ <tree string="My tasks" colors="red:date_deadline<current_date;blue:date_deadline==current_date">
+ <field name="name"/>
+ <field name="project_id"/>
+ <field name="date_deadline"/>
+ <field name="planned_hours"/>
+ <field name="effective_hours"/>
+ <field name="priority"/>
+ </tree>
+ </field>
+ </record>
+ <record model="ir.actions.act_window" id="action_view_task_tree">
+ <field name="name">My open tasks</field>
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,graph</field>
+ <field name="domain">[('user_id','=',uid),('state','=','open')]</field>
+ <field name="view_id" ref="view_task_tree" />
+ </record>
+ <record model="ir.actions.act_window" id="action_view_task_tree_deadline">
+ <field name="name">My task's deadlines</field>
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,graph</field>
+ <field name="domain">[('user_id','=',uid),('state','=','open'),('date_deadline','<>',False)]</field>
+ <field name="view_id" ref="view_task_tree" />
+ </record>
+
+ <record model="ir.actions.act_window" id="action_view_board_note_tree">
+ <field name="name">Public notes</field>
+ <field name="res_model">board.note</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree</field>
+ <field name="domain">[('type','=','Project')]</field>
+ </record>
+
+ <record model="ir.ui.view" id="board_project_form">
+ <field name="name">board.project.form</field>
+ <field name="model">board.board</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Project">
+ <hpaned>
+
+ <child1>
+
+ <action
+ string="My open tasks"
+ name="%(action_view_task_tree)d"
+ colspan="4"
+ height="220"
+ width="510"/>
+
+ <action
+ string="My deadlines"
+ name="%(action_view_task_tree_deadline)d"
+ height="150"
+ colspan="4"/>
+
+ <action
+ string="Public notes"
+ name="%(action_view_board_note_tree)d"
+ colspan="2"
+ height="150"/>
+ <action
+ string="Public notes"
+ name="%(action_view_board_note_tree)d"
+ colspan="2"
+ height="150"/>
+
+
+ </child1>
+
+ <child2>
+ <button
+ string="Menu"
+ name="%(base.action_menu_admin)d"
+ icon="gtk-ok"
+ type="action"
+ colspan="4"/>
+
+ <action
+ string="My timesheet"
+ name="%(report_timesheet.action_timesheet_user_stat)d"
+ colspan="4"/>
+
+ <action
+ string="My work"
+ name="%(report_analytic_line.action_account_analytic_planning_stat_my_form)d"
+ colspan="4"/>
+
+
+ </child2>
+ </hpaned>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="open_board_sales_manager">
+ <field name="name">Dashboard project member</field>
+ <field name="res_model">board.board</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
+ <field name="usage">menu</field>
+ <field name="view_id" ref="board_project_form"/>
+ </record>
+
+ <menuitem
+ name="Dashboards/Project member"
+ action="open_board_sales_manager"
+ sequence="1"
+ id="menu_board_sales_manager"/>
+ </data>
+</terp>
"version":"1.0",
"author":"Tiny",
"category":"Board",
- "depends":["project","report_timesheet","board"],
+ "depends":["project","report_timesheet","board","report_analytic_line"],
"demo_xml":[],
"update_xml":["board_project_view.xml"],
"active":False,
'string':'Destination Journal',
'type':'many2one',
'relation':'account.journal',
- 'required':True,
- 'domain':[('type','=','sale')]
+ 'required':True
},
'group' : {'string':'Group by partner', 'type':'boolean'}
}
#
##############################################################################
-import tools
import purchase
import partner
+import stock
import wizard
import report
"category" : "Generic Modules/Sales & Purchases",
"init_xml" : [],
"demo_xml" : ["purchase_demo.xml"],
- "update_xml" : ["purchase_workflow.xml", "purchase_sequence.xml", "purchase_data.xml", "purchase_view.xml", "purchase_report.xml", "purchase_wizard.xml"],
+ "update_xml" : [
+ "purchase_workflow.xml",
+ "purchase_sequence.xml",
+ "purchase_data.xml",
+ "purchase_view.xml",
+ "purchase_report.xml",
+ "purchase_wizard.xml",
+ "stock_view.xml"
+ ],
"active": False,
"installable": True
}
'validator' : fields.many2one('res.users', 'Validated by', readonly=True),
'notes': fields.text('Notes'),
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
- 'picking_id': fields.many2one('stock.picking', 'Picking list', readonly=True),
+ '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 invoice"),
'shipped':fields.boolean('Received', readonly=True, select=True),
'invoiced':fields.boolean('Invoiced & Paid', readonly=True, select=True),
'invoice_method': fields.selection([('manual','Manual'),('order','From order'),('picking','From picking')], 'Invoicing method', required=True),
if order.invoice_method=='picking':
istate = '2binvoiced'
picking_id = self.pool.get('stock.picking').create(cr, uid, {
- 'origin': order.name+':'+(order.origin or ''),
+ 'origin': order.name+((order.origin and (':'+order.origin)) or ''),
'type': 'in',
'address_id': order.dest_address_id.id or order.partner_address_id.id,
- 'invoice_state': istate
+ 'invoice_state': istate,
+ 'purchase_id': order.id
})
for order_line in order.order_line:
if not order_line.product_id:
})
if order_line.move_dest_id:
self.pool.get('stock.move').write(cr, uid, [order_line.move_dest_id.id], {'location_id':order.location_id.id})
- self.write(cr,uid,[order.id],{'picking_id':picking_id})
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
return picking_id
'shipped':False,
'invoiced':False,
'invoice_id':False,
- 'picking_id':False,
+ 'picking_ids':[],
'name': self.pool.get('ir.sequence').get(cr, uid, 'purchase.order'),
})
return super(purchase_order, self).copy(cr, uid, id, default, context)
<field name="location_id"/>
<field name="invoice_method"/>
<newline/>
- <field name="picking_id" colspan="3"/>
<field name="invoice_id" colspan="3"/>
+ <field name="picking_ids" colspan="3"/>
</page>
<page string="Notes">
<field name="validator" />
--- /dev/null
+##############################################################################
+#
+# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
+# Fabien Pinckaers <fp@tiny.Be>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from osv import osv, fields
+
+#
+# Inherit of picking to add the link to the PO
+#
+class stock_picking(osv.osv):
+ _inherit = 'stock.picking'
+ _columns = {
+ 'purchase_id': fields.many2one('purchase.order', 'Purchase Order', ondelete='set null', relate=True, select=True),
+ }
+ _defaults = {
+ 'purchase_id': lambda *a: False
+ }
+stock_picking()
+
+
--- /dev/null
+<terp>
+<data>
+
+ <record model="ir.ui.view" id="stock_picking_inherit_purchase">
+ <field name="name">stock.picking.form</field>
+ <field name="model">stock.picking</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="stock.view_picking_form"/>
+ <field name="arch" type="xml">
+ <field name="origin" position="after">
+ <field name="purchase_id"/>
+ </field>
+ </field>
+ </record>
+
+</data>
+</terp>
_columns = {
'journal_id': fields.many2one('purchase_journal.purchase.journal', 'Journal', relate=True),
}
+ def action_picking_create(self, cr, uid, ids, *args):
+ result = super(purchase, self).action_picking_create(cr, uid, ids, *args)
+ for order in self.browse(cr, uid, ids, context={}):
+ pids = [ x.id for x in (order.picking_ids or [])]
+ self.pool.get('stock.picking').write(cr, uid, pids, {
+ 'purchase_journal_id': order.journal_id.id
+ })
+ return result
purchase()
+
+class picking(osv.osv):
+ _inherit="stock.picking"
+ _columns = {
+ 'purchase_journal_id': fields.many2one('purchase_journal.purchase.journal', 'Purchase Journal', select=True, relate=True),
+ }
+picking()
<terp>
<data>
+ <record model="ir.ui.view" id="purchase_journal_picking_order">
+ <field name="name">stock.picking.journal.view.form</field>
+ <field name="type">form</field>
+ <field name="model">stock.picking</field>
+ <field name="inherit_id" ref="stock.view_picking_form" />
+ <field name="arch" type="xml">
+ <field name="origin" position="after">
+ <field name="purchase_journal_id" select="1"/>
+ </field>
+ </field>
+ </record>
+
<record model="ir.ui.view" id="view_purchase_journal_form">
<field name="name">purchase_journal.purchase.journal.form</field>
<field name="model">purchase_journal.purchase.journal</field>
--- /dev/null
+##############################################################################
+#
+# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
+#
+# $Id: __init__.py 1005 2005-07-25 08:41:42Z nicoe $
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+import report_analytic
--- /dev/null
+{
+ "name" : "Analytic Account Reporting",
+ "version" : "1.0",
+ "author" : "Tiny",
+ "website" : "http://tinyerp.com",
+ "depends" : ["account"],
+ "category" : "Generic Modules/Account",
+ "description": "A module that adds new reports based on analytic accounts.",
+ "init_xml" : [],
+ "demo_xml" : [],
+ "update_xml" : ["report_analytic_view.xml"],
+ "active": False,
+ "installable": True
+}
--- /dev/null
+##############################################################################
+#
+# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
+#
+# $Id: project.py 1005 2005-07-25 08:41:42Z nicoe $
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from osv import fields,osv
+
+class report_analytic_account_close(osv.osv):
+ _name = "report.analytic.account.close"
+ _description = "Analytic account to close"
+ _auto = False
+ _columns = {
+ 'name': fields.many2one('account.analytic.account', 'Analytic account', readonly=True),
+ 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
+ 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity_max': fields.float('Max. Quantity', readonly=True),
+ 'balance': fields.float('Balance', readonly=True),
+ 'date_deadline': fields.date('Deadline', readonly=True),
+ }
+ def init(self, cr):
+ cr.execute("""
+ create or replace view report_crm_case_user as (
+ select
+ l.account_id as id,
+ l.account_id as name,
+ sum(l.unit_amount) as quantity,
+ sum(l.amount) as balance,
+ a.partner_id as partner_id,
+ a.quantity_max as quantity_max,
+ a.date as date_deadline
+ from
+ account_analytic_line l
+ left join
+ account_analytic_account a on (l.account_id=a.id)
+ where
+ a.state='open'
+ group by
+ l.account_id,a.quantity_max,a.date,a.partner_id
+ having
+ sum(l.unit_amount)>=a.quantity_max or
+ a.date <= current_date
+ )""")
+report_analytic_account_close()
--- /dev/null
+<?xml version="1.0"?>
+<terp>
+<data>
+
+ #
+ # Analytic accounts to close
+ #
+
+ <record model="ir.ui.view" id="view_analytic_account_form">
+ <field name="name">report.analytic.account.form</field>
+ <field name="model">report.analytic.account</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Sales Orders by product">
+ <field name="name" select="1"/>
+ <field name="partner_id" select="1"/>
+ <field name="quantity" select="1"/>
+ <field name="quantity_max"/>
+ <field name="date_deadline" select="1"/>
+ <field name="balance" select="1"/>
+ </form>
+ </field>
+ </record>
+
+
+ <record model="ir.ui.view" id="view_analytic_account_tree">
+ <field name="name">report.analytic.account.tree</field>
+ <field name="model">report.analytic.account</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Sales Orders by product">
+ <field name="name"/>
+ <field name="partner_id"/>
+ <field name="quantity"/>
+ <field name="quantity_max"/>
+ <field name="date_deadline"/>
+ <field name="balance"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_analytic_account_graph">
+ <field name="name">report.analytic.account.graph</field>
+ <field name="model">report.analytic.account</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph string="Analytic accounts to close">
+ <field name="partner_id" group="True"/>
+ <field name="quantity" operator="+"/>
+ <field name="quantity_max" operator="+"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_analytic_account_tree">
+ <field name="name">report.analytic.account.tree</field>
+ <field name="res_model">report.analytic.account</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,graph</field>
+ </record>
+ <menuitem name="Financial Management/Reporting/All Months/Analytic accounts to close"
+ action="action_analytic_account_tree"
+ id="menu_action_analytic_account_tree"/>
+
+
+ </data>
+</terp>
_description = "Analytic lines to invoice report"
_auto = False
_columns = {
- # a quoi sert le relate=True ?
'name': fields.date('Month', readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True, relate=True),
'account_id':fields.many2one('account.analytic.account', 'Analytic account', readonly=True, relate=True),
)
""")
#report_account_analytic_line_to_invoice()
-
'payment_line': fields.one2many('sale.order.payment', 'order_id', 'Order Payments', readonly=True, states={'draft':[('readonly',False)]}),
'invoice_ids': fields.many2many('account.invoice', 'sale_order_invoice_rel', 'order_id', 'invoice_id', 'Invoice', readonly=True, help="This is the list of invoices that have been generated for this sale order. The same sale order may have been invoiced in several times (by line for example)."),
- #'picking_ids': fields.many2many('stock.picking', 'sale_order_picking_rel', 'order_id','picking_id', 'Picking List', readonly=True, help="This is the list of picking list that have been generated for this invoice"),
-
'picking_ids': fields.one2many('stock.picking', 'sale_id', 'Picking List', readonly=True, help="This is the list of picking list that have been generated for this invoice"),
'shipped':fields.boolean('Picked', readonly=True),
_inherit="stock.picking"
_columns = {
'journal_id': fields.many2one('sale_journal.picking.journal', 'Journal', relate=True),
+ 'sale_journal_id': fields.many2one('sale_journal.sale.journal', 'Sale Journal', relate=True),
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', relate=True, readonly=True)
}
picking()
result = super(sale, self).action_ship_create(cr, uid, ids, *args)
for order in self.browse(cr, uid, ids, context={}):
pids = [ x.id for x in order.picking_ids]
- self.pool.get('stock.picking').write(cr, uid, pids, {'invoice_type_id': order.invoice_type_id.id})
+ self.pool.get('stock.picking').write(cr, uid, pids, {
+ 'invoice_type_id': order.invoice_type_id.id,
+ 'sale_journal_id': order.journal_id.id
+ })
return result
def onchange_partner_id(self, cr, uid, ids, part):
<field name="arch" type="xml">
<field name="origin" position="after">
<field name="journal_id" select="1"/>
+ <field name="sale_journal_id" select="1"/>
<field name="invoice_type_id" select="1"/>
</field>
</field>
<field name="arch" type="xml">
<field name="invoice_state" position="after">
<field name="journal_id" select="1"/>
+ <field name="sale_journal_id" select="1"/>
<field name="invoice_type_id" select="1"/>
</field>
</field>
for move in pick.move_lines:
if (move.state in ('confirmed','draft')) and (mt=='one'):
return False
- if (mt=='direct') and move.state=='assigned':
+ if (mt=='direct') and (move.state=='assigned') and (move.product_qty):
return True
ok = ok and (move.state in ('cancel','done','assigned'))
return ok
'product_id': line.product_id.id,
'account_id': account_id,
'price_unit': line.sale_line_id and line.sale_line_id.price_unit or line.product_id.list_price,
+ 'discount': line.sale_line_id and line.sale_line_id.discount or 0.0,
'quantity': line.product_uos_qty,
'invoice_line_tax_id': [(6,0,tax_ids)]
})
import wizard
import pooler
from tools.misc import UpdateableStr
+
+import netsvc
import time
arch=UpdateableStr()
return fct
def _get_returns(self, cr, uid, data, context):
- pick_obj=pooler.get_pool(cr.dbname).get('stock.picking')
+ pool = pooler.get_pool(cr.dbname)
+ pick_obj=pool.get('stock.picking')
pick=pick_obj.browse(cr, uid, [data['id']])[0]
res={}
fields.clear()
'picking_id':new_picking, 'state':'draft',
'location_id':new_location, 'location_dest_id':move.location_id.id,
'date':date_cur, 'date_planned':date_cur,})
+ if new_picking:
+ wf_service = netsvc.LocalService("workflow")
+ if new_picking:
+ wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr)
+ pick_obj.force_assign(cr, uid, [new_picking], context)
return new_picking
def _action_open_window(self, cr, uid, data, context):