From bf266e764a926d3e47149cb6d47886525317f511 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Mon, 26 Apr 2010 12:08:12 +0530
Subject: [PATCH 001/389] [IMP]: Improve SQL view report for crm.lead.
bzr revid: rch_open_erp-20100426063812-6e8ldx12o32cdosy
---
addons/crm/report/crm_claim_report.py | 2 +-
addons/crm/report/crm_lead_report.py | 12 ++++++++++++
addons/crm/report/crm_lead_report_view.xml | 19 +++++++++++++++++++
addons/crm/report/crm_report_view.xml | 7 ++++---
4 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/addons/crm/report/crm_claim_report.py b/addons/crm/report/crm_claim_report.py
index 4148a834810..70d6be8d616 100644
--- a/addons/crm/report/crm_claim_report.py
+++ b/addons/crm/report/crm_claim_report.py
@@ -82,7 +82,7 @@ class crm_claim_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), \
c.state, c.user_id,c.section_id, c.stage_id,\
c.categ_id,c.partner_id,c.company_id,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
- ,c.priority,c.type_id,c.som
+ ,c.priority,c.type_id
)""")
crm_claim_report()
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index d400700c0b5..92aeb7f28ec 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -21,6 +21,7 @@
from osv import fields,osv
import tools
+import crm_report
AVAILABLE_STATES = [
('draft','Draft'),
@@ -47,6 +48,12 @@ class crm_lead_report(osv.osv):
('object_id.model', '=', 'crm.lead')]", readonly=True),
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
+ 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]"),
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'date_open': fields.datetime('Opened', readonly=True),
}
def init(self, cr):
@@ -74,6 +81,10 @@ class crm_lead_report(osv.osv):
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ c.priority as priority,
+ c.type_id as type_id,
+ c.date_closed as date_closed,
+ c.date_open as date_open,
date_trunc('day',c.create_date) as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
from
@@ -81,6 +92,7 @@ class crm_lead_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id
,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
+ ,c.priority,c.type_id,c.date_closed,c.date_open
)""")
crm_lead_report()
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index d6502c190d9..6ef0d90ac97 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -22,6 +22,10 @@
+
+
+
+
@@ -70,6 +74,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/report/crm_report_view.xml b/addons/crm/report/crm_report_view.xml
index 97fa4feb6f1..b4e18793af4 100644
--- a/addons/crm/report/crm_report_view.xml
+++ b/addons/crm/report/crm_report_view.xml
@@ -106,9 +106,10 @@
help="My company"/>
-
-
-
+
+
+
+
From b8947954bf8ab4e410272937621815f73b1cdd98 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Mon, 26 Apr 2010 12:56:32 +0530
Subject: [PATCH 002/389] [IMP]: Improve SQL view for crm fundraising.
bzr revid: rch_open_erp-20100426072632-wcny8y4x5ud18y4t
---
addons/crm/report/crm_fundraising_report.py | 8 ++++++--
addons/crm/report/crm_fundraising_report_view.xml | 11 +++++++++++
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/addons/crm/report/crm_fundraising_report.py b/addons/crm/report/crm_fundraising_report.py
index af867ea0008..2b3fbcb4c7a 100644
--- a/addons/crm/report/crm_fundraising_report.py
+++ b/addons/crm/report/crm_fundraising_report.py
@@ -21,7 +21,7 @@
from osv import fields,osv
import tools
-
+import crm_report
class crm_fundraising_report(osv.osv):
"""CRM Fundraising Report"""
@@ -41,6 +41,8 @@ class crm_fundraising_report(osv.osv):
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
'partner_id': fields.many2one('res.partner', 'Partner'),
'company_id': fields.many2one('res.company', 'Company'),
+ 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
+ 'date_closed': fields.datetime('Closed', readonly=True)
}
def init(self, cr):
@@ -67,6 +69,8 @@ class crm_fundraising_report(osv.osv):
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ c.priority as priority,
+ c.date_closed as date_closed,
date_trunc('day',c.create_date) as create_date,
sum(planned_revenue) as amount_revenue,
sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
@@ -76,7 +80,7 @@ class crm_fundraising_report(osv.osv):
crm_fundraising c
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
c.state, c.user_id,c.section_id,c.categ_id,c.partner_id,c.company_id,
- c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
+ c.create_date,to_char(c.create_date, 'YYYY-MM-DD'),c.priority,c.date_closed
)""")
crm_fundraising_report()
diff --git a/addons/crm/report/crm_fundraising_report_view.xml b/addons/crm/report/crm_fundraising_report_view.xml
index e1c32726b4f..1d97b868a34 100644
--- a/addons/crm/report/crm_fundraising_report_view.xml
+++ b/addons/crm/report/crm_fundraising_report_view.xml
@@ -24,6 +24,8 @@
+
+
@@ -73,8 +75,17 @@
+
+
+
+
+
+
From c70951059ee26059ace2a45e88855d5a56bff2b9 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Mon, 26 Apr 2010 13:55:43 +0530
Subject: [PATCH 003/389] [IMP]:mrp:Improved SQL report.(Production).
bzr revid: apa@tinyerp.com-20100426082543-0yk10z2xhx05rj1t
---
addons/mrp/report/mrp_production_order.py | 20 ++--
.../mrp/report/mrp_production_order_view.xml | 91 ++++++++++++-------
2 files changed, 71 insertions(+), 40 deletions(-)
diff --git a/addons/mrp/report/mrp_production_order.py b/addons/mrp/report/mrp_production_order.py
index 7f48b111d43..96910e205d7 100644
--- a/addons/mrp/report/mrp_production_order.py
+++ b/addons/mrp/report/mrp_production_order.py
@@ -27,12 +27,14 @@ class mrp_production_order(osv.osv):
_description = "Production Order Report"
_auto = False
_columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
+ 'year': fields.char('Year',size=64,readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
+ 'day': fields.char('Day',size=64,readonly=True),
'origin': fields.char('Source Document', size=64),
'nbr': fields.integer('# of Orders', readonly=True),
- 'product_id': fields.many2one('product.product', 'Product', readonly=True, domain=[('type','<>','service')]),
+ 'date': fields.date('Date', readonly=True),
+ 'product_id': fields.many2one('product.product', 'Product', readonly=True),
'product_qty': fields.float('Product Qty', readonly=True),
'state': fields.selection([('draft','Draft'),
('picking_except', 'Picking Exception'),
@@ -43,13 +45,13 @@ class mrp_production_order(osv.osv):
('done','Done')],
'State', readonly=True),
'date_planned':fields.date('Scheduled Date'),
- 'location_src_id': fields.many2one('stock.location', 'Raw Materials Location', required=True),
+ 'location_src_id': fields.many2one('stock.location', 'Raw Materials Location', readonly=True),
'date_start': fields.datetime('Start Date',readonly=True),
'date_finnished': fields.datetime('End Date',readonly=True),
- 'location_dest_id': fields.many2one('stock.location', 'Finished Products Location', required=True),
+ 'location_dest_id': fields.many2one('stock.location', 'Finished Products Location', readonly=True),
'company_id': fields.many2one('res.company','Company',readonly=True),
- 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)],readonly=True),
- 'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null',readonly=True),
+ 'bom_id': fields.many2one('mrp.bom', 'Bill of Material',readonly=True),
+ 'routing_id': fields.many2one('mrp.routing', string='Routing',readonly=True),
'picking_id': fields.many2one('stock.picking', 'Picking list', readonly=True),
'priority': fields.selection([('0','Not urgent'),
('1','Normal'),
@@ -65,8 +67,10 @@ class mrp_production_order(osv.osv):
create or replace view mrp_production_order as (
select
min(l.id) as id,
- to_char(s.create_date, 'YYYY') as name,
+ to_date(to_char(s.create_date, 'MM-dd-YYYY'),'MM-dd-YYYY') as date,
+ to_char(s.create_date, 'YYYY') as year,
to_char(s.create_date, 'MM') as month,
+ to_char(s.create_date, 'YYYY-MM-DD') as day,
l.product_id as product_id,
sum(l.product_qty * u.factor) as product_qty,
s.company_id as company_id,
@@ -90,6 +94,8 @@ class mrp_production_order(osv.osv):
group by
to_char(s.create_date, 'YYYY'),
to_char(s.create_date, 'MM'),
+ to_char(s.create_date, 'YYYY-MM-DD'),
+ to_date(to_char(s.create_date, 'MM-dd-YYYY'),'MM-dd-YYYY'),
l.product_id,
l.product_uom,
s.bom_id,
diff --git a/addons/mrp/report/mrp_production_order_view.xml b/addons/mrp/report/mrp_production_order_view.xml
index a97abe846de..04188f43752 100644
--- a/addons/mrp/report/mrp_production_order_view.xml
+++ b/addons/mrp/report/mrp_production_order_view.xml
@@ -11,18 +11,21 @@
tree
-
-
-
-
+
+
+
+
-
+
-
+
+
+
+
@@ -35,8 +38,9 @@
graph
-
+
+
@@ -48,48 +52,70 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
-
+
@@ -101,8 +127,7 @@
tree,graph
- {'search_default_Product': 1}
-
+ {'search_default_month':1,'search_default_Product':1,'group_by_no_leaf':1,'group_by':[]}
From 68ac3e6fa806ea369d0118425f6e53e0c83df36c Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Mon, 26 Apr 2010 15:31:40 +0530
Subject: [PATCH 004/389] [IMP]: Improve SQL view report of claim,lead and
fundraising.
bzr revid: rch_open_erp-20100426100140-n0ppf5ddggbungbs
---
addons/crm/report/crm_claim_report.py | 8 +++++++-
addons/crm/report/crm_claim_report_view.xml | 13 +++++++++++++
addons/crm/report/crm_fundraising_report.py | 7 ++++++-
addons/crm/report/crm_fundraising_report_view.xml | 12 +++++++++++-
4 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/addons/crm/report/crm_claim_report.py b/addons/crm/report/crm_claim_report.py
index 70d6be8d616..74b95864759 100644
--- a/addons/crm/report/crm_claim_report.py
+++ b/addons/crm/report/crm_claim_report.py
@@ -46,6 +46,9 @@ class crm_claim_report(osv.osv):
'type_id': fields.many2one('crm.case.resource.type', 'Claim Type',\
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.claim')]"),
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'canal_id': fields.many2one('res.partner.canal','Channel',domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]"),
+ 'som': fields.many2one('res.partner.som', 'State of Mind')
}
def init(self, cr):
@@ -75,6 +78,9 @@ class crm_claim_report(osv.osv):
0.0 as perc_cancel,
c.priority as priority,
c.type_id as type_id,
+ c.date_closed as date_closed,
+ c.canal_id as canal_id,
+ c.som as som,
date_trunc('day',c.create_date) as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
from
@@ -82,7 +88,7 @@ class crm_claim_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), \
c.state, c.user_id,c.section_id, c.stage_id,\
c.categ_id,c.partner_id,c.company_id,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
- ,c.priority,c.type_id
+ ,c.priority,c.type_id,c.date_closed,c.canal_id,c.som
)""")
crm_claim_report()
diff --git a/addons/crm/report/crm_claim_report_view.xml b/addons/crm/report/crm_claim_report_view.xml
index 647a0125179..74ebbd56d0b 100644
--- a/addons/crm/report/crm_claim_report_view.xml
+++ b/addons/crm/report/crm_claim_report_view.xml
@@ -24,6 +24,9 @@
+
+
+
@@ -78,6 +81,11 @@
+
+
+
+
+
+
+
+
diff --git a/addons/crm/report/crm_fundraising_report.py b/addons/crm/report/crm_fundraising_report.py
index 2b3fbcb4c7a..5765b7367b0 100644
--- a/addons/crm/report/crm_fundraising_report.py
+++ b/addons/crm/report/crm_fundraising_report.py
@@ -42,7 +42,9 @@ class crm_fundraising_report(osv.osv):
'partner_id': fields.many2one('res.partner', 'Partner'),
'company_id': fields.many2one('res.company', 'Company'),
'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
- 'date_closed': fields.datetime('Closed', readonly=True)
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'canal_id': fields.many2one('res.partner.canal','Channel',domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]"),
+ 'som': fields.many2one('res.partner.som', 'State of Mind')
}
def init(self, cr):
@@ -71,6 +73,8 @@ class crm_fundraising_report(osv.osv):
0.0 as perc_cancel,
c.priority as priority,
c.date_closed as date_closed,
+ c.canal_id as canal_id,
+ c.som as som,
date_trunc('day',c.create_date) as create_date,
sum(planned_revenue) as amount_revenue,
sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
@@ -81,6 +85,7 @@ class crm_fundraising_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
c.state, c.user_id,c.section_id,c.categ_id,c.partner_id,c.company_id,
c.create_date,to_char(c.create_date, 'YYYY-MM-DD'),c.priority,c.date_closed
+ ,c.canal_id,c.som
)""")
crm_fundraising_report()
diff --git a/addons/crm/report/crm_fundraising_report_view.xml b/addons/crm/report/crm_fundraising_report_view.xml
index 1d97b868a34..7236df4a8b4 100644
--- a/addons/crm/report/crm_fundraising_report_view.xml
+++ b/addons/crm/report/crm_fundraising_report_view.xml
@@ -26,6 +26,8 @@
+
+
@@ -77,7 +79,10 @@
-
+
+
+
+
+
+
+
From 2eeb2a1f7981a68aec561ade79c12e6ae3e924fd Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Mon, 26 Apr 2010 16:59:00 +0530
Subject: [PATCH 005/389] [IMP]: Improve SQL view report for crm oppertunities.
Add fields in Extended option in search view.
bzr revid: rch_open_erp-20100426112900-cfx18360ey1p6zqo
---
addons/crm/report/crm_opportunity_report.py | 12 +++++++++++-
addons/crm/report/crm_opportunity_report_view.xml | 13 ++++++++++++-
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/addons/crm/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py
index a3af4be8b7c..3e11307ee36 100644
--- a/addons/crm/report/crm_opportunity_report.py
+++ b/addons/crm/report/crm_opportunity_report.py
@@ -21,6 +21,7 @@
from osv import fields,osv
import tools
+import crm_report
AVAILABLE_STATES = [
('draft','Draft'),
@@ -50,6 +51,9 @@ class crm_opportunity_report(osv.osv):
'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'date_open': fields.datetime('Opened', readonly=True),
+ 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority')
}
def init(self, cr):
@@ -76,6 +80,9 @@ class crm_opportunity_report(osv.osv):
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ c.date_closed as date_closed,
+ c.date_open as date_open,
+ c.priority as priority,
date_trunc('day',c.create_date) as create_date,
sum(planned_revenue) as amount_revenue,
sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob,
@@ -94,7 +101,10 @@ class crm_opportunity_report(osv.osv):
c.categ_id,
c.partner_id,
company_id,
- create_date
+ create_date,
+ c.date_closed,
+ c.date_open,
+ c.priority
)""")
crm_opportunity_report()
diff --git a/addons/crm/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml
index 29a66b838f0..3daa72c717c 100644
--- a/addons/crm/report/crm_opportunity_report_view.xml
+++ b/addons/crm/report/crm_opportunity_report_view.xml
@@ -25,6 +25,9 @@
+
+
+
@@ -75,7 +78,13 @@
+
+
+
+
+
+
-
+
+
From 97ae945f3a8b81ef5387e8768cf67148c7195f10 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Mon, 26 Apr 2010 19:14:14 +0530
Subject: [PATCH 006/389] [IMP]: Improve SQL view report for crm phonecalls.
Add fields in Extended Option of search view.
bzr revid: rch_open_erp-20100426134414-44oq5wfkhs8y7jc1
---
addons/crm/report/crm_phonecall_report.py | 10 +++++++++
.../crm/report/crm_phonecall_report_view.xml | 21 +++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py
index 40b34779aba..c5109602eb3 100644
--- a/addons/crm/report/crm_phonecall_report.py
+++ b/addons/crm/report/crm_phonecall_report.py
@@ -21,6 +21,7 @@
from osv import fields,osv
import tools
+import crm_report
class crm_phonecall_report(osv.osv):
""" Phone calls by user and section """
@@ -37,6 +38,10 @@ class crm_phonecall_report(osv.osv):
('object_id.model', '=', 'crm.phonecall')]"),
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'opportunity_id': fields.many2one ('crm.opportunity', 'Opportunity'),
+ 'canal_id': fields.many2one('res.partner.canal','Channel',domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.phonecall')]")
}
def init(self, cr):
@@ -63,6 +68,10 @@ class crm_phonecall_report(osv.osv):
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ c.priority as priority,
+ c.date_closed as date_closed,
+ c.opportunity_id as opportunity_id,
+ c.canal_id as canal_id,
date_trunc('day',c.create_date) as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
from
@@ -70,6 +79,7 @@ class crm_phonecall_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
c.state, c.user_id,c.section_id, c.categ_id,c.partner_id,c.company_id
,to_char(c.create_date, 'YYYY-MM-DD'),c.create_date
+ ,c.priority,c.date_closed,opportunity_id,canal_id
)""")
crm_phonecall_report()
diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml
index 698a9b88fa3..5ad0a63bdd8 100644
--- a/addons/crm/report/crm_phonecall_report_view.xml
+++ b/addons/crm/report/crm_phonecall_report_view.xml
@@ -21,6 +21,10 @@
+
+
+
+
@@ -70,8 +74,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
From bb50f760f7357ae2ca1546969ebd30ac0c09a0e0 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Tue, 27 Apr 2010 15:13:43 +0530
Subject: [PATCH 007/389] [IMP]:hr_holidays:Improved SQL report.(Leaves).
bzr revid: apa@tinyerp.com-20100427094343-mbfa6xv6mgri5xqj
---
.../hr_holidays/report/hr_holidays_report.py | 17 ++-
.../report/hr_holidays_report_view.xml | 109 +++++++++++-------
2 files changed, 81 insertions(+), 45 deletions(-)
diff --git a/addons/hr_holidays/report/hr_holidays_report.py b/addons/hr_holidays/report/hr_holidays_report.py
index 435eee71ea5..c060521af0d 100644
--- a/addons/hr_holidays/report/hr_holidays_report.py
+++ b/addons/hr_holidays/report/hr_holidays_report.py
@@ -30,14 +30,17 @@ class hr_holidays_report(osv.osv):
_columns = {
'date': fields.datetime('Date', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
+ 'day': fields.char('Day', size=15, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'date_from' : fields.datetime('Start Date', readonly=True),
'date_to' : fields.datetime('End Date', readonly=True),
- 'number_of_days_temp': fields.float('Number of Days', readonly=True),
+ 'number_of_days_temp': fields.float('#Days', readonly=True),
'employee_id' : fields.many2one('hr.employee', "Employee's Name",readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
+ 'holiday_status_id' : fields.many2one("hr.holidays.status", "Leave Type",readonly=True),
+ 'department_id':fields.many2one('hr.department','Department',readonly=True),
'state': fields.selection([('draft', 'Draft'),
('confirm', 'Waiting Validation'),
('refuse', 'Refused'),
@@ -52,21 +55,25 @@ class hr_holidays_report(osv.osv):
create or replace view hr_holidays_report as (
select
min(s.id) as id,
- date_trunc('seconds',s.create_date) as date,
+ date_trunc('day',s.create_date) as date,
date_trunc('day',s.date_from) as date_from,
date_trunc('day',s.date_to) as date_to,
- s.number_of_days_temp,
+ sum(s.number_of_days_temp) as number_of_days_temp,
s.employee_id,
s.user_id as user_id,
to_char(s.create_date, 'YYYY') as year,
to_char(s.create_date, 'MM') as month,
+ to_char(s.create_date, 'YYYY-MM-DD') as day,
+ s.holiday_status_id,
+ s.department_id,
s.state
from
hr_holidays s
where type='remove'
group by
s.create_date,s.state,s.date_from,s.date_to,
- s.number_of_days_temp,s.employee_id,s.user_id
+ s.employee_id,s.user_id,s.holiday_status_id,
+ s.department_id
)
""")
hr_holidays_report()
@@ -98,7 +105,7 @@ class hr_holidays_remaining_leaves_user(osv.osv):
where
hrs.employee_id = hre.id and
hre.resource_id = rr.id and
- hhs.id = hrs.holiday_status_id
+ hhs.id = hrs.holiday_status_id
group by
rr.name,rr.user_id,hhs.name
)
diff --git a/addons/hr_holidays/report/hr_holidays_report_view.xml b/addons/hr_holidays/report/hr_holidays_report_view.xml
index e9e0e6aae36..c5f2a41afb7 100644
--- a/addons/hr_holidays/report/hr_holidays_report_view.xml
+++ b/addons/hr_holidays/report/hr_holidays_report_view.xml
@@ -7,14 +7,17 @@
tree
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -27,6 +30,7 @@
+
@@ -37,44 +41,69 @@
search
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
+
+
+
@@ -85,7 +114,7 @@
hr.holidays.reportformtree,graph
- {'search_default_employee': 1}
+ {'search_default_month':1,'search_default_Employee':1,'group_by_no_leaf':1,'group_by':[]}
From 091e1c13c9fc901ffe3876e61cc88c95ff002e07 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Tue, 27 Apr 2010 15:44:34 +0530
Subject: [PATCH 008/389] [IMP]:hr_holidays:Improved SQL report.(Leaves).
bzr revid: apa@tinyerp.com-20100427101434-du3rqytyaiaheq55
---
addons/hr_holidays/report/hr_holidays_report_view.xml | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/addons/hr_holidays/report/hr_holidays_report_view.xml b/addons/hr_holidays/report/hr_holidays_report_view.xml
index c5f2a41afb7..8c8bc58204c 100644
--- a/addons/hr_holidays/report/hr_holidays_report_view.xml
+++ b/addons/hr_holidays/report/hr_holidays_report_view.xml
@@ -9,6 +9,7 @@
+
@@ -68,7 +69,8 @@
domain="[('state','=','validate')]"
help = "Pending Leaves"/>
-
+
+
@@ -95,9 +97,10 @@
-
-
+
+
+
@@ -114,7 +117,7 @@
hr.holidays.reportformtree,graph
- {'search_default_month':1,'search_default_Employee':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]}
From cfb21e74972a0174dfe552449a0a6e813be6328a Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Tue, 27 Apr 2010 15:53:03 +0530
Subject: [PATCH 009/389] [IMP]:hr_holidays:Improved SQL report.(Leaves).
bzr revid: apa@tinyerp.com-20100427102303-98gutwonfqyd4lbu
---
addons/hr_holidays/report/available_holidays.py | 2 +-
addons/hr_holidays/report/hr_holidays_report.py | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/addons/hr_holidays/report/available_holidays.py b/addons/hr_holidays/report/available_holidays.py
index 4a1972f1f7d..fd9d77a62ff 100644
--- a/addons/hr_holidays/report/available_holidays.py
+++ b/addons/hr_holidays/report/available_holidays.py
@@ -25,7 +25,7 @@ class available_holidays_report(osv.osv):
_name = "available.holidays.report"
_auto = False
_columns = {
- 'date': fields.datetime('Date', readonly=True),
+ 'date': fields.date('Date', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
diff --git a/addons/hr_holidays/report/hr_holidays_report.py b/addons/hr_holidays/report/hr_holidays_report.py
index c060521af0d..b44fe041e25 100644
--- a/addons/hr_holidays/report/hr_holidays_report.py
+++ b/addons/hr_holidays/report/hr_holidays_report.py
@@ -28,14 +28,14 @@ class hr_holidays_report(osv.osv):
_auto = False
_rec_name = 'date'
_columns = {
- 'date': fields.datetime('Date', readonly=True),
+ 'date': fields.date('Date', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'day': fields.char('Day', size=15, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
- 'date_from' : fields.datetime('Start Date', readonly=True),
- 'date_to' : fields.datetime('End Date', readonly=True),
+ 'date_from' : fields.date('Start Date', readonly=True),
+ 'date_to' : fields.date('End Date', readonly=True),
'number_of_days_temp': fields.float('#Days', readonly=True),
'employee_id' : fields.many2one('hr.employee', "Employee's Name",readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
From efc69230d36501faf03f9136cf9be40e33ad5941 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Tue, 27 Apr 2010 16:19:27 +0530
Subject: [PATCH 010/389] [IMP]:hr_holidays:Improved SQL report.(Available
Holidays).
bzr revid: apa@tinyerp.com-20100427104927-1683smsdb4g9xuvv
---
.../hr_holidays/report/available_holidays.py | 7 +-
.../report/available_holidays_view.xml | 73 ++++++++++---------
2 files changed, 44 insertions(+), 36 deletions(-)
diff --git a/addons/hr_holidays/report/available_holidays.py b/addons/hr_holidays/report/available_holidays.py
index fd9d77a62ff..5499a914f6c 100644
--- a/addons/hr_holidays/report/available_holidays.py
+++ b/addons/hr_holidays/report/available_holidays.py
@@ -27,6 +27,7 @@ class available_holidays_report(osv.osv):
_columns = {
'date': fields.date('Date', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
+ 'day': fields.char('Day', size=15, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
@@ -35,6 +36,7 @@ class available_holidays_report(osv.osv):
'max_leave': fields.float('Allocated Leaves', readonly=True),
'taken_leaves': fields.float('Taken Leaves', readonly=True),
'remaining_leave': fields.float('Remaining Leaves',readonly=True),
+ 'department_id':fields.many2one('hr.department','Department',readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
}
def init(self, cr):
@@ -46,8 +48,10 @@ class available_holidays_report(osv.osv):
date_trunc('day',h.create_date) as date,
to_char(s.create_date, 'YYYY') as year,
to_char(s.create_date, 'MM') as month,
+ to_char(s.create_date, 'YYYY-MM-DD') as day,
h.employee_id as employee_id,
h.user_id as user_id,
+ h.department_id,
h.state as state,
h.holiday_status_id as holiday_status_id,
sum(number_of_days) as remaining_leave,
@@ -68,7 +72,8 @@ class available_holidays_report(osv.osv):
and s.active <> 'f'
group by h.holiday_status_id, h.employee_id,
date_trunc('day',h.create_date),to_char(s.create_date, 'YYYY'),
- to_char(s.create_date, 'MM'),h.user_id,h.state
+ to_char(s.create_date, 'MM'),to_char(s.create_date, 'YYYY-MM-DD'),h.user_id,
+ h.state,h.department_id
)""")
available_holidays_report()
diff --git a/addons/hr_holidays/report/available_holidays_view.xml b/addons/hr_holidays/report/available_holidays_view.xml
index 18ea7d58d45..cb610d4214a 100644
--- a/addons/hr_holidays/report/available_holidays_view.xml
+++ b/addons/hr_holidays/report/available_holidays_view.xml
@@ -10,40 +10,32 @@
tree
-
-
-
-
+
+
+
+
+
-
+
+
-
- available.holidays.report.form
- available.holidays.report
- form
-
-
-
-
-
-
-
- available.holidays.report.graphavailable.holidays.reportgraph
-
+
+
+
-
+
@@ -55,32 +47,42 @@
-
-
+
+
+
-
+
-
+
+
+
+
+
+
+
-
+
-
-
+
+
+
@@ -93,6 +95,7 @@
available.holidays.reportformtree,graph
+ {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]}
From c445b5b47185e3039456b784a9ea11500ddcd289 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Tue, 27 Apr 2010 18:00:23 +0530
Subject: [PATCH 011/389] [Add]: Add SQL view report for Accounts.
bzr revid: rch_open_erp-20100427123023-npkej0o1ed0viscq
---
addons/account/__openerp__.py | 1 +
addons/account/report/__init__.py | 2 +-
.../account/report/account_account_report.py | 77 +++++++++++++++++
.../report/account_account_report_view.xml | 83 +++++++++++++++++++
addons/account/report/account_report_view.xml | 8 +-
5 files changed, 166 insertions(+), 5 deletions(-)
create mode 100644 addons/account/report/account_account_report.py
create mode 100644 addons/account/report/account_account_report_view.xml
diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index abd3d1f459d..e73b3885089 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -100,6 +100,7 @@ module named account_voucherss
'report/account_invoice_report_view.xml',
'report/account_report_view.xml',
'report/account_analytic_report_view.xml',
+ 'report/account_account_report_view.xml'
],
'demo_xml': [
#'demo/price_accuracy00.yml',
diff --git a/addons/account/report/__init__.py b/addons/account/report/__init__.py
index 09ff866d1a8..959a76013f9 100644
--- a/addons/account/report/__init__.py
+++ b/addons/account/report/__init__.py
@@ -37,6 +37,6 @@ import compare_account_balance
import account_invoice_report
import account_report
import account_analytic_report
-
+import account_account_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_account_report.py b/addons/account/report/account_account_report.py
new file mode 100644
index 00000000000..a872a7173e7
--- /dev/null
+++ b/addons/account/report/account_account_report.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import tools
+from osv import fields,osv
+
+class account_account_report(osv.osv):
+ _name = "account.account.report"
+ _description = "Account Report"
+ _auto = False
+ _columns = {
+ 'name': fields.char('Name', size=128, readonly=True),
+ 'code': fields.char('Code', size=64, readonly=True),
+ 'type': fields.selection([
+ ('receivable', 'Receivable'),
+ ('payable', 'Payable'),
+ ('view', 'View'),
+ ('consolidation', 'Consolidation'),
+ ('other', 'Others'),
+ ('closed', 'Closed'),
+ ], 'Internal Type', readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', required=True),
+ 'currency_mode': fields.selection([('current', 'At Date'), ('average', 'Average Rate')], 'Outgoing Currencies Rate',readonly=True),
+ 'user_type': fields.many2one('account.account.type', 'Account Type',readonly=True),
+ 'credit': fields.float('Credit', readonly=True),
+ 'debit': fields.float('Debit', readonly=True),
+ 'balance': fields.float('Balance', readonly=True)
+ }
+ def init(self, cr):
+ tools.drop_view_if_exists(cr, 'account_account_report')
+ cr.execute("""
+ create or replace view account_account_report as (
+ select
+ min(a.id) as id,
+ a.name,
+ a.code,
+ a.type as type,
+ a.company_id as company_id,
+ a.currency_mode as currency_mode,
+ a.user_type as user_type,
+ sum(m.credit) as credit,
+ sum(m.debit) as debit,
+ (sum(m.credit)-sum(m.debit)) as balance
+ from
+ account_account as a
+ left join
+ account_move_line as m
+ on m.account_id=a.id
+ group by
+ a.name,
+ a.code,
+ a.type,
+ a.company_id,
+ a.currency_mode,
+ a.user_type,
+ m.account_id
+ )
+ """)
+account_account_report()
diff --git a/addons/account/report/account_account_report_view.xml b/addons/account/report/account_account_report_view.xml
new file mode 100644
index 00000000000..a2b4903c8d9
--- /dev/null
+++ b/addons/account/report/account_account_report_view.xml
@@ -0,0 +1,83 @@
+
+
+
+
+ account.account.report.tree
+ account.account.report
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ account.account.report.graph
+ account.account.report
+ graph
+
+
+
+
+
+
+
+
+
+
+
+ account.account.report.search
+ account.account.report
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Accounts
+ account.account.report
+ form
+ tree,graph
+ {"search_default_Company":1,"search_default_At Date":1,'group_by_no_leaf':1,'group_by':[]}
+
+
+
+
+
+
+
diff --git a/addons/account/report/account_report_view.xml b/addons/account/report/account_report_view.xml
index f0f67b477e3..9b1688730aa 100644
--- a/addons/account/report/account_report_view.xml
+++ b/addons/account/report/account_report_view.xml
@@ -47,7 +47,7 @@
formtree,graph
-
+
@@ -116,7 +116,7 @@
-
+
report.account.sales.tree
@@ -169,7 +169,7 @@
graph,tree
-
+
@@ -237,7 +237,7 @@
graph,tree
-
+
From 33ee081b63216433f93645a132348f22a0c2315e Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Wed, 28 Apr 2010 10:47:19 +0530
Subject: [PATCH 012/389] [IMP]: Improve SQL view report for account.
bzr revid: rch_open_erp-20100428051719-oyb01eo736xz1jot
---
.../account/report/account_account_report_view.xml | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/addons/account/report/account_account_report_view.xml b/addons/account/report/account_account_report_view.xml
index a2b4903c8d9..390fb144b0a 100644
--- a/addons/account/report/account_account_report_view.xml
+++ b/addons/account/report/account_account_report_view.xml
@@ -7,7 +7,7 @@
tree
-
+
@@ -48,8 +48,8 @@
string="Average Rate"
domain="[('currency_mode','=','average')]"/>
+
-
@@ -59,8 +59,11 @@
-
-
+
+
+
+
+
@@ -73,7 +76,7 @@
account.account.reportformtree,graph
- {"search_default_Company":1,"search_default_At Date":1,'group_by_no_leaf':1,'group_by':[]}
+ {"search_default_Account":1,"search_default_At Date":1,'group_by_no_leaf':1,'group_by':[]}
From 2fddb283e50eaf9febd7147d549b196dbb24b9a3 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Wed, 28 Apr 2010 11:57:43 +0530
Subject: [PATCH 013/389] [IMP]:hr_timesheet_sheet:Improved SQL
report.(Timesheet).
bzr revid: apa@tinyerp.com-20100428062743-cwkcunmyn2gjojdi
---
.../report/hr_timesheet_invoice_report_view.xml | 2 +-
addons/hr_timesheet_sheet/report/timesheet_report.py | 11 ++++-------
.../report/timesheet_report_view.xml | 12 +++++-------
3 files changed, 10 insertions(+), 15 deletions(-)
diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
index 4de60162d1a..d61203df1ef 100644
--- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
+++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
@@ -103,7 +103,7 @@
{'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]}
-
+
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index ee016df56d7..7b79470a9b7 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -45,9 +45,8 @@ class timesheet_report(osv.osv):
('draft','Draft'),
('confirm','Confirmed'),
('done','Done')], 'State', readonly=True),
- 'total_att': fields.float('Total Timesheet',readonly=True),
- 'total_ts': fields.float('Total Attendance',readonly=True),
- 'total_diff': fields.float('Difference', readonly=True),
+ 'quantity': fields.float('#Quantity',readonly=True),
+ 'cost': fields.float('#Cost',readonly=True),
}
def init(self, cr):
@@ -64,9 +63,8 @@ class timesheet_report(osv.osv):
to_char(htss.date_current,'MM') as month,
to_char(htss.date_current, 'YYYY-MM-DD') as day,
count(*) as nbr,
- sum(day.total_attendance) as total_att,
- sum(day.total_timesheet) as total_ts,
- sum(day.total_difference) as total_diff,
+ sum(aal.unit_amount) as quantity,
+ sum(aal.amount) as cost,
aal.account_id,
htss.user_id,
htss.company_id,
@@ -75,7 +73,6 @@ class timesheet_report(osv.osv):
from account_analytic_line as aal
left join hr_analytic_timesheet as hat ON (hat.line_id=aal.id)
left join hr_timesheet_sheet_sheet as htss ON (hat.line_id=htss.id)
- left join hr_timesheet_sheet_sheet_day AS day ON (htss.id = day.sheet_id)
group by
to_char(htss.date_current,'YYYY'),
to_char(htss.date_current,'MM'),
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
index 976b2a6f8ea..2520d5054fb 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
@@ -7,10 +7,9 @@
graph
-
-
-
-
+
+
+
@@ -25,9 +24,8 @@
-
-
-
+
+
From f438daad1217c231fdb6a7526a963d0b38b723d5 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Wed, 28 Apr 2010 12:24:28 +0530
Subject: [PATCH 014/389] [IMP]: Improve SQL view report for crm lead by adding
fields. Also add #Accounts in account report.
bzr revid: rch_open_erp-20100428065428-svgm9aq7juqaalqa
---
.../account/report/account_account_report.py | 4 +++-
.../report/account_account_report_view.xml | 1 +
addons/crm/report/crm_lead_report.py | 9 ++++++++
addons/crm/report/crm_lead_report_view.xml | 23 +++++++++++++++++++
4 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/addons/account/report/account_account_report.py b/addons/account/report/account_account_report.py
index a872a7173e7..8a18c7d89f1 100644
--- a/addons/account/report/account_account_report.py
+++ b/addons/account/report/account_account_report.py
@@ -42,7 +42,8 @@ class account_account_report(osv.osv):
'user_type': fields.many2one('account.account.type', 'Account Type',readonly=True),
'credit': fields.float('Credit', readonly=True),
'debit': fields.float('Debit', readonly=True),
- 'balance': fields.float('Balance', readonly=True)
+ 'balance': fields.float('Balance', readonly=True),
+ 'nbr': fields.integer('#Accounts', readonly=True),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'account_account_report')
@@ -50,6 +51,7 @@ class account_account_report(osv.osv):
create or replace view account_account_report as (
select
min(a.id) as id,
+ count(distinct a.id) as nbr,
a.name,
a.code,
a.type as type,
diff --git a/addons/account/report/account_account_report_view.xml b/addons/account/report/account_account_report_view.xml
index 390fb144b0a..7388beb05f9 100644
--- a/addons/account/report/account_account_report_view.xml
+++ b/addons/account/report/account_account_report_view.xml
@@ -12,6 +12,7 @@
+
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index 92aeb7f28ec..fb30dd58182 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -54,6 +54,10 @@ class crm_lead_report(osv.osv):
('object_id.model', '=', 'crm.lead')]"),
'date_closed': fields.datetime('Closed', readonly=True),
'date_open': fields.datetime('Opened', readonly=True),
+ 'date_deadline': fields.date('Deadline', readonly=True),
+ 'opportunity_id': fields.many2one('crm.opportunity', 'Opportunity',readonly=True),
+ 'country_id': fields.many2one('res.country', 'Country' , readonly=True),
+ 'state_id': fields.many2one('res.country.state', 'State' , readonly=True)
}
def init(self, cr):
@@ -85,6 +89,10 @@ class crm_lead_report(osv.osv):
c.type_id as type_id,
c.date_closed as date_closed,
c.date_open as date_open,
+ c.opportunity_id as opportunity_id,
+ c.country_id as country_id,
+ c.state_id as state_id,
+ c.date_deadline as date_deadline,
date_trunc('day',c.create_date) as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
from
@@ -93,6 +101,7 @@ class crm_lead_report(osv.osv):
c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id
,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
,c.priority,c.type_id,c.date_closed,c.date_open
+ ,c.opportunity_id,c.country_id,c.state_id,c.date_deadline
)""")
crm_lead_report()
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index 6ef0d90ac97..ab648d75ea2 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -26,6 +26,10 @@
+
+
+
+
@@ -78,7 +82,16 @@
+
+
+
+
+
+
+
+
+
@@ -96,6 +109,16 @@
context="{'group_by':'priority'}" />
+
+
+
+
+
+
From 335e59c2904587502c822df35d122356c7ad2554 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Wed, 28 Apr 2010 15:34:04 +0530
Subject: [PATCH 015/389] [IMP]: Improve SQL report for crm claim and crm
fundraising.
bzr revid: rch_open_erp-20100428100404-8rti5e8kzobayv16
---
addons/crm/report/crm_claim_report.py | 9 ++++++++-
addons/crm/report/crm_claim_report_view.xml | 15 ++++++++++++++-
addons/crm/report/crm_fundraising_report.py | 8 ++++++--
addons/crm/report/crm_fundraising_report_view.xml | 4 ++++
4 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/addons/crm/report/crm_claim_report.py b/addons/crm/report/crm_claim_report.py
index 74b95864759..ef769042ea8 100644
--- a/addons/crm/report/crm_claim_report.py
+++ b/addons/crm/report/crm_claim_report.py
@@ -48,7 +48,10 @@ class crm_claim_report(osv.osv):
('object_id.model', '=', 'crm.claim')]"),
'date_closed': fields.datetime('Closed', readonly=True),
'canal_id': fields.many2one('res.partner.canal','Channel',domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]"),
- 'som': fields.many2one('res.partner.som', 'State of Mind')
+ 'som': fields.many2one('res.partner.som', 'State of Mind'),
+ 'claim_date': fields.datetime('Date Of Claim',readonly=True),
+ 'deadline_date': fields.datetime('Deadline ',readonly=True),
+ 'partner_address_id': fields.many2one('res.partner.address','Contact ',readonly=True),
}
def init(self, cr):
@@ -81,6 +84,9 @@ class crm_claim_report(osv.osv):
c.date_closed as date_closed,
c.canal_id as canal_id,
c.som as som,
+ c.create_date as claim_date,
+ c.date_deadline as deadline_date,
+ c.partner_address_id as partner_address_id,
date_trunc('day',c.create_date) as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
from
@@ -89,6 +95,7 @@ class crm_claim_report(osv.osv):
c.state, c.user_id,c.section_id, c.stage_id,\
c.categ_id,c.partner_id,c.company_id,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
,c.priority,c.type_id,c.date_closed,c.canal_id,c.som
+ ,c.create_date,c.date_deadline,c.partner_address_id
)""")
crm_claim_report()
diff --git a/addons/crm/report/crm_claim_report_view.xml b/addons/crm/report/crm_claim_report_view.xml
index 74ebbd56d0b..66c1c6ff930 100644
--- a/addons/crm/report/crm_claim_report_view.xml
+++ b/addons/crm/report/crm_claim_report_view.xml
@@ -27,6 +27,9 @@
+
+
+
@@ -81,11 +84,16 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/report/crm_fundraising_report.py b/addons/crm/report/crm_fundraising_report.py
index 5765b7367b0..9e1a1111253 100644
--- a/addons/crm/report/crm_fundraising_report.py
+++ b/addons/crm/report/crm_fundraising_report.py
@@ -44,7 +44,10 @@ class crm_fundraising_report(osv.osv):
'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
'date_closed': fields.datetime('Closed', readonly=True),
'canal_id': fields.many2one('res.partner.canal','Channel',domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]"),
- 'som': fields.many2one('res.partner.som', 'State of Mind')
+ 'som': fields.many2one('res.partner.som', 'State of Mind'),
+ 'type_id': fields.many2one('crm.case.resource.type', 'Fundraising Type', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.fundraising')]"),
}
def init(self, cr):
@@ -75,6 +78,7 @@ class crm_fundraising_report(osv.osv):
c.date_closed as date_closed,
c.canal_id as canal_id,
c.som as som,
+ c.type_id as type_id,
date_trunc('day',c.create_date) as create_date,
sum(planned_revenue) as amount_revenue,
sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
@@ -85,7 +89,7 @@ class crm_fundraising_report(osv.osv):
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
c.state, c.user_id,c.section_id,c.categ_id,c.partner_id,c.company_id,
c.create_date,to_char(c.create_date, 'YYYY-MM-DD'),c.priority,c.date_closed
- ,c.canal_id,c.som
+ ,c.canal_id,c.som,c.type_id
)""")
crm_fundraising_report()
diff --git a/addons/crm/report/crm_fundraising_report_view.xml b/addons/crm/report/crm_fundraising_report_view.xml
index 7236df4a8b4..95410010edf 100644
--- a/addons/crm/report/crm_fundraising_report_view.xml
+++ b/addons/crm/report/crm_fundraising_report_view.xml
@@ -28,6 +28,7 @@
+
@@ -81,6 +82,7 @@
+
@@ -95,6 +97,8 @@
context="{'group_by':'canal_id'}" />
+
From 1a3e8c3f79542b371506e86018926cc219c1f094 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Wed, 28 Apr 2010 17:57:46 +0530
Subject: [PATCH 016/389] [IMP]:mrp:Improved SQL report.(Production).
bzr revid: apa@tinyerp.com-20100428122746-1w3vuzwglgl22588
---
addons/mrp/report/mrp_production_order.py | 23 +++++++++++++++----
.../mrp/report/mrp_production_order_view.xml | 18 +++++++++++----
2 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/addons/mrp/report/mrp_production_order.py b/addons/mrp/report/mrp_production_order.py
index 96910e205d7..c5bc5020e20 100644
--- a/addons/mrp/report/mrp_production_order.py
+++ b/addons/mrp/report/mrp_production_order.py
@@ -33,6 +33,8 @@ class mrp_production_order(osv.osv):
'day': fields.char('Day',size=64,readonly=True),
'origin': fields.char('Source Document', size=64),
'nbr': fields.integer('# of Orders', readonly=True),
+ 'products_to_consumme': fields.integer('Products to Consumme', readonly=True),
+ 'consummed_products': fields.integer('Consummed Products', readonly=True),
'date': fields.date('Date', readonly=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True),
'product_qty': fields.float('Product Qty', readonly=True),
@@ -53,6 +55,7 @@ class mrp_production_order(osv.osv):
'bom_id': fields.many2one('mrp.bom', 'Bill of Material',readonly=True),
'routing_id': fields.many2one('mrp.routing', string='Routing',readonly=True),
'picking_id': fields.many2one('stock.picking', 'Picking list', readonly=True),
+ 'product_uom': fields.many2one('product.uom', 'Product UOM', readonly=True),
'priority': fields.selection([('0','Not urgent'),
('1','Normal'),
('2','Urgent'),
@@ -72,9 +75,20 @@ class mrp_production_order(osv.osv):
to_char(s.create_date, 'MM') as month,
to_char(s.create_date, 'YYYY-MM-DD') as day,
l.product_id as product_id,
+ l.product_uom,
sum(l.product_qty * u.factor) as product_qty,
s.company_id as company_id,
count(*) as nbr,
+ (select count(ll.id) from mrp_production_move_ids as mv
+ left join stock_move as sm ON (sm.id=mv.move_id)
+ left join mrp_production_product_line as ll ON (ll.id=mv.production_id)
+ where sm.state not in ('done','cancel') and ll.id=l.id
+ group by ll.id) as products_to_consumme,
+ (select count(ll.id) from mrp_production_move_ids as mv
+ left join stock_move as sm ON (sm.id=mv.move_id)
+ left join mrp_production_product_line as ll ON (ll.id=mv.production_id)
+ where sm.state in ('done','cancel') and ll.id=l.id
+ group by ll.id) as consummed_products,
s.location_src_id,
s.location_dest_id,
s.bom_id,
@@ -86,11 +100,9 @@ class mrp_production_order(osv.osv):
s.origin,
s.priority,
s.state
- from
- mrp_production_product_line l
- left join
- mrp_production s on (s.id=l.production_id)
- left join product_uom u on (u.id=l.product_uom)
+ from mrp_production_product_line l
+ left join mrp_production s on (s.id=l.production_id)
+ left join product_uom u on (u.id=l.product_uom)
group by
to_char(s.create_date, 'YYYY'),
to_char(s.create_date, 'MM'),
@@ -98,6 +110,7 @@ class mrp_production_order(osv.osv):
to_date(to_char(s.create_date, 'MM-dd-YYYY'),'MM-dd-YYYY'),
l.product_id,
l.product_uom,
+ l.id,
s.bom_id,
s.routing_id,
s.picking_id,
diff --git a/addons/mrp/report/mrp_production_order_view.xml b/addons/mrp/report/mrp_production_order_view.xml
index 04188f43752..acac00d590a 100644
--- a/addons/mrp/report/mrp_production_order_view.xml
+++ b/addons/mrp/report/mrp_production_order_view.xml
@@ -16,6 +16,8 @@
+
+
@@ -28,6 +30,8 @@
+
+
@@ -81,25 +85,30 @@
+
-
-
+
+
+
+
+
+
+
-
+
-
@@ -113,6 +122,7 @@
+
From 8a54668cba1b026d17c2a8e61413d4558a63cac7 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Wed, 28 Apr 2010 19:08:56 +0530
Subject: [PATCH 017/389] [IMP]: Improve SQL report for task and project_issue.
bzr revid: rch_open_erp-20100428133856-4lserqno5zsnvjrq
---
addons/project/report/project_report_view.xml | 4 +--
.../report/project_issue_report.py | 22 +++++++++++---
.../report/project_issue_report_view.xml | 30 +++++++++++++------
3 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 9ee400e6472..ef0abd119fa 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -88,7 +88,7 @@
help="Non Assigned Tasks to users"
domain="[('user_id','=',False)]"/>
-
+
-
+
diff --git a/addons/project_issue/report/project_issue_report.py b/addons/project_issue/report/project_issue_report.py
index 775e4b933f0..a14eb67bab4 100755
--- a/addons/project_issue/report/project_issue_report.py
+++ b/addons/project_issue/report/project_issue_report.py
@@ -11,16 +11,23 @@ class project_issue_report(osv.osv):
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('object_id.model', '=', 'project.issue')]"),
'nbr': fields.integer('# of Issues', readonly=True),
'delay_close': fields.float('Avg Closing Delay', digits=(16,2), readonly=True, group_operator="avg",
- help="Number of Days to close the project issue"),
+ help="Number of Days to close the project issue"),
+ 'delay_open': fields.float('Avg Opening Delay', digits=(16,2), readonly=True, group_operator="avg",
+ help="Number of Days to open the project issue"),
'company_id' : fields.many2one('res.company', 'Company'),
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'project_id':fields.many2one('project.project', 'Project',readonly=True),
'type_id': fields.many2one('crm.case.resource.type', 'Type', domain="[('object_id.model', '=', 'project.issue')]"),
'date_closed': fields.datetime('Close Date', readonly=True),
+ 'date_open': fields.datetime('Opened', readonly=True),
'assigned_to' : fields.many2one('res.users', 'Assigned to',readonly=True),
'partner_id': fields.many2one('res.partner','Partner',domain="[('object_id.model', '=', 'project.issue')]"),
'canal_id': fields.many2one('res.partner.canal', 'Channel',readonly=True),
- 'task_id': fields.many2one('project.task', 'Task',domain="[('object_id.model', '=', 'project.issue')]" )
+ 'task_id': fields.many2one('project.task', 'Task',domain="[('object_id.model', '=', 'project.issue')]" ),
+ 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account',
+ domain="[('partner_id', '=', partner_id)]",
+ required=True),
+ 'partner_address_id': fields.many2one('res.partner.address','Contact ',readonly=True),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'project_issue_report')
@@ -46,8 +53,12 @@ class project_issue_report(osv.osv):
c.partner_id,
c.canal_id,
c.task_id,
+ c.analytic_account_id as analytic_account_id,
+ c.partner_address_id as partner_address_id,
+ c.date_open as date_open,
date_trunc('day',c.create_date) as create_date,
- avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
+ avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close,
+ avg(extract('epoch' from (c.date_open-c.create_date)))/(3600*24) as delay_open
from
project_issue c
left join
@@ -70,7 +81,10 @@ class project_issue_report(osv.osv):
c.assigned_to,
c.partner_id,
c.canal_id,
- c.task_id
+ c.task_id,
+ c.date_open,
+ c.analytic_account_id,
+ c.partner_address_id
)""")
diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml
index 24290530be7..f075a562ca2 100755
--- a/addons/project_issue/report/project_issue_report_view.xml
+++ b/addons/project_issue/report/project_issue_report_view.xml
@@ -15,7 +15,6 @@
-
@@ -23,11 +22,16 @@
+
+
+
+
+
@@ -65,17 +69,21 @@
-
-
-
-
+
-
+
+
+
+
-
+
+
+
+
+
@@ -90,11 +98,15 @@
+
+
-
-
+
+
+
+
From 8415f50d3edbe984886139a5d13af338be60b14f Mon Sep 17 00:00:00 2001
From: "nel@tinyerp.com" <>
Date: Wed, 28 Apr 2010 16:40:43 +0200
Subject: [PATCH 018/389] [FIX] month field on views
bzr revid: nel@tinyerp.com-20100428144043-wl12x361lpzvcqa1
---
addons/account/report/account_invoice_report_view.xml | 2 +-
addons/hr_expense/report/hr_expense_report_view.xml | 2 +-
addons/hr_holidays/report/available_holidays_view.xml | 2 +-
.../hr_recruitment/report/hr_recruitment_report_view.xml | 8 ++++----
addons/sale/report/sale_report_view.xml | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index 5a833e454fb..c4832d82309 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -129,7 +129,7 @@
-
+
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index 972557edd0c..ae111fa6796 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -121,7 +121,7 @@
-
+
diff --git a/addons/hr_holidays/report/available_holidays_view.xml b/addons/hr_holidays/report/available_holidays_view.xml
index cb610d4214a..5d6cc41a730 100644
--- a/addons/hr_holidays/report/available_holidays_view.xml
+++ b/addons/hr_holidays/report/available_holidays_view.xml
@@ -81,7 +81,7 @@
-
+
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index 83f7d2b7602..f9a144dadc4 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -119,9 +119,9 @@
-
-
-
+
+
+
@@ -136,7 +136,7 @@
hr.recruitment.reportformtree,graph
- {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_month':1,'search_default_degree':1,'search_default_job':1,'group_by_no_leaf':1,'group_by':[]}
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index 72707f6e01d..73029cb88fa 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -114,7 +114,7 @@
-
+
From 29b9372b9cd7214395dc35baf60984dadd917249 Mon Sep 17 00:00:00 2001
From: "nel@tinyerp.com" <>
Date: Wed, 28 Apr 2010 16:53:19 +0200
Subject: [PATCH 019/389] rename button
bzr revid: nel@tinyerp.com-20100428145319-akcdb0ld4lcz8qtw
---
addons/crm/report/crm_phonecall_report_view.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml
index 5ad0a63bdd8..e80cd8f82da 100644
--- a/addons/crm/report/crm_phonecall_report_view.xml
+++ b/addons/crm/report/crm_phonecall_report_view.xml
@@ -88,7 +88,7 @@
-
From a3f82274260ad12288dd7d1df1f82c9b14ff2453 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 11:59:53 +0530
Subject: [PATCH 020/389] [IMP]:hr_recruitment:Add Partner and Partner c
bzr revid: apa@tinyerp.com-20100429062953-qt8zrs0d1uer5z2w
---
.../report/hr_recruitment_report.py | 6 +++++
.../report/hr_recruitment_report_view.xml | 23 +++++++++++++------
2 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/addons/hr_recruitment/report/hr_recruitment_report.py b/addons/hr_recruitment/report/hr_recruitment_report.py
index f59ea414fec..52fbc94be8a 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report.py
+++ b/addons/hr_recruitment/report/hr_recruitment_report.py
@@ -44,6 +44,8 @@ class hr_recruitment_report(osv.osv):
'priority': fields.selection(hr_recruitment.AVAILABLE_PRIORITIES, 'Appreciation'),
'salary_prop' : fields.float("Salary Proposed"),
'salary_exp' : fields.float("Salary Expected"),
+ 'partner_id': fields.many2one('res.partner', 'Partner',readonly=True),
+ 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact',readonly=True),
'available' : fields.float("Availability")
}
@@ -60,7 +62,9 @@ class hr_recruitment_report(osv.osv):
to_char(s.create_date, 'MM') as month,
to_char(s.create_date, 'YYYY-MM-DD') as day,
s.state,
+ s.partner_id,
s.company_id,
+ s.partner_address_id,
s.user_id,
s.job_id,
s.type_id,
@@ -79,6 +83,8 @@ class hr_recruitment_report(osv.osv):
date_trunc('day',s.create_date),
date_trunc('day',s.date_closed),
s.state,
+ s.partner_id,
+ s.partner_address_id,
s.company_id,
s.user_id,
s.stage_id,
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index f9a144dadc4..4cdaaca68bc 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -13,6 +13,8 @@
+
+
@@ -100,29 +102,36 @@
string="Hired"
name="done"
domain="[('state','=','done')]"/>
-
+
+
-
-
+
+
+
+
+
+
-
+
+
-
+
+
From 6460e5ab80a356988ebf38491134613d9c7e9b2c Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Thu, 29 Apr 2010 12:11:34 +0530
Subject: [PATCH 021/389] [FIX]: Resolve confusion between state and country's
state in crm lead report.
bzr revid: rch_open_erp-20100429064134-apl3s8gxt6wod3zc
---
addons/crm/report/crm_lead_report_view.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index ab648d75ea2..becf76db72d 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -28,7 +28,7 @@
-
+
@@ -86,7 +86,7 @@
-
+
@@ -117,7 +117,7 @@
-
From 68137a3117ed1efa3b82deb380f82593b4f70828 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Thu, 29 Apr 2010 13:57:53 +0530
Subject: [PATCH 022/389] [IMP]: Improve SQL report for Invoice.
bzr revid: rch_open_erp-20100429082753-ao26rotnkwjwmtfh
---
.../account/report/account_invoice_report.py | 21 +++++++++--
.../report/account_invoice_report_view.xml | 37 +++++++++++++++----
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py
index 36fa5a0d132..5aff8f34f89 100644
--- a/addons/account/report/account_invoice_report.py
+++ b/addons/account/report/account_invoice_report.py
@@ -61,6 +61,11 @@ class account_invoice_report(osv.osv):
('paid','Done'),
('cancel','Cancelled')
], 'Order State', readonly=True),
+ 'date_due': fields.date('Due Date', readonly=True),
+ 'address_contact_id': fields.many2one('res.partner.address', 'Contact Address', readonly=True),
+ 'address_invoice_id': fields.many2one('res.partner.address', 'Invoice Address', readonly=True),
+ 'account_id': fields.many2one('account.account', 'Account',readonly=True),
+ 'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',readonly=True)
}
_order = 'date desc'
def init(self, cr):
@@ -87,8 +92,13 @@ class account_invoice_report(osv.osv):
(sum(l.quantity*l.price_unit)/sum(l.quantity * u.factor))::decimal(16,2) as price_average,
count(*) as nbr,
s.type as type,
- s.state
- from
+ s.state,
+ s.date_due as date_due,
+ s.address_contact_id as address_contact_id,
+ s.address_invoice_id as address_invoice_id,
+ s.account_id as account_id,
+ s.partner_bank as partner_bank
+ from
account_invoice_line l
left join
account_invoice s on (s.id=l.invoice_id)
@@ -106,7 +116,12 @@ class account_invoice_report(osv.osv):
s.period_id,
s.fiscal_position,
s.currency_id,
- s.journal_id
+ s.journal_id,
+ s.date_due,
+ s.address_contact_id,
+ s.address_invoice_id,
+ s.account_id,
+ s.partner_bank
)
""")
account_invoice_report()
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index c4832d82309..4764e0a5942 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -27,6 +27,11 @@
+
+
+
+
+
@@ -76,7 +81,6 @@
domain="[('state', '=' ,'open')]"
help = "In progress tasks"/>
-
+
@@ -102,28 +107,44 @@
domain="[('state', '=' ,'cancel')]"
help = "Cancelled tasks"/>
+
+
-
+
+
+
+
+
+
-
+
+
+
+
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
From c92db23ececc941655c6b5d8e24d0ccfa981dfaa Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 14:22:09 +0530
Subject: [PATCH 023/389] [IMP]:hr_expense:Improved SQL report.(Expense).
bzr revid: apa@tinyerp.com-20100429085209-lwal4qdyci0eu92p
---
addons/hr_expense/report/hr_expense_report.py | 16 +++++++++++-----
.../hr_expense/report/hr_expense_report_view.xml | 5 +++++
2 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py
index cc3f282e9fa..7f0c6cc09a6 100644
--- a/addons/hr_expense/report/hr_expense_report.py
+++ b/addons/hr_expense/report/hr_expense_report.py
@@ -45,7 +45,9 @@ class hr_expense_report(osv.osv):
'department_id':fields.many2one('hr.department','Department',readonly=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
+ 'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
'price_total':fields.float('Total Price', readonly=True),
+ 'analytic_account': fields.many2one('account.analytic.account','Analytic account',readonly=True),
'price_average':fields.float('Average Price', readonly=True),
'nbr':fields.integer('# of Lines', readonly=True),
'state': fields.selection([
@@ -67,6 +69,7 @@ class hr_expense_report(osv.osv):
date_trunc('day',s.create_date) as date,
s.employee_id,
s.journal_id,
+ s.currency_id,
to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_confirm,
to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_valid,
s.invoice_id,
@@ -75,6 +78,7 @@ class hr_expense_report(osv.osv):
to_char(date_trunc('day',s.create_date), 'MM') as month,
to_char(date_trunc('day',s.create_date), 'YYYY-MM-DD') as day,
l.product_id as product_id,
+ l.analytic_account as analytic_account,
sum(l.unit_quantity * u.factor) as product_qty,
s.user_id as user_id,
s.company_id as company_id,
@@ -82,18 +86,20 @@ class hr_expense_report(osv.osv):
(sum(l.unit_quantity*l.unit_amount)/sum(l.unit_quantity * u.factor))::decimal(16,2) as price_average,
count(*) as nbr,
s.state
- from
- hr_expense_line l
- left join
- hr_expense_expense s on (s.id=l.expense_id)
- left join product_uom u on (u.id=l.uom_id)
+ from hr_expense_line l
+ left join hr_expense_expense s on (s.id=l.expense_id)
+ left join product_uom u on (u.id=l.uom_id)
group by
date_trunc('day',s.create_date),
+ to_char(date_trunc('day',s.create_date), 'YYYY'),
+ to_char(date_trunc('day',s.create_date), 'MM'),
to_char(date_trunc('day',s.create_date), 'YYYY-MM-DD'),
to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY'),
to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY'),
l.product_id,
+ l.analytic_account,
s.invoice_id,
+ s.currency_id,
s.department_id,
l.uom_id,
s.user_id,
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index ae111fa6796..e2dbe60ef4e 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -14,9 +14,11 @@
+
+
@@ -115,7 +117,10 @@
+
+
+
From c7b027483ee3c78a506cf818999a028e317f2880 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 15:22:43 +0530
Subject: [PATCH 024/389] [IMP]:hr_expense:Add #Products in SQL virw
report..(Expense).
bzr revid: apa@tinyerp.com-20100429095243-p3hq66v38jp6kfdj
---
addons/hr_expense/report/hr_expense_report.py | 3 +++
addons/hr_expense/report/hr_expense_report_view.xml | 1 +
2 files changed, 4 insertions(+)
diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py
index 7f0c6cc09a6..4a983984e57 100644
--- a/addons/hr_expense/report/hr_expense_report.py
+++ b/addons/hr_expense/report/hr_expense_report.py
@@ -50,6 +50,7 @@ class hr_expense_report(osv.osv):
'analytic_account': fields.many2one('account.analytic.account','Analytic account',readonly=True),
'price_average':fields.float('Average Price', readonly=True),
'nbr':fields.integer('# of Lines', readonly=True),
+ 'no_of_products':fields.integer('# of Products', readonly=True),
'state': fields.selection([
('draft', 'Draft'),
('confirm', 'Waiting confirmation'),
@@ -85,6 +86,7 @@ class hr_expense_report(osv.osv):
sum(l.unit_quantity*l.unit_amount) as price_total,
(sum(l.unit_quantity*l.unit_amount)/sum(l.unit_quantity * u.factor))::decimal(16,2) as price_average,
count(*) as nbr,
+ (select unit_quantity from hr_expense_line where id=l.id and product_id is not null) as no_of_products,
s.state
from hr_expense_line l
left join hr_expense_expense s on (s.id=l.expense_id)
@@ -102,6 +104,7 @@ class hr_expense_report(osv.osv):
s.currency_id,
s.department_id,
l.uom_id,
+ l.id,
s.user_id,
s.state,
s.journal_id,
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index e2dbe60ef4e..d717743ff34 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -22,6 +22,7 @@
+
From 9dd2f2d39a794226d9727cfa740b14c53a37b015 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 15:54:30 +0530
Subject: [PATCH 025/389] [IMP]:hr_expense:Add #Accounts in SQL virw
report..(Expense).
bzr revid: apa@tinyerp.com-20100429102430-71xa5n0e2x0o7mx6
---
addons/hr_expense/report/hr_expense_report.py | 2 ++
addons/hr_expense/report/hr_expense_report_view.xml | 1 +
2 files changed, 3 insertions(+)
diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py
index 4a983984e57..2b0f6b4addf 100644
--- a/addons/hr_expense/report/hr_expense_report.py
+++ b/addons/hr_expense/report/hr_expense_report.py
@@ -51,6 +51,7 @@ class hr_expense_report(osv.osv):
'price_average':fields.float('Average Price', readonly=True),
'nbr':fields.integer('# of Lines', readonly=True),
'no_of_products':fields.integer('# of Products', readonly=True),
+ 'no_of_account':fields.integer('# of Accounts', readonly=True),
'state': fields.selection([
('draft', 'Draft'),
('confirm', 'Waiting confirmation'),
@@ -87,6 +88,7 @@ class hr_expense_report(osv.osv):
(sum(l.unit_quantity*l.unit_amount)/sum(l.unit_quantity * u.factor))::decimal(16,2) as price_average,
count(*) as nbr,
(select unit_quantity from hr_expense_line where id=l.id and product_id is not null) as no_of_products,
+ (select count(analytic_account) from hr_expense_line where id=l.id and analytic_account is not null) as no_of_account,
s.state
from hr_expense_line l
left join hr_expense_expense s on (s.id=l.expense_id)
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index d717743ff34..0fb5c46c210 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -23,6 +23,7 @@
+
From ab94bf1e5f2e224a61041404d0c6edbc0062c398 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 16:10:08 +0530
Subject: [PATCH 026/389] [IMP]:hr_expense:improved search view..(Expense).
bzr revid: apa@tinyerp.com-20100429104008-x4w9tzkvd698ldoq
---
addons/hr_expense/report/hr_expense_report_view.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index 0fb5c46c210..0259c617836 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -87,6 +87,8 @@
help="Expenses Non Assigned User"
domain="[('user_id','=',False)]"/>
+
+
@@ -103,13 +105,11 @@
domain="[('state','=','cancelled')]"
help = "Cancelled Expenses"/>
-
-
-
+
-
+
From 889d4d7ebc72e5f61a07615f1a4796e524e15d7e Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Thu, 29 Apr 2010 17:16:49 +0530
Subject: [PATCH 027/389] [IMP]: Improve SQL report for Invoice by adding sum
Residual and Delay To Pay fields.
bzr revid: rch_open_erp-20100429114649-o46vjjrf11y4ulyx
---
addons/account/report/account_invoice_report.py | 15 ++++++++++++---
.../report/account_invoice_report_view.xml | 2 ++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py
index 5aff8f34f89..af8ef08e353 100644
--- a/addons/account/report/account_invoice_report.py
+++ b/addons/account/report/account_invoice_report.py
@@ -65,7 +65,9 @@ class account_invoice_report(osv.osv):
'address_contact_id': fields.many2one('res.partner.address', 'Contact Address', readonly=True),
'address_invoice_id': fields.many2one('res.partner.address', 'Invoice Address', readonly=True),
'account_id': fields.many2one('account.account', 'Account',readonly=True),
- 'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',readonly=True)
+ 'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',readonly=True),
+ 'residual':fields.float('Total Residual', readonly=True),
+ 'delay_to_pay':fields.float('Avg. Delay To Pay', readonly=True, group_operator="avg"),
}
_order = 'date desc'
def init(self, cr):
@@ -97,12 +99,19 @@ class account_invoice_report(osv.osv):
s.address_contact_id as address_contact_id,
s.address_invoice_id as address_invoice_id,
s.account_id as account_id,
- s.partner_bank as partner_bank
+ s.partner_bank as partner_bank,
+ sum(s.residual) as residual,
+ case when s.state != 'paid' then null else
+ extract(epoch from avg(am.date_created-l.create_date))/(24*60*60)::decimal(16,2)
+ end as delay_to_pay
from
account_invoice_line l
left join
account_invoice s on (s.id=l.invoice_id)
- left join product_uom u on (u.id=l.uos_id)
+ left join product_uom u on (u.id=l.uos_id),
+ account_move_line am left join account_invoice i on (i.move_id=am.move_id)
+ where
+ am.account_id=i.account_id
group by
s.type,
s.date_invoice,
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index 4764e0a5942..fea7dbadd93 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -32,6 +32,8 @@
+
+
From 565ba12d6cd0441f2940ea34379d443ef362a2d4 Mon Sep 17 00:00:00 2001
From: "aag (Open ERP)" <>
Date: Thu, 29 Apr 2010 18:15:40 +0530
Subject: [PATCH 028/389] [ADD]: Add SQL report for Entries.
bzr revid: rch_open_erp-20100429124540-b49s7pibrjk4r4i3
---
addons/account/__openerp__.py | 1 +
addons/account/report/__init__.py | 1 +
.../account/report/account_entries_report.py | 96 ++++++++++++++++
.../report/account_entries_report_view.xml | 106 ++++++++++++++++++
4 files changed, 204 insertions(+)
create mode 100644 addons/account/report/account_entries_report.py
create mode 100644 addons/account/report/account_entries_report_view.xml
diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index e73b3885089..e87818d40fc 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -98,6 +98,7 @@ module named account_voucherss
'company_view.xml',
'account_installer.xml',
'report/account_invoice_report_view.xml',
+ 'report/account_entries_report_view.xml',
'report/account_report_view.xml',
'report/account_analytic_report_view.xml',
'report/account_account_report_view.xml'
diff --git a/addons/account/report/__init__.py b/addons/account/report/__init__.py
index 959a76013f9..51cb0810f43 100644
--- a/addons/account/report/__init__.py
+++ b/addons/account/report/__init__.py
@@ -38,5 +38,6 @@ import account_invoice_report
import account_report
import account_analytic_report
import account_account_report
+import account_entries_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_entries_report.py b/addons/account/report/account_entries_report.py
new file mode 100644
index 00000000000..83602ded81b
--- /dev/null
+++ b/addons/account/report/account_entries_report.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import tools
+from osv import fields,osv
+
+class account_entries_report(osv.osv):
+ _name = "account.entries.report"
+ _description = "Entries"
+ _auto = False
+ _rec_name = 'date'
+ _columns = {
+ 'date': fields.date('Date', readonly=True),
+ 'nbr':fields.integer('# of Entries', readonly=True),
+ 'nbl':fields.integer('# of Lines', readonly=True),
+ 'amount': fields.float('Amount',readonly=True),
+ 'year': fields.char('Year', size=4, readonly=True),
+ 'day': fields.char('Day', size=128, readonly=True),
+ 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
+ ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
+ ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
+ 'ref': fields.char('Reference', size=64,readonly=True),
+ 'period_id': fields.many2one('account.period', 'Period', readonly=True),
+ 'journal_id': fields.many2one('account.journal', 'Journal', readonly=True),
+ 'state': fields.selection([('draft','Draft'), ('posted','Posted')], 'State',readonly=True,
+ help='When new account move is created the state will be \'Draft\'. When all the payments are done it will be in \'Posted\' state.'),
+ 'partner_id': fields.many2one('res.partner','Partner', readonly=True),
+ 'type': fields.selection([
+ ('pay_voucher','Cash Payment'),
+ ('bank_pay_voucher','Bank Payment'),
+ ('rec_voucher','Cash Receipt'),
+ ('bank_rec_voucher','Bank Receipt'),
+ ('cont_voucher','Contra'),
+ ('journal_sale_vou','Journal Sale'),
+ ('journal_pur_voucher','Journal Purchase'),
+ ('journal_voucher','Journal Voucher'),
+ ],'Type',readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ }
+ _order = 'date desc'
+
+ def init(self, cr):
+ tools.drop_view_if_exists(cr, 'account_entries_report')
+ cr.execute("""
+ create or replace view account_entries_report as (
+ select
+ min(l.id) as id,
+ am.ref as ref,
+ am.state as state,
+ am.date as date,
+ count(l.id) as nbr,
+ count(distinct am.id) as nbl,
+ l.debit as amount,
+ to_char(am.date, 'YYYY') as year,
+ to_char(am.date, 'MM') as month,
+ to_char(am.date, 'YYYY-MM-DD') as day,
+ am.company_id as company_id,
+ am.journal_id as journal_id,
+ am.period_id as period_id,
+ l.partner_id as partner_id,
+ am.type as type
+ from
+ account_move_line l
+ left join
+ account_move am on (am.id=l.move_id)
+ group by am.ref,
+ am.state,
+ am.date,
+ am.company_id,
+ am.journal_id,
+ am.period_id,
+ am.type,
+ l.partner_id,
+ l.debit
+ )
+ """)
+
+account_entries_report()
diff --git a/addons/account/report/account_entries_report_view.xml b/addons/account/report/account_entries_report_view.xml
new file mode 100644
index 00000000000..46f7ac46b83
--- /dev/null
+++ b/addons/account/report/account_entries_report_view.xml
@@ -0,0 +1,106 @@
+
+
+
+
+ account.entries.report.tree
+ account.entries.report
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ account.entries.report.graph
+ account.entries.report
+ graph
+
+
+
+
+
+
+
+
+ account.entries.report.search
+ account.entries.report
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Entries
+ account.entries.report
+ form
+ tree,graph
+ {'search_default_This Month':1,'search_default_Journal':1,'group_by_no_leaf':1,'group_by':[]}
+
+
+
+
+
From 004d37b7a00109b35d676c28966026d828a5b68a Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 18:51:40 +0530
Subject: [PATCH 029/389] [IMP]:stock:improved search view..(Picking).
bzr revid: apa@tinyerp.com-20100429132140-sb1d86mvy6rbj5ii
---
addons/stock/report/report_stock_picking.py | 34 ++++++++++++++++---
.../report/report_stock_picking_view.xml | 25 +++++++++++++-
2 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/addons/stock/report/report_stock_picking.py b/addons/stock/report/report_stock_picking.py
index 7f4ac801399..6e1b778b4b0 100644
--- a/addons/stock/report/report_stock_picking.py
+++ b/addons/stock/report/report_stock_picking.py
@@ -35,12 +35,22 @@ class report_stock_picking(osv.osv):
'nbp': fields.integer('# of Picking', readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
'product_qty': fields.float('# of Products', readonly=True),
+ 'product_id': fields.many2one('product.product', 'Product', readonly=True),
'date': fields.date('Date', readonly=True),
'avg_days_to_deliver': fields.float('Avg Days to Deliver', digits=(16,2), readonly=True, group_operator="avg",
help="Number of Avg Days to deliver"),
'origin': fields.char('Origin', size=64),
'state': fields.selection([('draft', 'Draft'),('auto', 'Waiting'),('confirmed', 'Confirmed'),('assigned', 'Available'),('done', 'Done'),('cancel', 'Cancelled')], 'State'),
'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal'), ('delivery', 'Delivery')], 'Shipping Type', required=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'invoice_state': fields.selection([
+ ("invoiced", "Invoiced"),
+ ("2binvoiced", "To Be Invoiced"),
+ ("none", "Not from Picking")], "Invoice Status",readonly=True),
+ 'min_date': fields.date('Expected Date',help="Expected date for Picking. Default it takes current date"),
+ 'order_date': fields.date('Order Date', help="Date of Order"),
+ 'date_done': fields.date('Date Done', help="Date of completion"),
+ 'max_date': fields.date('Max.Expected Date'),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'report_stock_picking')
@@ -48,6 +58,10 @@ class report_stock_picking(osv.osv):
create or replace view report_stock_picking as (
select
min(sm.id) as id,
+ date_trunc('day',sp.min_date) as min_date,
+ date_trunc('day',sp.date) as order_date,
+ date_trunc('day',sp.date_done) as date_done,
+ date_trunc('day',sp.max_date) as max_date,
to_char(sp.create_date, 'YYYY') as year,
to_char(sp.create_date, 'MM') as month,
to_char(sp.create_date, 'YYYY-MM-DD') as day,
@@ -56,7 +70,10 @@ class report_stock_picking(osv.osv):
count(sm.id) as nbr,
count(distinct sp.id) as nbp,
sum(sm.product_qty) as product_qty,
+ sm.product_id,
sp.type,
+ sp.invoice_state,
+ sp.company_id,
sp.name as reference,
sp.origin,
avg(extract('epoch' from (sp.date_done-sp.create_date)))/(3600*24) as avg_days_to_deliver,
@@ -64,11 +81,18 @@ class report_stock_picking(osv.osv):
from stock_move as sm
left join stock_picking as sp ON (sm.picking_id=sp.id)
group by sp.type,
- sp.create_date,
- sp.address_id,
- sp.name,
- sp.origin,
- sp.state
+ sp.create_date,
+ sp.address_id,
+ sp.name,
+ sm.product_id,
+ date_trunc('day',sp.min_date),
+ date_trunc('day',sp.date),
+ date_trunc('day',sp.date_done),
+ date_trunc('day',sp.max_date),
+ sp.invoice_state,
+ sp.origin,
+ sp.company_id,
+ sp.state
)""")
report_stock_picking()
diff --git a/addons/stock/report/report_stock_picking_view.xml b/addons/stock/report/report_stock_picking_view.xml
index 5d54634d72b..11a8938bd4b 100644
--- a/addons/stock/report/report_stock_picking_view.xml
+++ b/addons/stock/report/report_stock_picking_view.xml
@@ -16,9 +16,16 @@
+
+
+
+
+
+
+
@@ -63,13 +70,29 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 9833cb0448e299b928d6b2b7f1d6d169122db8e5 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Thu, 29 Apr 2010 18:54:51 +0530
Subject: [PATCH 030/389] [IMP]:stock:improved search view..(Picking).
bzr revid: apa@tinyerp.com-20100429132451-mogw5vr4482m4yyf
---
addons/stock/report/report_stock_picking.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/addons/stock/report/report_stock_picking.py b/addons/stock/report/report_stock_picking.py
index 6e1b778b4b0..8b464a35762 100644
--- a/addons/stock/report/report_stock_picking.py
+++ b/addons/stock/report/report_stock_picking.py
@@ -85,6 +85,9 @@ class report_stock_picking(osv.osv):
sp.address_id,
sp.name,
sm.product_id,
+ to_char(sp.create_date, 'YYYY'),
+ to_char(sp.create_date, 'MM'),
+ to_char(sp.create_date, 'YYYY-MM-DD'),
date_trunc('day',sp.min_date),
date_trunc('day',sp.date),
date_trunc('day',sp.date_done),
From 6a586ba4a94f74324a82867928068f5c6f80b6d6 Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Fri, 30 Apr 2010 14:47:27 +0530
Subject: [PATCH 031/389] [IMP]:hr_timesheet_sheet:improved search
view..(Timesheet).
bzr revid: apa@tinyerp.com-20100430091727-mjmivw3t38xb0obh
---
.../report/timesheet_report.py | 10 ++++
.../report/timesheet_report_view.xml | 46 +++++++++++++------
2 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index 7b79470a9b7..3dd8d161c5f 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -33,7 +33,11 @@ class timesheet_report(osv.osv):
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'name': fields.char('Description', size=64,readonly=True),
+ 'product_id' : fields.many2one('product.product', 'Product'),
+ 'general_account_id' : fields.many2one('account.account', 'General Account', readonly=True),
'user_id': fields.many2one('res.users', 'User',readonly=True),
+ 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Type of Invoicing',readonly=True),
+ 'account_id': fields.many2one('account.analytic.account', 'Analytic Account',readonly=True),
'nbr': fields.integer('#Nbr',readonly=True),
'company_id': fields.many2one('res.company', 'Company',readonly=True),
'department_id':fields.many2one('hr.department','Department',readonly=True),
@@ -66,6 +70,9 @@ class timesheet_report(osv.osv):
sum(aal.unit_amount) as quantity,
sum(aal.amount) as cost,
aal.account_id,
+ aal.product_id,
+ aal.to_invoice,
+ aal.general_account_id,
htss.user_id,
htss.company_id,
htss.department_id,
@@ -81,6 +88,9 @@ class timesheet_report(osv.osv):
htss.date_from,
htss.date_to,
htss.date_current,
+ aal.to_invoice,
+ aal.product_id,
+ aal.general_account_id,
htss.name,
htss.company_id,
htss.state,
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
index 2520d5054fb..57df8dcdf32 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
@@ -29,6 +29,10 @@
+
+
+
+
@@ -61,10 +65,8 @@
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
From 40e34eb66ea1bd44a9480fbac348350a83edba27 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Thu, 22 Apr 2010 15:39:10 +0530
Subject: [PATCH 032/389] [IMP]: Improve sale report search view.
bzr revid: rch_open_erp-20100422100910-5e6qqo5f0qmdxvmb
---
addons/sale/report/sale_report.py | 22 ++++++++++++++++++++--
addons/sale/report/sale_report_view.xml | 21 +++++++++++++++++++++
2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index d1081a4b21f..0372de7ce42 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -57,6 +57,12 @@ class sale_report(osv.osv):
('done', 'Done'),
('cancel', 'Cancelled')
], 'Order State', readonly=True),
+ 'partner_invoice_id': fields.many2one('res.partner.address', 'Invoice Address', readonly=True),
+ 'partner_order_id': fields.many2one('res.partner.address', 'Ordering Contact', readonly=True),
+ 'partner_shipping_id': fields.many2one('res.partner.address', 'Shipping Address', readonly=True),
+ 'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True),
+ 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
+ 'date_confirm': fields.date('Confirmation Date', readonly=True)
}
_order = 'date desc'
def init(self, cr):
@@ -81,7 +87,13 @@ class sale_report(osv.osv):
sum(l.product_uom_qty*l.price_unit) as price_total,
(sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty * u.factor))::decimal(16,2) as price_average,
count(*) as nbr,
- s.state
+ s.state,
+ s.partner_invoice_id as partner_invoice_id,
+ s.partner_order_id as partner_order_id,
+ s.partner_shipping_id as partner_shipping_id,
+ s.pricelist_id as pricelist_id,
+ s.project_id as analytic_account_id,
+ s.date_confirm as date_confirm
from
sale_order_line l
left join
@@ -97,7 +109,13 @@ class sale_report(osv.osv):
s.shop_id,
s.company_id,
s.fiscal_position,
- s.payment_term
+ s.payment_term,
+ s.partner_invoice_id,
+ s.partner_order_id,
+ s.partner_shipping_id,
+ s.pricelist_id,
+ s.project_id,
+ s.date_confirm
)
""")
sale_report()
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index 73029cb88fa..41fe598b597 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -24,6 +24,12 @@
+
+
+
+
+
+
@@ -97,8 +103,16 @@
+
+
+
+
+
+
+
+
@@ -112,6 +126,13 @@
+
+
+
+
+
+
+
From da53f2831ebd7122a50df9258b9583b90a97f06d Mon Sep 17 00:00:00 2001
From: apa-tiny
Date: Fri, 30 Apr 2010 16:25:01 +0530
Subject: [PATCH 033/389] [IMP]:purchase:improved search view..(Purchase
Order).
bzr revid: apa@tinyerp.com-20100430105501-bkxd2hifzinkbrkl
---
addons/purchase/report/purchase_report.py | 18 +++++++++
.../purchase/report/purchase_report_view.xml | 38 +++++++++++++++----
2 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py
index 76d018680d2..d6fd4000633 100644
--- a/addons/purchase/report/purchase_report.py
+++ b/addons/purchase/report/purchase_report.py
@@ -54,6 +54,12 @@ class purchase_report(osv.osv):
'location_id': fields.many2one('stock.location', 'Destination', readonly=True),
'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position',readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
+ 'partner_address_id':fields.many2one('res.partner.address', 'Address', readonly=True),
+ 'dest_address_id':fields.many2one('res.partner.address', 'Dest. Address',readonly=True),
+ 'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', readonly=True),
+ 'date_approve':fields.date('Date Approved', readonly=True),
+ 'expected_date':fields.date('Expected Date', readonly=True),
+ 'validator' : fields.many2one('res.users', 'Validated by', readonly=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
'user_id':fields.many2one('res.users', 'Responsible', readonly=True),
'quantity': fields.float('# of Products', readonly=True),
@@ -76,6 +82,12 @@ class purchase_report(osv.osv):
to_char(s.date_order, 'MM') as month,
to_char(s.date_order, 'YYYY-MM-DD') as day,
s.state,
+ s.date_approve,
+ date_trunc('day',s.minimum_planned_date) as expected_date,
+ s.partner_address_id,
+ s.dest_address_id,
+ s.pricelist_id,
+ s.validator,
s.warehouse_id as warehouse_id,
s.partner_id as partner_id,
s.fiscal_position,
@@ -97,6 +109,12 @@ class purchase_report(osv.osv):
s.create_uid,
s.partner_id,
s.location_id,
+ s.date_approve,
+ date_trunc('day',s.minimum_planned_date),
+ s.partner_address_id,
+ s.pricelist_id,
+ s.validator,
+ s.dest_address_id,
l.product_id,
s.date_order,
to_char(s.date_order, 'YYYY'),
diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml
index 93918160bd1..8f3f31e84ee 100644
--- a/addons/purchase/report/purchase_report_view.xml
+++ b/addons/purchase/report/purchase_report_view.xml
@@ -21,6 +21,8 @@
+
+
@@ -32,6 +34,10 @@
+
+
+
+
@@ -71,6 +77,8 @@
domain="[('state','=','manual')]"/>
+
+
-
-
-
+
+
+
+
-
+
+
+
+
+
-
-
+
+
+
+
+
-
+
+
+
+
+
+
-
+
+
From 6d9b14b9e44a5779f9943bb2d7dadf5969715699 Mon Sep 17 00:00:00 2001
From: "rch (Open ERP)" <>
Date: Thu, 22 Apr 2010 19:01:15 +0530
Subject: [PATCH 034/389] [IMP]: Improve search view for crm phonecall and
opportunity report.
bzr revid: rch_open_erp-20100422133115-gx6xbw975di51l6x
---
addons/crm/report/crm_opportunity_report.py | 12 ++++++++++--
addons/crm/report/crm_opportunity_report_view.xml | 7 +++++++
addons/crm/report/crm_phonecall_report.py | 8 ++++++--
addons/crm/report/crm_phonecall_report_view.xml | 8 ++++++++
4 files changed, 31 insertions(+), 4 deletions(-)
diff --git a/addons/crm/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py
index 3e11307ee36..eb6c4ea5bd4 100644
--- a/addons/crm/report/crm_opportunity_report.py
+++ b/addons/crm/report/crm_opportunity_report.py
@@ -53,7 +53,10 @@ class crm_opportunity_report(osv.osv):
'user_id':fields.many2one('res.users', 'User', readonly=True),
'date_closed': fields.datetime('Closed', readonly=True),
'date_open': fields.datetime('Opened', readonly=True),
- 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority')
+ 'date_deadline': fields.date('Expected Closing', readonly=True),
+ 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
+ 'date_action': fields.date('Next Action', readonly=True),
+ 'planned_revenue': fields.float('Expected Revenue', readonly=True),
}
def init(self, cr):
@@ -83,6 +86,9 @@ class crm_opportunity_report(osv.osv):
c.date_closed as date_closed,
c.date_open as date_open,
c.priority as priority,
+ c.date_action as date_action,
+ c.date_deadline as date_deadline,
+ sum(c.planned_revenue) as planned_revenue,
date_trunc('day',c.create_date) as create_date,
sum(planned_revenue) as amount_revenue,
sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob,
@@ -104,7 +110,9 @@ class crm_opportunity_report(osv.osv):
create_date,
c.date_closed,
c.date_open,
- c.priority
+ c.priority,
+ c.date_action,
+ c.date_deadline
)""")
crm_opportunity_report()
diff --git a/addons/crm/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml
index 3daa72c717c..d5d56918629 100644
--- a/addons/crm/report/crm_opportunity_report_view.xml
+++ b/addons/crm/report/crm_opportunity_report_view.xml
@@ -28,6 +28,9 @@
+
+
+
@@ -82,9 +85,13 @@
+
+
+
+
+
+
@@ -78,8 +80,11 @@
+
+
+
+
+
From 514ab7423adabe8060d74ddb9a33b9eb3665ec95 Mon Sep 17 00:00:00 2001
From: mtr
Date: Fri, 23 Apr 2010 19:20:17 +0530
Subject: [PATCH 035/389] [IMP] stock: Task ID-581: Converted stock_ups and
stock_replacement wizards into osv_memory wizards.
bzr revid: mtr@mtr-20100423135017-bg5iuwdyodj1dbao
---
addons/stock/wizard/__init__.py | 4 +-
addons/stock/wizard/stock_replacement.py | 68 ++++++++++++++
.../stock/wizard/stock_replacement_view.xml | 41 +++++++++
addons/stock/wizard/stock_ups.py | 91 +++++++++++++++++++
addons/stock/wizard/stock_ups_view.xml | 56 ++++++++++++
addons/stock/wizard/wizard_replacement.py | 60 ------------
addons/stock/wizard/wizard_ups.py | 85 -----------------
7 files changed, 258 insertions(+), 147 deletions(-)
create mode 100644 addons/stock/wizard/stock_replacement.py
create mode 100644 addons/stock/wizard/stock_replacement_view.xml
create mode 100644 addons/stock/wizard/stock_ups.py
create mode 100644 addons/stock/wizard/stock_ups_view.xml
delete mode 100644 addons/stock/wizard/wizard_replacement.py
delete mode 100644 addons/stock/wizard/wizard_ups.py
diff --git a/addons/stock/wizard/__init__.py b/addons/stock/wizard/__init__.py
index 8fac3041fb3..82825000eaa 100644
--- a/addons/stock/wizard/__init__.py
+++ b/addons/stock/wizard/__init__.py
@@ -23,8 +23,8 @@ import stock_traceability
import stock_move
import stock_partial_picking
import stock_partial_move
-import wizard_replacement
-import wizard_ups
+import stock_replacement
+import stock_ups
import stock_inventory_merge
import stock_inventory_set_stock_zero
import stock_fill_inventory
diff --git a/addons/stock/wizard/stock_replacement.py b/addons/stock/wizard/stock_replacement.py
new file mode 100644
index 00000000000..e753206ec34
--- /dev/null
+++ b/addons/stock/wizard/stock_replacement.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import fields, osv
+from service import web_services
+from tools.translate import _
+import netsvc
+import pooler
+import time
+import wizard
+
+class stock_replacement(osv.osv_memory):
+ """
+ This class has been defined for replacement wizard
+ """
+ _name = "stock.replacement"
+ _description = "Stock Replacement"
+
+ def get_composant(self, cr, uid, ids, context):
+ return {}
+
+ def replace_composant(self, cr, uid, ids, context):
+ """
+ to open a new wizard that acknowledge, a replacement task
+
+ @return: it returns the replacement acknowledgement form
+
+ """
+ return {
+ 'name': False,
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'stock.replacement.result',
+ 'type': 'ir.actions.act_window',
+ 'target':'new',
+ }
+
+stock_replacement()
+
+class stock_replacement_result(osv.osv_memory):
+ """
+ This class has been defined for replacement result
+ """
+ _name = "stock.replacement.result"
+ _description = "Stock Replacement result"
+
+stock_replacement_result()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/stock/wizard/stock_replacement_view.xml b/addons/stock/wizard/stock_replacement_view.xml
new file mode 100644
index 00000000000..ce5f7efbc9f
--- /dev/null
+++ b/addons/stock/wizard/stock_replacement_view.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ Stock Replacement
+ stock.replacement
+ form
+
+
+
+
+
+
+
+
+
+ Stock Replacement result
+ stock.replacement.result
+ form
+
+
+
+
+
+
+
diff --git a/addons/stock/wizard/stock_ups.py b/addons/stock/wizard/stock_ups.py
new file mode 100644
index 00000000000..ad6e15725db
--- /dev/null
+++ b/addons/stock/wizard/stock_ups.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+from osv import fields, osv
+from service import web_services
+from tools.translate import _
+import netsvc
+import pooler
+import time
+import wizard
+
+class stock_ups(osv.osv_memory):
+ _name = "stock.ups"
+ _description = "Stock ups"
+
+ def ups_save(self, cr, uid, ids, context):
+
+ return {
+ 'name': False,
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'stock.ups.final',
+ 'type': 'ir.actions.act_window',
+ 'target':'new',
+ }
+ def ups_upload(self, cr, uid, ids, context):
+
+ return {
+ 'name': False,
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'stock.ups.upload',
+ 'type': 'ir.actions.act_window',
+ 'target':'new',
+ }
+ _columns = {
+ 'weight': fields.float('Lot weight', required=True),
+ }
+
+ _defaults = {
+ 'weight': lambda *a: 3.0,
+ }
+stock_ups()
+
+class stock_ups_final(osv.osv_memory):
+ _name = "stock.ups.final"
+ _description = "Stock ups final"
+
+# def create_xmlfile(self, cr, uid, ids, context):
+# report = netsvc._group['report']['report.stock.move.lot.ups_xml']
+# data['report_type'] = 'raw'
+# return {'xmlfile' : report.create(uid, context['active_id'], ids, {})}
+
+ _columns = {
+ 'xmlfile': fields.binary('XML File'),
+ }
+
+stock_ups_final()
+
+class stock_ups_upload(osv.osv_memory):
+ _name = "stock.ups.upload"
+ _description = "Stock ups upload"
+
+ def upload_xmlfile(self, cr, uid, ids, context):
+# report = netsvc._group['report']['report.stock.move.lot.ups_xml']
+# data['report_type'] = 'raw'
+#FIXME: this seems unfinished
+# fp = file('/tmp/test.xml', 'w').write(report.create(uid, context['active_id'], ids, {}))
+ return {}
+
+stock_ups_upload()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/stock/wizard/stock_ups_view.xml b/addons/stock/wizard/stock_ups_view.xml
new file mode 100644
index 00000000000..89b5fe131e8
--- /dev/null
+++ b/addons/stock/wizard/stock_ups_view.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+ Stock ups
+ stock.ups
+ form
+
+
+
+
+
+
+ Stock ups
+ stock.ups.final
+ form
+
+
+
+
+
+
+ Stock ups
+ stock.ups.upload
+ form
+
+
+
+
+
+
+
+
diff --git a/addons/stock/wizard/wizard_replacement.py b/addons/stock/wizard/wizard_replacement.py
deleted file mode 100644
index 5b066aaab9f..00000000000
--- a/addons/stock/wizard/wizard_replacement.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import wizard
-
-class wizard_replacement(wizard.interface):
-
- def getComposant(self, cr, uid, data, context):
- return {}
-
- def replaceComposant(self, cr, uid, data, context):
- return {}
-
- comp_form = ''''''
- comp_fields = {}
-
- replace_form = ''''''
- replace_fields = {}
-
- states = {
- 'init' : {
- 'actions' : [getComposant],
- 'result' : {
- 'type' : 'form',
- 'arch' : comp_form,
- 'fields' : comp_fields,
- 'state' : [('end', 'Cancel'), ('replace', 'Replace')]}
- },
- 'replace' : {
- 'action' : [replaceComposant],
- 'result' : {
- 'type' : 'form',
- 'arch' : replace_form,
- 'fields' : replace_fields,
- 'state' : [('end', 'Ok')]}
- },
- }
-
-wizard_replacement('stock.move.replace')
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/stock/wizard/wizard_ups.py b/addons/stock/wizard/wizard_ups.py
deleted file mode 100644
index f57128c78fc..00000000000
--- a/addons/stock/wizard/wizard_ups.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-import os
-
-import wizard
-import netsvc
-import time
-
-_ups_form = '''
-'''
-
-_ups_fields = {
- 'weight' : { 'string' : 'Lot weight', 'type' : 'float', 'default' : lambda *a: 3.0, 'required' : True },
-}
-
-_ups_finalform = '''
-'''
-
-_ups_finalfields = {
- 'xmlfile' : { 'string' : 'XML File', 'type' : 'binary' },
-}
-
-_ups_uploadform = '''
-'''
-
-_ups_uploadfields = {}
-
-def create_xmlfile(self, cr, uid, data, context):
- report = netsvc._group['report']['report.stock.move.lot.ups_xml']
- data['report_type'] = 'raw'
- return {'xmlfile' : report.create(uid, data['ids'], data, {})}
-
-def upload_xmlfile(self, cr, uid, data, context):
- report = netsvc._group['report']['report.stock.move.lot.ups_xml']
- data['report_type'] = 'raw'
-#FIXME: this seems unfinished
- fp = file('/tmp/test.xml', 'w').write(report.create(uid, data['ids'], data, {}))
- return {}
-
-class wiz_ups(wizard.interface):
- states = {
- 'init': {
- 'actions': [],
- 'result': {'type': 'form', 'arch' : _ups_form, 'fields' : _ups_fields, 'state':[('end','Cancel'),('ups_save','Get xml file'), ('ups_upload', 'Upload xml file')]}
- },
- 'ups_save': {
- 'actions': [create_xmlfile],
- 'result': {'type': 'form', 'arch' : _ups_finalform, 'fields' : _ups_finalfields, 'state':[('end', 'End')]}
- },
- 'ups_upload' : {
- 'actions' : [upload_xmlfile],
- 'result' : {'type' : 'form', 'arch' : _ups_uploadform, 'fields' : _ups_uploadfields, 'state' : [('end', 'End')]}
- },
- }
-wiz_ups('stock.ups_xml');
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
From a076f056f1013e9b325deccca02e85313d04d83e Mon Sep 17 00:00:00 2001
From: "Rvo (Open ERP)"
Date: Mon, 26 Apr 2010 10:53:45 +0530
Subject: [PATCH 036/389] [ADD]:ref attribute support in demo files for
reference fields
bzr revid: rvo@tinyerp.co.in-20100426052345-s351m4qjr717o3m0
---
bin/addons/base/res/partner/partner_demo.xml | 2 +-
bin/tools/convert.py | 20 ++++++++++++++++----
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/bin/addons/base/res/partner/partner_demo.xml b/bin/addons/base/res/partner/partner_demo.xml
index c6de312bc4c..f5d70a2490d 100644
--- a/bin/addons/base/res/partner/partner_demo.xml
+++ b/bin/addons/base/res/partner/partner_demo.xml
@@ -357,7 +357,7 @@
ASUSTEK-Subject
- res.partner,2
+
diff --git a/bin/tools/convert.py b/bin/tools/convert.py
index 36f2740dbc9..4a2a879698a 100644
--- a/bin/tools/convert.py
+++ b/bin/tools/convert.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL ().
#
@@ -15,7 +15,7 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
+# along with this program. If not, see .
#
##############################################################################
@@ -369,10 +369,10 @@ form: module.record_id""" % (xml_id,)
domain = rec.get('domain','').encode('utf-8') or '{}'
context = rec.get('context','').encode('utf-8') or '{}'
res_model = rec.get('res_model','').encode('utf-8')
- src_model = rec.get('src_model','').encode('utf-8')
+ src_model = rec.get('src_model','').encode('utf-8')
view_type = rec.get('view_type','').encode('utf-8') or 'form'
view_mode = rec.get('view_mode','').encode('utf-8') or 'tree,form'
-
+
usage = rec.get('usage','').encode('utf-8')
limit = rec.get('limit','').encode('utf-8')
auto_refresh = rec.get('auto_refresh','').encode('utf-8')
@@ -721,6 +721,10 @@ form: module.record_id""" % (xml_id,)
f_val = False
else:
f_val = self.id_get(cr, f_model, f_ref)
+ if f_name in model._columns \
+ and model._columns[f_name]._type == 'reference':
+ model_name = self.model_get(cr, f_ref)
+ f_val = model_name + ',' + str(f_val)
else:
f_val = _eval_xml(self,field, self.pool, cr, self.uid, self.idref)
if model._columns.has_key(f_name):
@@ -747,6 +751,14 @@ form: module.record_id""" % (xml_id,)
return int(res[0]['res_id'])
return False
+ def model_get(self, cr, id_str):
+ model_data_obj = self.pool.get('ir.model.data')
+ id = model_data_obj.search(cr, self.uid, [('name', '=', id_str)])
+ res = model_data_obj.read(cr, self.uid, id, ['model'])
+ if res and res[0] and res[0]['model']:
+ return res[0]['model']
+ return False
+
def parse(self, de):
if not de.tag in ['terp', 'openerp']:
self.logger.notifyChannel("init", netsvc.LOG_ERROR, "Mismatch xml format" )
From 89f73095cf03c916740b54585d3d5d9619287280 Mon Sep 17 00:00:00 2001
From: "nch@tinyerp.com" <>
Date: Mon, 26 Apr 2010 18:01:47 +0530
Subject: [PATCH 037/389] [IMP]:Select your interface wizard
bzr revid: nch@tinyerp.com-20100426123147-ihps0qqox9ljrwyk
---
bin/addons/base/base_update.xml | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/bin/addons/base/base_update.xml b/bin/addons/base/base_update.xml
index 17952ea0146..42e4aae4e8e 100644
--- a/bin/addons/base/base_update.xml
+++ b/bin/addons/base/base_update.xml
@@ -280,17 +280,21 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
From c2b5890db237a5a288cb70a5846b0e34f899354d Mon Sep 17 00:00:00 2001
From: "rpa (Open ERP)"
Date: Tue, 27 Apr 2010 15:49:34 +0530
Subject: [PATCH 038/389] [IMP]: base_action_rule: * Removed fields that are
not in the crm.case, * Added a domain to be applied on the object, for the
conditions
bzr revid: rpa@tinyerp.com-20100427101934-3envktbthc7w3n3o
---
addons/base_action_rule/base_action_rule.py | 47 +++++--------------
.../base_action_rule_view.xml | 14 +++---
addons/crm/crm_action_rule.py | 23 ++++-----
3 files changed, 31 insertions(+), 53 deletions(-)
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 6eb45172dbc..77446c633ee 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -44,15 +44,6 @@ class base_action_rule(osv.osv):
return self.state_get(cr, uid, context=context)
- def _priority_get(self, cr, uid, context={}):
- """ Get Priority
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values """
-
- return self.priority_get(cr, uid, context=context)
-
def state_get(self, cr, uid, context={}):
""" Get State
@param self: The object pointer
@@ -62,15 +53,6 @@ class base_action_rule(osv.osv):
return [('','')]
- def priority_get(self, cr, uid, context={}):
- """ Get Priority
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values """
-
- return [('','')]
-
_columns = {
'name': fields.many2one('ir.model', 'Model', required=True),
'max_level': fields.integer('Max Level', help='Specifies maximum level.'),
@@ -79,7 +61,6 @@ class base_action_rule(osv.osv):
it will allow you to hide the rule without removing it."),
'sequence': fields.integer('Sequence', help="Gives the sequence order when\
displaying a list of rules."),
-
'trg_date_type': fields.selection([
('none','None'),
('create','Creation Date'),
@@ -100,13 +81,10 @@ class base_action_rule(osv.osv):
'trg_partner_categ_id': fields.many2one('res.partner.category', 'Partner Category'),
'trg_state_from': fields.selection(_state_get, 'State', size=16),
'trg_state_to': fields.selection(_state_get, 'Button Pressed', size=16),
- 'trg_priority_from': fields.selection(_priority_get, 'Minimum Priority'),
- 'trg_priority_to': fields.selection(_priority_get, 'Maximum Priority'),
'act_method': fields.char('Call Object Method', size=64),
'act_user_id': fields.many2one('res.users', 'Set responsible to'),
'act_state': fields.selection(_state_get, 'Set state to', size=16),
- 'act_priority': fields.selection(_priority_get, 'Set priority to'),
'act_email_cc': fields.char('Add watchers (Cc)', size=250, help="These people\
will receive a copy of the future communication between partner and users by email"),
@@ -131,6 +109,7 @@ class base_action_rule(osv.osv):
'server_action_id': fields.many2one('ir.actions.server','Server Action',help="Describes the\
action name." \
"eg:on which object which action to be taken on basis of which condition"),
+ 'domain':fields.char('Domain', size=124, required=False, readonly=False),
}
_defaults = {
@@ -142,8 +121,11 @@ class base_action_rule(osv.osv):
'act_remind_partner': lambda *a: 0,
'act_remind_user': lambda *a: 0,
'act_mail_to_watchers': lambda *a: 0,
+ 'domain': lambda *a: '[]'
}
-
+
+ _order = 'sequence'
+
def format_body(self, body):
""" Foramat Action rule's body
@param self: The object pointer """
@@ -153,7 +135,6 @@ class base_action_rule(osv.osv):
def format_mail(self, obj, body):
""" Foramat Mail
@param self: The object pointer """
-
data = {
'object_id': obj.id,
'object_subject': hasattr(obj, 'name') and obj.name or False,
@@ -202,6 +183,10 @@ class base_action_rule(osv.osv):
@param context: A standard dictionary for contextual values """
ok = True
+ if eval(action.domain):
+ obj_ids = obj._table.search(cr, uid, eval(action.domain), context=context)
+ if not obj.id in obj_ids:
+ ok = False
if hasattr(obj, 'user_id'):
ok = ok and (not action.trg_user_id.id or action.trg_user_id.id==obj.user_id.id)
if hasattr(obj, 'partner_id'):
@@ -219,10 +204,6 @@ class base_action_rule(osv.osv):
if state_to:
ok = ok and (not action.trg_state_to or action.trg_state_to==state_to)
- if hasattr(obj, 'priority'):
- ok = ok and (not action.trg_priority_from or action.trg_priority_from>=obj.priority)
- ok = ok and (not action.trg_priority_to or action.trg_priority_to<=obj.priority)
-
reg_name = action.regex_name
result_name = True
if reg_name:
@@ -260,10 +241,6 @@ class base_action_rule(osv.osv):
obj.categ_id = action.act_categ_id
write['categ_id'] = action.act_categ_id.id
- if hasattr(obj, 'priority') and action.act_priority:
- obj.priority = action.act_priority
- write['priority'] = action.act_priority
-
model_obj.write(cr, uid, [obj.id], write, context)
if hasattr(model_obj, 'remind_user') and action.act_remind_user:
@@ -295,10 +272,11 @@ class base_action_rule(osv.osv):
@param ids: List of Basic Action Rule’s IDs,
@param objects: pass objects
@param context: A standard dictionary for contextual values """
-
if not scrit:
scrit = []
- for action in self.browse(cr, uid, ids):
+ cr.execute("select id from base_action_rule order by sequence")
+ rule_ids = map(lambda x: x[0], cr.fetchall())
+ for action in self.browse(cr, uid, rule_ids):
level = action.max_level
if not level:
break
@@ -342,7 +320,6 @@ class base_action_rule(osv.osv):
model_obj.write(cr, uid, [obj.id], {'date_action_next': dt}, context)
else:
ok = action.trg_date_type=='none'
-
if ok:
self.do_action(cr, uid, action, model_obj, obj, context)
break
diff --git a/addons/base_action_rule/base_action_rule_view.xml b/addons/base_action_rule/base_action_rule_view.xml
index 72cf3e5a9fb..f7a476fd09e 100644
--- a/addons/base_action_rule/base_action_rule_view.xml
+++ b/addons/base_action_rule/base_action_rule_view.xml
@@ -16,7 +16,9 @@
@@ -180,7 +180,7 @@
diff --git a/addons/crm_sale/crm_opportunity.py b/addons/crm/crm_opportunity.py
similarity index 98%
rename from addons/crm_sale/crm_opportunity.py
rename to addons/crm/crm_opportunity.py
index fee205c3439..dec672c3277 100644
--- a/addons/crm_sale/crm_opportunity.py
+++ b/addons/crm/crm_opportunity.py
@@ -19,12 +19,10 @@
#
##############################################################################
-
-from crm.report import crm_report
from datetime import datetime
from osv import fields,osv,orm
from tools.translate import _
-from crm import crm
+import crm
import time
import mx.DateTime
@@ -121,7 +119,7 @@ class crm_opportunity(osv.osv):
'categ_id': fields.many2one('crm.case.categ', 'Category', \
domain="[('section_id','=',section_id), \
('object_id.model', '=', 'crm.opportunity')]"),
- 'priority': fields.selection(crm_report.AVAILABLE_PRIORITIES, 'Priority'),
+ 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'referred': fields.char('Referred By', size=64),
'probability': fields.float('Probability (%)'),
'planned_revenue': fields.float('Expected Revenue'),
@@ -233,7 +231,7 @@ class crm_opportunity(osv.osv):
}
value = {
'name': _('Meetings'),
- 'domain': "[('user_id','=',%s)]" % (uid),
+ 'domain': "[('user_id','=',%s),('opportunity_id','=',%s)]" % (uid,opp.id),
'context': context,
'view_type': 'form',
'view_mode': 'calendar,form,tree',
@@ -244,7 +242,6 @@ class crm_opportunity(osv.osv):
'search_view_id': res['res_id'],
'nodestroy': True
}
-
return value
crm_opportunity()
diff --git a/addons/crm_sale/crm_opportunity_data.xml b/addons/crm/crm_opportunity_data.xml
similarity index 76%
rename from addons/crm_sale/crm_opportunity_data.xml
rename to addons/crm/crm_opportunity_data.xml
index b914198ab16..b3780990a13 100644
--- a/addons/crm_sale/crm_opportunity_data.xml
+++ b/addons/crm/crm_opportunity_data.xml
@@ -3,91 +3,91 @@
Existing Customer
-
+ Self Generated
-
+ Employee
-
+ Partner
-
+ Campaign
-
+ Website
-
+ Word of mouth
-
+ Other
-
+ Prospecting
-
+ Needs Analysis
-
+ Value Proposition
-
+ Proposal/Price Quote
-
+ Negotiation/Review
-
+ Closed Won
-
+ Closed Lost
-
+ Existing Business
-
+ New Business
-
+
diff --git a/addons/crm_sale/crm_opportunity_demo.xml b/addons/crm/crm_opportunity_demo.xml
similarity index 81%
rename from addons/crm_sale/crm_opportunity_demo.xml
rename to addons/crm/crm_opportunity_demo.xml
index 0de8f6bbdcc..b893d536e44 100644
--- a/addons/crm_sale/crm_opportunity_demo.xml
+++ b/addons/crm/crm_opportunity_demo.xml
@@ -11,21 +11,21 @@
-
+
-
-
+
+
-
+
@@ -33,15 +33,15 @@
-
-
+
+
-
+
@@ -49,8 +49,8 @@
-
-
+
+
@@ -58,15 +58,15 @@
-
+
-
-
+
+
@@ -80,8 +80,8 @@
-
-
+
+
diff --git a/addons/crm_sale/crm_opportunity_menu.xml b/addons/crm/crm_opportunity_menu.xml
similarity index 90%
rename from addons/crm_sale/crm_opportunity_menu.xml
rename to addons/crm/crm_opportunity_menu.xml
index 9e5e3e161ad..55bf9354287 100644
--- a/addons/crm_sale/crm_opportunity_menu.xml
+++ b/addons/crm/crm_opportunity_menu.xml
@@ -18,8 +18,8 @@
res_model="crm.phonecall"
src_model="crm.opportunity"
view_mode="calendar,tree,form"
- context="{'default_duration': 1.0}"
- domain="[('user_id','=',uid)]"
+ context="{'default_duration': 1.0 ,'default_opportunity_id': active_id}"
+ domain="[('user_id','=',uid),('opportunity_id', '=', active_id)]"
view_type="form"/>
@@ -27,7 +27,7 @@
crm.opportunitytree,form,graph
-
+
diff --git a/addons/crm_sale/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml
similarity index 97%
rename from addons/crm_sale/crm_opportunity_view.xml
rename to addons/crm/crm_opportunity_view.xml
index 6a65c0e510e..4bdc0d90158 100644
--- a/addons/crm_sale/crm_opportunity_view.xml
+++ b/addons/crm/crm_opportunity_view.xml
@@ -71,14 +71,14 @@
-
-
+
-
-
+
@@ -180,7 +180,7 @@
@@ -191,7 +191,7 @@
diff --git a/addons/crm_sale/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
similarity index 100%
rename from addons/crm_sale/report/crm_lead_report.py
rename to addons/crm/report/crm_lead_report.py
diff --git a/addons/crm_sale/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
similarity index 100%
rename from addons/crm_sale/report/crm_lead_report_view.xml
rename to addons/crm/report/crm_lead_report_view.xml
diff --git a/addons/crm_sale/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py
similarity index 99%
rename from addons/crm_sale/report/crm_opportunity_report.py
rename to addons/crm/report/crm_opportunity_report.py
index db67919bf30..a3af4be8b7c 100644
--- a/addons/crm_sale/report/crm_opportunity_report.py
+++ b/addons/crm/report/crm_opportunity_report.py
@@ -19,11 +19,9 @@
#
##############################################################################
-from crm.report import crm_report
from osv import fields,osv
import tools
-
AVAILABLE_STATES = [
('draft','Draft'),
('open','Open'),
diff --git a/addons/crm_sale/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml
similarity index 100%
rename from addons/crm_sale/report/crm_opportunity_report_view.xml
rename to addons/crm/report/crm_opportunity_report_view.xml
diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv
index f7bb4a22231..0207e6cb39c 100644
--- a/addons/crm/security/ir.model.access.csv
+++ b/addons/crm/security/ir.model.access.csv
@@ -30,3 +30,4 @@
"access_crm_opportunity2phonecall","crm.opportunity2phonecall","model_crm_opportunity2phonecall","crm.group_crm_user",1,1,1,1
"access_crm_send_mail","crm.send.mail","model_crm_send_mail","crm.group_crm_user",1,1,1,1
"access_crm_partner2opportunity","crm.partner2opportunity","model_crm_partner2opportunity","crm.group_crm_user",1,1,1,1
+"access_crm_lead2opportunity_partner","crm.lead2opportunity.partner","model_crm_lead2opportunity_partner","crm.group_crm_user",1,1,1,1
diff --git a/addons/crm_sale/test/test_crm_lead.yml b/addons/crm/test/test_crm_lead.yml
similarity index 100%
rename from addons/crm_sale/test/test_crm_lead.yml
rename to addons/crm/test/test_crm_lead.yml
diff --git a/addons/crm_sale/test/test_crm_opportunity.yml b/addons/crm/test/test_crm_opportunity.yml
similarity index 100%
rename from addons/crm_sale/test/test_crm_opportunity.yml
rename to addons/crm/test/test_crm_opportunity.yml
diff --git a/addons/crm/wizard/__init__.py b/addons/crm/wizard/__init__.py
index 0083eb8644a..75c6a21caa3 100644
--- a/addons/crm/wizard/__init__.py
+++ b/addons/crm/wizard/__init__.py
@@ -25,7 +25,6 @@ import crm_email_add_cc
import crm_lead_to_partner
import crm_lead_to_opportunity
import crm_opportunity_to_phonecall
-
import crm_partner_to_opportunity
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py
similarity index 96%
rename from addons/crm_sale/wizard/crm_lead_to_opportunity.py
rename to addons/crm/wizard/crm_lead_to_opportunity.py
index 5aef886ab5c..c8cce059f09 100644
--- a/addons/crm_sale/wizard/crm_lead_to_opportunity.py
+++ b/addons/crm/wizard/crm_lead_to_opportunity.py
@@ -62,10 +62,10 @@ class crm_lead2opportunity(osv.osv_memory):
model_obj = self.pool.get('ir.model')
# Get Opportunity views
- result = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_case_opportunities_filter')
+ result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
- id2 = data_obj._get_id(cr, uid, 'crm_sale', 'crm_case_form_view_oppor')
- id3 = data_obj._get_id(cr, uid, 'crm_sale', 'crm_case_tree_view_oppor')
+ id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
+ id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
@@ -182,6 +182,7 @@ Leads Could not convert into Opportunity"))
crm_lead2opportunity()
+
class crm_lead2opportunity_partner(osv.osv_memory):
_name = 'crm.lead2opportunity.partner'
_description = 'Lead To Opportunity Partner'
@@ -247,8 +248,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
res = mod_obj.read(cr, uid, result, ['res_id'])
value = {}
data_obj = self.pool.get('ir.model.data')
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_create')
-
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create')
view_id = False
if data_id:
view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
@@ -280,7 +280,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
"""
value = {}
data_obj = self.pool.get('ir.model.data')
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_create')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create')
view_id = False
if data_id:
view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
diff --git a/addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
similarity index 100%
rename from addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml
rename to addons/crm/wizard/crm_lead_to_opportunity_view.xml
diff --git a/addons/crm_sale/wizard/crm_lead_to_partner.py b/addons/crm/wizard/crm_lead_to_partner.py
similarity index 100%
rename from addons/crm_sale/wizard/crm_lead_to_partner.py
rename to addons/crm/wizard/crm_lead_to_partner.py
diff --git a/addons/crm_sale/wizard/crm_lead_to_partner_view.xml b/addons/crm/wizard/crm_lead_to_partner_view.xml
similarity index 100%
rename from addons/crm_sale/wizard/crm_lead_to_partner_view.xml
rename to addons/crm/wizard/crm_lead_to_partner_view.xml
diff --git a/addons/crm_sale/wizard/crm_opportunity_to_phonecall.py b/addons/crm/wizard/crm_opportunity_to_phonecall.py
similarity index 85%
rename from addons/crm_sale/wizard/crm_opportunity_to_phonecall.py
rename to addons/crm/wizard/crm_opportunity_to_phonecall.py
index 73046fb4007..ffe91a927d2 100644
--- a/addons/crm_sale/wizard/crm_opportunity_to_phonecall.py
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall.py
@@ -29,10 +29,10 @@ class crm_opportunity2phonecall(osv.osv_memory):
_description = 'Opportunity to Phonecall'
_columns = {
- 'name' : fields.char('Call summary', size=64, required=True, select=1),
- 'user_id' : fields.many2one('res.users', "Assign To"),
- 'date': fields.datetime('Date' , required=True),
- 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
+ 'name' : fields.char('Call summary', size=64, required=True, select=1),
+ 'user_id' : fields.many2one('res.users', "Assign To"),
+ 'date': fields.datetime('Date' , required=True),
+ 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
def default_get(self, cr, uid, fields, context=None):
@@ -43,9 +43,9 @@ class crm_opportunity2phonecall(osv.osv_memory):
@param uid: the current user’s ID for security checks,
@param fields: List of fields for default value
@param context: A standard dictionary for contextual values
+
@return : default values of fields.
"""
-
opp_obj = self.pool.get('crm.opportunity')
record_ids = context and context.get('active_ids', []) or []
res = super(crm_opportunity2phonecall, self).default_get(cr, uid, fields, context=context)
@@ -92,7 +92,7 @@ class crm_opportunity2phonecall(osv.osv_memory):
data_obj = self.pool.get('ir.model.data')
categ_id = mod_obj._get_id(cr, uid, 'crm', 'categ_phone1')
categ_id = data_obj.browse(cr, uid, categ_id, context=context).res_id
-
+
# Select the view
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
@@ -104,31 +104,32 @@ class crm_opportunity2phonecall(osv.osv_memory):
for this in self.browse(cr, uid, ids, context=context):
for opp in opp_obj.browse(cr, uid, record_ids, context=context):
new_case = phonecall_obj.create(cr, uid, {
- 'name' : opp.name,
- 'case_id' : opp.id ,
- 'user_id' : this.user_id and this.user_id.id or False,
- 'categ_id' : categ_id,
- 'description' : opp.description or False,
- 'date' : this.date,
- 'section_id' : opp.section_id and opp.section_id.id or False,
- 'partner_id': opp.partner_id and opp.partner_id.id or False,
- 'partner_address_id': opp.partner_address_id and opp.partner_address_id.id or False,
- 'partner_phone' : opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False),
- 'partner_mobile' : opp.partner_address_id and opp.partner_address_id.mobile or False,
- 'priority': opp.priority,
+ 'name' : opp.name,
+ 'case_id' : opp.id ,
+ 'user_id' : this.user_id and this.user_id.id or False,
+ 'categ_id' : categ_id,
+ 'description' : opp.description or False,
+ 'date' : this.date,
+ 'section_id' : opp.section_id and opp.section_id.id or False,
+ 'partner_id': opp.partner_id and opp.partner_id.id or False,
+ 'partner_address_id': opp.partner_address_id and opp.partner_address_id.id or False,
+ 'partner_phone' : opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False),
+ 'partner_mobile' : opp.partner_address_id and opp.partner_address_id.mobile or False,
+ 'priority': opp.priority,
'opp_id': opp.id
}, context=context)
phonecall_obj.case_open(cr, uid, [new_case])
value = {
- 'name': _('Phone Call'),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'crm.phonecall',
- 'res_id' : new_case,
- 'views': [(id3, 'form'), (id2, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
+ 'name': _('Phone Call'),
+ 'domain': "[('user_id','=',%s),('opportunity_id','=',%s)]" % (uid,opp.id),
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'crm.phonecall',
+ 'res_id' : new_case,
+ 'views': [(id3, 'form'), (id2, 'tree'), (False, 'calendar'), (False, 'graph')],
+ 'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
diff --git a/addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
similarity index 100%
rename from addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml
rename to addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
diff --git a/addons/crm_sale/__init__.py b/addons/crm_sale/__init__.py
deleted file mode 100644
index 9e87d6f4cc5..00000000000
--- a/addons/crm_sale/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import crm_lead
-import crm_opportunity
-import wizard
-import report
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/crm_sale/__openerp__.py b/addons/crm_sale/__openerp__.py
deleted file mode 100644
index bdcfbcc4c2d..00000000000
--- a/addons/crm_sale/__openerp__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-
-{
- 'name': 'Customer & Supplier Relationship Management',
- 'version': '1.0',
- 'category': 'Generic Modules/CRM & SRM',
- 'description': """Lead and business Opportunity """,
-
- 'author': 'Tiny',
- 'website': 'http://www.openerp.com',
- 'depends': ['crm'],
- 'init_xml': [
- 'crm_lead_data.xml',
- 'crm_opportunity_data.xml',
- ],
- 'update_xml': [
- 'wizard/crm_lead_to_partner_view.xml',
- 'wizard/crm_lead_to_opportunity_view.xml',
- 'wizard/crm_opportunity_to_phonecall_view.xml',
- 'crm_lead_view.xml',
- 'crm_lead_menu.xml',
- 'crm_opportunity_view.xml',
- 'crm_opportunity_menu.xml',
- ],
- 'demo_xml': [
- 'crm_lead_demo.xml',
- 'crm_opportunity_demo.xml',
- ],
- 'test': ['test/test_crm_lead.yml',
- #'test/test_crm_opportunity.yml',
- ],
- 'installable': True,
- 'active': False,
- 'certificate': '0079056041421',
-}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/report/__init__.py b/addons/crm_sale/report/__init__.py
deleted file mode 100644
index 7c8912e1ea5..00000000000
--- a/addons/crm_sale/report/__init__.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-#import report_businessopp
-#import crm_report
-#import crm_claim_report
-import crm_lead_report
-#import crm_phonecall_report
-#import crm_fundraising_report
-import crm_opportunity_report
-#import crm_helpdesk_report
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/crm_sale/security/ir.model.access.csv b/addons/crm_sale/security/ir.model.access.csv
deleted file mode 100644
index ece648be92f..00000000000
--- a/addons/crm_sale/security/ir.model.access.csv
+++ /dev/null
@@ -1,8 +0,0 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_crm_lead","crm.lead","model_crm_lead","crm.group_crm_manager",1,1,1,1
-"access_crm_opportunity","crm.opportunity","model_crm_opportunity","crm.group_crm_manager",1,1,1,1
-"access_crm_lead_report_user","crm.lead.report","model_crm_lead_report","crm.group_crm_user",1,0,0,0
-"access_crm_opportunity_report_user","crm.opportunity.report","model_crm_opportunity_report","crm.group_crm_user",1,0,0,0
-"access_crm_lead2partner","crm.lead2partner","model_crm_lead2partner","crm.group_crm_user",1,1,1,1
-"access_crm_lead2opportunity","crm.lead2opportunity","model_crm_lead2opportunity","crm.group_crm_user",1,1,1,1
-"access_crm_lead2opportunity_partner","crm.lead2opportunity.partner","model_crm_lead2opportunity_partner","crm.group_crm_user",1,1,1,1
diff --git a/addons/crm_sale/wizard/__init__.py b/addons/crm_sale/wizard/__init__.py
deleted file mode 100644
index 58a13f8c1e4..00000000000
--- a/addons/crm_sale/wizard/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import crm_lead_to_partner
-import crm_lead_to_opportunity
-import crm_opportunity_to_phonecall
-#import crm_phonecall_to_phonecall
-#import crm_phonecall_to_partner
-#import crm_phonecall_to_opportunity
-#import crm_partner_to_opportunity
\ No newline at end of file
diff --git a/addons/sale_crm/__openerp__.py b/addons/sale_crm/__openerp__.py
index 187d0f401ed..045afbbd82c 100644
--- a/addons/sale_crm/__openerp__.py
+++ b/addons/sale_crm/__openerp__.py
@@ -38,7 +38,7 @@ crm modules.
'website': 'http://www.openerp.com',
'depends': ['sale', 'crm'],
'init_xml': [],
- 'update_xml': ['wizard/crm_make_sale_view.xml',
+ 'update_xml': ['sale_crm_wizard.xml',
'sale_crm_view.xml',
'process/sale_crm_process.xml',
'security/sale_crm_security.xml',
diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml
index 0c997e506d3..24912052190 100644
--- a/addons/sale_crm/sale_crm_view.xml
+++ b/addons/sale_crm/sale_crm_view.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/addons/sale_crm/sale_crm_wizard.xml b/addons/sale_crm/sale_crm_wizard.xml
new file mode 100644
index 00000000000..74dcf06e901
--- /dev/null
+++ b/addons/sale_crm/sale_crm_wizard.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/addons/sale_crm/wizard/__init__.py b/addons/sale_crm/wizard/__init__.py
index 04f40c92207..87048a13fc4 100644
--- a/addons/sale_crm/wizard/__init__.py
+++ b/addons/sale_crm/wizard/__init__.py
@@ -19,7 +19,7 @@
#
##############################################################################
-import crm_make_sale
+import makesale
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_crm/wizard/crm_make_sale.py b/addons/sale_crm/wizard/crm_make_sale.py
deleted file mode 100644
index 01480b3f6df..00000000000
--- a/addons/sale_crm/wizard/crm_make_sale.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import fields, osv
-from tools.translate import _
-from mx.DateTime import now
-
-class crm_make_sale(osv.osv_memory):
- """ Make sale order for crm """
-
- _name = "crm.make.sale"
- _description = "Make sale"
-
- def _selectPartner(self, cr, uid, context=None):
- """
- This function gets default value for partner_id field.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values
- @return : default value of partner_id field.
- """
-
- if not context:
- context = {}
-
- data = context and context.get('active_ids', []) or []
- case_obj = self.pool.get('crm.opportunity')
- case = case_obj.read(cr, uid, data, ['partner_id'])
- return case[0]['partner_id']
-
- def makeOrder(self, cr, uid, ids, context=None):
- """
- This function create Quotation on given case.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of crm make sale' ids
- @param context: A standard dictionary for contextual values
- @return : Dictionary value of created sale order.
- """
- if not context:
- context = {}
-
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
- id = mod_obj.read(cr, uid, result, ['res_id'])
- case_obj = self.pool.get('crm.opportunity')
- sale_obj = self.pool.get('sale.order')
- partner_obj = self.pool.get('res.partner')
- sale_line_obj = self.pool.get('sale.order.line')
-
- data = context and context.get('active_ids', []) or []
-
- for make in self.browse(cr, uid, ids):
- default_partner_addr = partner_obj.address_get(cr, uid, [make.partner_id.id],
- ['invoice', 'delivery', 'contact'])
- default_pricelist = partner_obj.browse(cr, uid, make.partner_id.id,
- context).property_product_pricelist.id
- fpos_data = partner_obj.browse(cr, uid, make.partner_id.id, context).property_account_position
- new_ids = []
-
- for case in case_obj.browse(cr, uid, data):
- if case.partner_id and case.partner_id.id:
- partner_id = case.partner_id.id
- fpos = case.partner_id.property_account_position and case.partner_id.property_account_position.id or False
- partner_addr = partner_obj.address_get(cr, uid, [case.partner_id.id],
- ['invoice', 'delivery', 'contact'])
- pricelist = partner_obj.browse(cr, uid, case.partner_id.id,
- context).property_product_pricelist.id
- else:
- partner_id = make.partner_id.id
- fpos = fpos_data and fpos_data.id or False
- partner_addr = default_partner_addr
- pricelist = default_pricelist
-
- if False in partner_addr.values():
- raise osv.except_osv(_('Data Insufficient!'),_('Customer has no addresses defined!'))
-
- vals = {
- 'origin': 'CRM-Opportunity:%s' % str(case.id),
- 'section_id': case.section_id and case.section_id.id or False,
- 'picking_policy': make.picking_policy,
- 'shop_id': make.shop_id.id,
- 'partner_id': partner_id,
- 'pricelist_id': pricelist,
- 'partner_invoice_id': partner_addr['invoice'],
- 'partner_order_id': partner_addr['contact'],
- 'partner_shipping_id': partner_addr['delivery'],
- 'order_policy': 'manual',
- 'date_order': now(),
- 'fiscal_position': fpos,
- }
-
- if partner_id:
- partner = partner_obj.browse(cr, uid, partner_id, context=context)
- vals['user_id'] = partner.user_id and partner.user_id.id or uid
-
- if make.analytic_account.id:
- vals['project_id'] = make.analytic_account.id
- new_id = sale_obj.create(cr, uid, vals)
- for product_id in make.product_ids:
- value = sale_line_obj.product_id_change(cr, uid, [], pricelist,
- product_id.id, qty=1, partner_id=partner_id, fiscal_position=fpos)['value']
- value['product_id'] = product_id.id
- value['order_id'] = new_id
- value['tax_id'] = [(6,0,value['tax_id'])]
- sale_line_obj.create(cr, uid, value)
-
- case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id})
- new_ids.append(new_id)
-
- if make.close:
- case_obj.case_close(cr, uid, data)
-
- if not new_ids:
- return {}
- if len(new_ids)<=1:
- value = {
- 'domain': str([('id', 'in', new_ids)]),
- 'view_type': 'form',
- 'view_mode': 'form',
- 'res_model': 'sale.order',
- 'view_id': False,
- 'type': 'ir.actions.act_window',
- 'res_id': new_ids and new_ids[0]
- }
- else:
- value = {
- 'domain': str([('id', 'in', new_ids)]),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'sale.order',
- 'view_id': False,
- 'type': 'ir.actions.act_window',
- 'res_id':new_ids
- }
- return value
-
- _columns = {
- 'shop_id': fields.many2one('sale.shop', 'Shop', required = True),
- 'partner_id': fields.many2one('res.partner', 'Customer', required = True, help = 'Use this partner if there is no partner on the case'),
- 'picking_policy': fields.selection([('direct','Direct Delivery'),
- ('one','All at once')], 'Picking Policy', required = True),
- 'product_ids': fields.many2many('product.product', 'product_sale_rel',\
- 'sale_id', 'product_id', 'Products'),
- 'analytic_account': fields.many2one('account.analytic.account', 'Analytic Account'),
- 'close': fields.boolean('Close Case', help = 'Check this to close the case after having created the sale order.'),
- }
- _defaults = {
- 'partner_id': _selectPartner,
- 'close': lambda *a: 1
- }
-
-crm_make_sale()
-
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_crm/wizard/crm_make_sale_view.xml b/addons/sale_crm/wizard/crm_make_sale_view.xml
deleted file mode 100644
index de6a29e5405..00000000000
--- a/addons/sale_crm/wizard/crm_make_sale_view.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
- crm.make.sale.form
- crm.make.sale
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Make Quotation
- ir.actions.act_window
- crm.make.sale
- form
- form
- new
-
-
-
-
diff --git a/addons/sale_crm/wizard/makesale.py b/addons/sale_crm/wizard/makesale.py
new file mode 100644
index 00000000000..c6dc12abf11
--- /dev/null
+++ b/addons/sale_crm/wizard/makesale.py
@@ -0,0 +1,174 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from mx.DateTime import now
+
+import wizard
+import netsvc
+import ir
+import pooler
+from tools.translate import _
+
+sale_form = """
+
+
+
+
+
+
+
+
+
"""
+
+sale_fields = {
+ 'shop_id': {'string': 'Shop', 'type': 'many2one', 'relation': 'sale.shop'},
+ 'partner_id': {'string': 'Customer', 'type': 'many2one',
+ 'relation': 'res.partner',
+ 'help': 'Use this partner if there is no partner on the case'},
+ 'picking_policy': {'string': 'Picking Policy', 'type': 'selection',
+ 'selection': [('direct','Direct Delivery'),('one','All at once')]},
+ 'products': {'string': 'Products', 'type': 'many2many',
+ 'relation': 'product.product'},
+ 'analytic_account': {'string': 'Analytic Account', 'type': 'many2one',
+ 'relation': 'account.analytic.account'},
+ 'close': {'string': 'Close Case', 'type': 'boolean', 'default': lambda *a: 1,
+ 'help': 'Check this to close the case after having created the sale order.'},
+}
+
+
+class make_sale(wizard.interface):
+
+ def _selectPartner(self, cr, uid, data, context):
+ case_obj = pooler.get_pool(cr.dbname).get('crm.opportunity')
+ case = case_obj.read(cr, uid, data['ids'], ['partner_id'])
+ return {'partner_id': case[0]['partner_id']}
+
+ def _makeOrder(self, cr, uid, data, context):
+ pool = pooler.get_pool(cr.dbname)
+ mod_obj = pool.get('ir.model.data')
+ result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
+ id = mod_obj.read(cr, uid, result, ['res_id'])
+ case_obj = pool.get('crm.opportunity')
+ sale_obj = pool.get('sale.order')
+ partner_obj = pool.get('res.partner')
+ sale_line_obj = pool.get('sale.order.line')
+
+ default_partner_addr = partner_obj.address_get(cr, uid, [data['form']['partner_id']],
+ ['invoice', 'delivery', 'contact'])
+ default_pricelist = partner_obj.browse(cr, uid, data['form']['partner_id'],
+ context).property_product_pricelist.id
+ fpos_data = partner_obj.browse(cr, uid, data['form']['partner_id'],context).property_account_position
+ new_ids = []
+
+ for case in case_obj.browse(cr, uid, data['ids']):
+ if case.partner_id and case.partner_id.id:
+ partner_id = case.partner_id.id
+ fpos = case.partner_id.property_account_position and case.partner_id.property_account_position.id or False
+ partner_addr = partner_obj.address_get(cr, uid, [case.partner_id.id],
+ ['invoice', 'delivery', 'contact'])
+ pricelist = partner_obj.browse(cr, uid, case.partner_id.id,
+ context).property_product_pricelist.id
+ else:
+ partner_id = data['form']['partner_id']
+ fpos = fpos_data and fpos_data.id or False
+ partner_addr = default_partner_addr
+ pricelist = default_pricelist
+
+ if False in partner_addr.values():
+ raise wizard.except_wizard(_('Data Insufficient!'),_('Customer has no addresses defined!'))
+
+ vals = {
+ 'origin': 'CRM-Opportunity:%s' % str(case.id),
+ 'section_id': case.section_id and case.section_id.id or False,
+ 'picking_policy': data['form']['picking_policy'],
+ 'shop_id': data['form']['shop_id'],
+ 'partner_id': partner_id,
+ 'pricelist_id': pricelist,
+ 'partner_invoice_id': partner_addr['invoice'],
+ 'partner_order_id': partner_addr['contact'],
+ 'partner_shipping_id': partner_addr['delivery'],
+ 'order_policy': 'manual',
+ 'date_order': now(),
+ 'fiscal_position': fpos,
+ }
+
+ if partner_id:
+ partner = partner_obj.browse(cr, uid, partner_id, context=context)
+ vals['user_id'] = partner.user_id and partner.user_id.id or uid
+
+ if data['form']['analytic_account']:
+ vals['project_id'] = data['form']['analytic_account']
+ new_id = sale_obj.create(cr, uid, vals)
+ for product_id in data['form']['products'][0][2]:
+ value = sale_line_obj.product_id_change(cr, uid, [], pricelist,
+ product_id, qty=1, partner_id=partner_id, fiscal_position=fpos)['value']
+ value['product_id'] = product_id
+ value['order_id'] = new_id
+ value['tax_id'] = [(6,0,value['tax_id'])]
+ sale_line_obj.create(cr, uid, value)
+
+ case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id})
+ new_ids.append(new_id)
+
+ if data['form']['close']:
+ case_obj.case_close(cr, uid, data['ids'])
+
+ if not new_ids:
+ return {}
+
+ if len(new_ids)<=1:
+ value = {
+ 'domain': str([('id', 'in', new_ids)]),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'sale.order',
+ 'view_id': False,
+ 'type': 'ir.actions.act_window',
+ 'res_id': new_ids and new_ids[0]
+ }
+ else:
+ value = {
+ 'domain': str([('id', 'in', new_ids)]),
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'sale.order',
+ 'view_id': False,
+ 'type': 'ir.actions.act_window',
+ 'res_id':new_ids
+ }
+
+ return value
+
+ states = {
+ 'init': {
+ 'actions': [_selectPartner],
+ 'result': {'type': 'form', 'arch': sale_form, 'fields': sale_fields,
+ 'state' : [('end', 'Cancel', 'gtk-cancel'),('order', 'Create Quote', 'gtk-go-forward')]}
+ },
+ 'order': {
+ 'actions': [],
+ 'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
+ }
+ }
+
+make_sale('crm.opportunity.make_order')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
From 7bdd473fa5603c2722648db4693edce6eaea061a Mon Sep 17 00:00:00 2001
From: "atp (Open ERP)"
Date: Wed, 28 Apr 2010 12:16:29 +0530
Subject: [PATCH 055/389] [REM]: Revert all changes because combine crm lead
and opportunity in crm.
bzr revid: atp@tinyerp.co.in-20100428064629-r6zlgsa88ruxr43d
---
addons/crm_sale/__init__.py | 28 --
addons/crm_sale/__openerp__.py | 56 ---
addons/crm_sale/crm_lead.py | 210 -----------
addons/crm_sale/crm_lead_data.xml | 81 -----
addons/crm_sale/crm_lead_demo.xml | 112 ------
addons/crm_sale/crm_lead_menu.xml | 33 --
addons/crm_sale/crm_lead_view.xml | 331 ------------------
addons/crm_sale/crm_opportunity.py | 251 -------------
addons/crm_sale/crm_opportunity_data.xml | 95 -----
addons/crm_sale/crm_opportunity_demo.xml | 88 -----
addons/crm_sale/crm_opportunity_menu.xml | 57 ---
addons/crm_sale/crm_opportunity_view.xml | 329 -----------------
addons/crm_sale/report/__init__.py | 32 --
addons/crm_sale/report/crm_lead_report.py | 88 -----
.../crm_sale/report/crm_lead_report_view.xml | 116 ------
.../crm_sale/report/crm_opportunity_report.py | 102 ------
.../report/crm_opportunity_report_view.xml | 122 -------
addons/crm_sale/security/ir.model.access.csv | 8 -
addons/crm_sale/test/test_crm_lead.yml | 113 ------
addons/crm_sale/test/test_crm_opportunity.yml | 81 -----
addons/crm_sale/wizard/__init__.py | 28 --
.../wizard/crm_lead_to_opportunity.py | 327 -----------------
.../wizard/crm_lead_to_opportunity_view.xml | 63 ----
addons/crm_sale/wizard/crm_lead_to_partner.py | 216 ------------
.../wizard/crm_lead_to_partner_view.xml | 53 ---
.../wizard/crm_opportunity_to_phonecall.py | 138 --------
.../crm_opportunity_to_phonecall_view.xml | 41 ---
27 files changed, 3199 deletions(-)
delete mode 100644 addons/crm_sale/__init__.py
delete mode 100644 addons/crm_sale/__openerp__.py
delete mode 100644 addons/crm_sale/crm_lead.py
delete mode 100644 addons/crm_sale/crm_lead_data.xml
delete mode 100644 addons/crm_sale/crm_lead_demo.xml
delete mode 100644 addons/crm_sale/crm_lead_menu.xml
delete mode 100644 addons/crm_sale/crm_lead_view.xml
delete mode 100644 addons/crm_sale/crm_opportunity.py
delete mode 100644 addons/crm_sale/crm_opportunity_data.xml
delete mode 100644 addons/crm_sale/crm_opportunity_demo.xml
delete mode 100644 addons/crm_sale/crm_opportunity_menu.xml
delete mode 100644 addons/crm_sale/crm_opportunity_view.xml
delete mode 100644 addons/crm_sale/report/__init__.py
delete mode 100644 addons/crm_sale/report/crm_lead_report.py
delete mode 100644 addons/crm_sale/report/crm_lead_report_view.xml
delete mode 100644 addons/crm_sale/report/crm_opportunity_report.py
delete mode 100644 addons/crm_sale/report/crm_opportunity_report_view.xml
delete mode 100644 addons/crm_sale/security/ir.model.access.csv
delete mode 100644 addons/crm_sale/test/test_crm_lead.yml
delete mode 100644 addons/crm_sale/test/test_crm_opportunity.yml
delete mode 100644 addons/crm_sale/wizard/__init__.py
delete mode 100644 addons/crm_sale/wizard/crm_lead_to_opportunity.py
delete mode 100644 addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml
delete mode 100644 addons/crm_sale/wizard/crm_lead_to_partner.py
delete mode 100644 addons/crm_sale/wizard/crm_lead_to_partner_view.xml
delete mode 100644 addons/crm_sale/wizard/crm_opportunity_to_phonecall.py
delete mode 100644 addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml
diff --git a/addons/crm_sale/__init__.py b/addons/crm_sale/__init__.py
deleted file mode 100644
index 9e87d6f4cc5..00000000000
--- a/addons/crm_sale/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import crm_lead
-import crm_opportunity
-import wizard
-import report
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/crm_sale/__openerp__.py b/addons/crm_sale/__openerp__.py
deleted file mode 100644
index bdcfbcc4c2d..00000000000
--- a/addons/crm_sale/__openerp__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-
-{
- 'name': 'Customer & Supplier Relationship Management',
- 'version': '1.0',
- 'category': 'Generic Modules/CRM & SRM',
- 'description': """Lead and business Opportunity """,
-
- 'author': 'Tiny',
- 'website': 'http://www.openerp.com',
- 'depends': ['crm'],
- 'init_xml': [
- 'crm_lead_data.xml',
- 'crm_opportunity_data.xml',
- ],
- 'update_xml': [
- 'wizard/crm_lead_to_partner_view.xml',
- 'wizard/crm_lead_to_opportunity_view.xml',
- 'wizard/crm_opportunity_to_phonecall_view.xml',
- 'crm_lead_view.xml',
- 'crm_lead_menu.xml',
- 'crm_opportunity_view.xml',
- 'crm_opportunity_menu.xml',
- ],
- 'demo_xml': [
- 'crm_lead_demo.xml',
- 'crm_opportunity_demo.xml',
- ],
- 'test': ['test/test_crm_lead.yml',
- #'test/test_crm_opportunity.yml',
- ],
- 'installable': True,
- 'active': False,
- 'certificate': '0079056041421',
-}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/crm_lead.py b/addons/crm_sale/crm_lead.py
deleted file mode 100644
index 55da349250b..00000000000
--- a/addons/crm_sale/crm_lead.py
+++ /dev/null
@@ -1,210 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import fields, osv, orm
-from datetime import datetime, timedelta
-import crm
-import math
-import time
-import mx.DateTime
-from tools.translate import _
-
-
-AVAILABLE_PRIORITIES = [
- ('5', 'Lowest'),
- ('4', 'Low'),
- ('3', 'Normal'),
- ('2', 'High'),
- ('1', 'Highest')
-]
-
-class crm_lead(osv.osv):
- """ CRM Lead Case """
-
- _name = "crm.lead"
- _description = "Leads Cases"
- _order = "priority, id desc"
- _inherit = ['res.partner.address', 'crm.case']
-
- def case_open(self, cr, uid, ids, *args):
- """
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case's Ids
- @param *args: Give Tuple Value
- """
-
- res = super(crm_lead, self).case_open(cr, uid, ids, *args)
- self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')})
- return res
-
- def _compute_day(self, cr, uid, ids, fields, args, context={}):
- """
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Openday’s IDs
- @return: difference between current date and log date
- @param context: A standard dictionary for contextual values
- """
- cal_obj = self.pool.get('resource.calendar')
- res_obj = self.pool.get('resource.resource')
-
- res = {}
- for lead in self.browse(cr, uid, ids , context):
- for field in fields:
- res[lead.id] = {}
- duration = 0
- ans = False
- if field == 'day_open':
- if lead.date_open:
- date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S")
- date_open = datetime.strptime(lead.date_open, "%Y-%m-%d %H:%M:%S")
- ans = date_open - date_create
- date_until = lead.date_open
- elif field == 'day_close':
- if lead.date_closed:
- date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S")
- date_close = datetime.strptime(lead.date_closed, "%Y-%m-%d %H:%M:%S")
- date_until = lead.date_closed
- ans = date_close - date_create
- if ans:
- resource_id = False
- if lead.user_id:
- resource_ids = res_obj.search(cr, uid, [('user_id','=',lead.user_id.id)])
- if len(resource_ids):
- resource_id = resource_ids[0]
-
- duration = float(ans.days)
- if lead.section_id.resource_calendar_id:
- duration = float(ans.days) * 24
- new_dates = cal_obj.interval_get(cr,
- uid,
- lead.section_id.resource_calendar_id and lead.section_id.resource_calendar_id.id or False,
- mx.DateTime.strptime(lead.create_date, '%Y-%m-%d %H:%M:%S'),
- duration,
- resource=resource_id
- )
- no_days = []
- date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S')
- for in_time, out_time in new_dates:
- if in_time.date not in no_days:
- no_days.append(in_time.date)
- if out_time > date_until:
- break
- duration = len(no_days)
- res[lead.id][field] = abs(int(duration))
- return res
-
- _columns = {
-
- 'categ_id': fields.many2one('crm.case.categ', 'Lead Source', \
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.opportunity')]"),
- 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', \
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.lead')]"),
- 'partner_name': fields.char("Contact Name", size=64),
-
- 'priority': fields.selection([('5', 'Lowest'),
- ('4', 'Low'),
- ('3', 'Normal'),
- ('2', 'High'),
- ('1', 'Highest')], 'Priority'),
- 'date_closed': fields.datetime('Closed', readonly=True),
- 'stage_id': fields.many2one('crm.case.stage', 'Stage', \
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.lead')]"),
- 'opportunity_id': fields.many2one('crm.opportunity', 'Opportunity'),
-
- 'user_id': fields.many2one('res.users', 'Salesman'),
- 'referred': fields.char('Referred By', size=64),
- 'date_open': fields.datetime('Opened', readonly=True),
- 'day_open': fields.function(_compute_day, string='Days to Open', \
- method=True, multi='day_open', type="float", store=True),
- 'day_close': fields.function(_compute_day, string='Days to Close', \
- method=True, multi='day_close', type="float", store=True),
- 'function_name': fields.char('Function', size=64),
- }
-
- _defaults = {
- 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
- # 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
- }
-
- def convert_opportunity(self, cr, uid, ids, context=None):
- """ Precomputation for converting lead to opportunity
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of closeday’s IDs
- @param context: A standard dictionary for contextual values
- @return: Value of action in dict
- """
- if not context:
- context = {}
- context.update({'active_ids': ids})
-
- data_obj = self.pool.get('ir.model.data')
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_create')
- value = {}
-
- view_id = False
- if data_id:
- view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
- for case in self.browse(cr, uid, ids):
- context.update({'opportunity_id': case.id})
- context.update({'active_id': case.id})
- if not case.partner_id:
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_partner')
- view_id1 = False
- if data_id:
- view_id1 = data_obj.browse(cr, uid, data_id, context=context).res_id
- value = {
- 'name': _('Create Partner'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead2opportunity.partner',
- 'view_id': False,
- 'context': context,
- 'views': [(view_id1, 'form')],
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- 'nodestroy': True
- }
- break
- else:
- value = {
- 'name': _('Create Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead2opportunity',
- 'view_id': False,
- 'context': context,
- 'views': [(view_id, 'form')],
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- 'nodestroy': True
- }
- return value
-
-crm_lead()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/crm_lead_data.xml b/addons/crm_sale/crm_lead_data.xml
deleted file mode 100644
index cf0a2671dc0..00000000000
--- a/addons/crm_sale/crm_lead_data.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
- New
-
-
-
-
- Assigned
-
-
-
-
- In Process
-
-
-
-
- Converted
-
-
-
-
- Recycled
-
-
-
-
- Dead
-
-
-
-
-
-
- Telesales
-
-
-
-
- Mail
-
-
-
-
- Email
-
-
-
-
- Print
-
-
-
-
- Web
-
-
-
-
- Radio
-
-
-
-
- Television
-
-
-
-
- Newsletter
-
-
-
-
-
-
diff --git a/addons/crm_sale/crm_lead_demo.xml b/addons/crm_sale/crm_lead_demo.xml
deleted file mode 100644
index af9d5bbfedb..00000000000
--- a/addons/crm_sale/crm_lead_demo.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/crm_lead_menu.xml b/addons/crm_sale/crm_lead_menu.xml
deleted file mode 100644
index 93faef7dc6e..00000000000
--- a/addons/crm_sale/crm_lead_menu.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
- Leads
- crm.lead
- tree,form
-
-
-
-
-
- tree
-
-
-
-
-
- form
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/crm_lead_view.xml b/addons/crm_sale/crm_lead_view.xml
deleted file mode 100644
index c30694ede30..00000000000
--- a/addons/crm_sale/crm_lead_view.xml
+++ /dev/null
@@ -1,331 +0,0 @@
-
-
-
-
-
-
-
- Lead Stages
- crm.case.stage
- form
-
- [('object_id.model', '=', 'crm.lead')]
- {'object_id':'crm.lead'}
-
-
-
-
-
-
- Lead Resource Type
- crm.case.resource.type
- form
-
- [('object_id.model', '=', 'crm.lead')]
- {'object_id':'crm.lead'}
-
-
-
-
-
-
- CRM - Leads Form
- crm.lead
- form
-
-
-
-
-
-
-
-
- Opportunities Tree
- crm.opportunity
- tree
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CRM - Opportunity Graph
- crm.opportunity
- graph
-
-
-
-
-
-
-
-
-
-
-
-
- CRM - Opportunities Search
- crm.opportunity
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/report/__init__.py b/addons/crm_sale/report/__init__.py
deleted file mode 100644
index 7c8912e1ea5..00000000000
--- a/addons/crm_sale/report/__init__.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-#import report_businessopp
-#import crm_report
-#import crm_claim_report
-import crm_lead_report
-#import crm_phonecall_report
-#import crm_fundraising_report
-import crm_opportunity_report
-#import crm_helpdesk_report
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/crm_sale/report/crm_lead_report.py b/addons/crm_sale/report/crm_lead_report.py
deleted file mode 100644
index d400700c0b5..00000000000
--- a/addons/crm_sale/report/crm_lead_report.py
+++ /dev/null
@@ -1,88 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import fields,osv
-import tools
-
-AVAILABLE_STATES = [
- ('draft','Draft'),
- ('open','Open'),
- ('cancel', 'Cancelled'),
- ('done', 'Closed'),
- ('pending','Pending')
-]
-
-class crm_lead_report(osv.osv):
- """ CRM Lead Report """
- _name = "crm.lead.report"
- _auto = False
- _inherit = "crm.case.report"
- _description = "CRM Lead Report"
-
- _columns = {
- 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
- 'categ_id': fields.many2one('crm.case.categ', 'Category',\
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.lead')]" , readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
- 'company_id': fields.many2one('res.company', 'Company', readonly=True),
- }
- def init(self, cr):
-
- """
- CRM Lead Report
- @param cr: the current row, from the database cursor
- """
-
- tools.drop_view_if_exists(cr, 'crm_lead_report')
- cr.execute("""
- create or replace view crm_lead_report as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- to_char(c.create_date, 'YYYY-MM-DD') as day,
- c.state as state,
- c.user_id,
- c.stage_id,
- c.company_id,
- c.section_id,
- c.categ_id,
- c.partner_id,
- count(*) as nbr,
- 0 as avg_answers,
- 0.0 as perc_done,
- 0.0 as perc_cancel,
- date_trunc('day',c.create_date) as create_date,
- avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
- from
- crm_lead c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
- c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id
- ,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
- )""")
-
-crm_lead_report()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/report/crm_lead_report_view.xml b/addons/crm_sale/report/crm_lead_report_view.xml
deleted file mode 100644
index d6502c190d9..00000000000
--- a/addons/crm_sale/report/crm_lead_report_view.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
- crm.lead.report.tree
- crm.lead.report
- tree
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- crm.lead.report.form
- crm.lead.report
-
- form
-
-
-
-
-
-
-
-
-
-
-
- crm.lead.report.graph
- crm.lead.report
- graph
-
-
-
-
-
-
-
-
-
-
-
-
- crm.lead.report.select
- crm.lead.report
-
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Leads
- crm.lead.report
- form
- {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
- tree,graph
-
-
-
-
-
-
- tree
-
-
-
-
-
-
- graph
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/report/crm_opportunity_report.py b/addons/crm_sale/report/crm_opportunity_report.py
deleted file mode 100644
index db67919bf30..00000000000
--- a/addons/crm_sale/report/crm_opportunity_report.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from crm.report import crm_report
-from osv import fields,osv
-import tools
-
-
-AVAILABLE_STATES = [
- ('draft','Draft'),
- ('open','Open'),
- ('cancel', 'Cancelled'),
- ('done', 'Closed'),
- ('pending','Pending')
-]
-
-class crm_opportunity_report(osv.osv):
- """ CRM Opportunity Report """
- _name = "crm.opportunity.report"
- _auto = False
- _inherit = "crm.case.report"
- _description = "CRM Opportunity Report"
- _columns = {
- 'probability': fields.float('Avg. Probability', readonly=True,group_operator='avg'),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
- 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
- 'categ_id': fields.many2one('crm.case.categ', 'Category',\
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage',\
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
- 'company_id': fields.many2one('res.company', 'Company', readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- }
-
- def init(self, cr):
- """ Display Est.Revenue , Average Probability ,Est.Revenue Probability
- @param cr: the current row, from the database cursor
- """
-
- tools.drop_view_if_exists(cr, 'crm_opportunity_report')
- cr.execute("""
- create or replace view crm_opportunity_report as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- to_char(c.create_date, 'YYYY-MM-DD') as day,
- c.state as state,
- c.user_id,
- c.section_id,
- c.categ_id,
- c.stage_id,
- c.partner_id,
- c.company_id,
- count(*) as nbr,
- 0 as avg_answers,
- 0.0 as perc_done,
- 0.0 as perc_cancel,
- date_trunc('day',c.create_date) as create_date,
- sum(planned_revenue) as amount_revenue,
- sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
- from
- crm_opportunity c
- group by
- to_char(c.create_date, 'YYYY'),
- to_char(c.create_date, 'MM'),
- to_char(c.create_date, 'YYYY-MM-DD'),
- c.state,
- c.user_id,
- c.section_id,
- c.stage_id,
- c.categ_id,
- c.partner_id,
- company_id,
- create_date
- )""")
-
-crm_opportunity_report()
diff --git a/addons/crm_sale/report/crm_opportunity_report_view.xml b/addons/crm_sale/report/crm_opportunity_report_view.xml
deleted file mode 100644
index 29a66b838f0..00000000000
--- a/addons/crm_sale/report/crm_opportunity_report_view.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-
-
-
-
-
-
-
- crm.opportunity.report.tree
- crm.opportunity.report
- tree
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- crm.opportunity.report.form
- crm.opportunity.report
-
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- crm.opportunity.report.graph
- crm.opportunity.report
- graph
-
-
-
-
-
-
-
-
-
-
-
-
- crm.opportunity.report.select
- crm.opportunity.report
-
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Opportunities
- crm.opportunity.report
- form
- tree,graph
- {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
-
-
-
-
- tree
-
-
-
-
-
- graph
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/security/ir.model.access.csv b/addons/crm_sale/security/ir.model.access.csv
deleted file mode 100644
index ece648be92f..00000000000
--- a/addons/crm_sale/security/ir.model.access.csv
+++ /dev/null
@@ -1,8 +0,0 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_crm_lead","crm.lead","model_crm_lead","crm.group_crm_manager",1,1,1,1
-"access_crm_opportunity","crm.opportunity","model_crm_opportunity","crm.group_crm_manager",1,1,1,1
-"access_crm_lead_report_user","crm.lead.report","model_crm_lead_report","crm.group_crm_user",1,0,0,0
-"access_crm_opportunity_report_user","crm.opportunity.report","model_crm_opportunity_report","crm.group_crm_user",1,0,0,0
-"access_crm_lead2partner","crm.lead2partner","model_crm_lead2partner","crm.group_crm_user",1,1,1,1
-"access_crm_lead2opportunity","crm.lead2opportunity","model_crm_lead2opportunity","crm.group_crm_user",1,1,1,1
-"access_crm_lead2opportunity_partner","crm.lead2opportunity.partner","model_crm_lead2opportunity_partner","crm.group_crm_user",1,1,1,1
diff --git a/addons/crm_sale/test/test_crm_lead.yml b/addons/crm_sale/test/test_crm_lead.yml
deleted file mode 100644
index 22fdfffca1b..00000000000
--- a/addons/crm_sale/test/test_crm_lead.yml
+++ /dev/null
@@ -1,113 +0,0 @@
-- |
- In order to test the CRM in OpenERP,
- I will do a customer qualification process that
- starts with a fist contact with a customer (a lead), which will be converted to a
- business opportunity and a partner.
-- |
- In order to test the flow, I create a two new users "user_crm" and
- I assign the group "salesman".
--
- !record {model: res.users, id: res_users_usercrm0}:
- company_id: base.main_company
- context_lang: en_US
- context_section_id: crm.section_sales_department
- groups_id:
- - crm.group_crm_user
- login: user_crm
- name: user_crm
- password: user_crm
-
-
-- |
- I start by creating a new lead "New Customer" and I provide an address to this
- new customer, as well as an email "info@mycustomer.com".
--
- !record {model: crm.lead, id: crm_lead_newcustomer0}:
- email_from: info@mycustomer.com
- name: New Customer
- partner_name: Sandip zala
- phone: (855) 924-4364
- mobile: (333) 715-1450
- section_id: crm.section_sales_department
- referred: False
- title: M.
-- |
- I check that the lead is in 'draft' state,
--
- !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in Draft}:
- - state == "draft"
--
- I open lead by click on "Open" button,
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref("crm_lead_newcustomer0")])
-
-- |
- As the lead seems to be a real business opportunity, I will convert it to a
- partner
- and a business opportunity by clicking on the "Convert" button.
--
- !python {model: crm.lead}: |
- lead = self.browse(cr, uid, ref('crm_lead_newcustomer0'))
- if not lead.partner_id:
- self.convert_opportunity(cr, uid, [ref("crm_lead_newcustomer0")], {'active_ids': [ref("crm_lead_newcustomer0")]})
--
- |
- Now, select "create a new partner" option in this wizard.
--
- !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_0}:
- action: 'create'
--
- I click on "Continue" button of this wizard.
--
- !python {model: crm.lead2opportunity.partner}: |
- self.make_partner(cr, uid, [ref("crm_lead2opportunity_partner_create_0")], {'active_ids': [ref("crm_lead_newcustomer0")]})
--
- Now, I give value to this wizard field.
--
- !record {model: crm.lead2opportunity, id: crm_lead2opportunity_stonage_0}:
- name: Sandip zala
- planned_revenue: 0.00
- probability: 0.00
--
- Then, Click on "Create Opportunity" button of this wizard.
--
- !python {model: crm.lead2opportunity}: |
- self.action_apply(cr, uid, [ref('crm_lead2opportunity_stonage_0')], {'active_id': ref('crm_lead_newcustomer0')})
-
-- |
- I can check that a lead and a business opportunity is now assigned to this
- lead.
--
- # !python {model: crm.lead, id: crm_lead_newcustomer0}:
- # - opportunity_id.id != False
-
-- |
- I check that the partner associated to this lead as the same country, phone number
- and name than the opportunity.
--
- !python {model: crm.lead}: |
- lead = self.browse(cr, uid, ref("crm_lead_newcustomer0"))
- print "lead", lead.partner_name
- obj_opportunity = self.pool.get('crm.opportunity')
- ids = obj_opportunity.search(cr, uid, [('name', '=', lead.partner_name)])
- opportunity = obj_opportunity.browse(cr, uid, ids)[0]
- assert lead.partner_name == opportunity.partner_id.name
- assert lead.phone == opportunity.phone
--
- |
- # yaml is also not working smpt server and send new email.
-
-- |
- I configure with smtp server.
-- |
- And I communicate with lead through send New mail to Lead using it email address from user which are loged.
-- |
- I check that communication history generated when send email to lead.
-- |
- Then, I add a cc which receive copy of future communication between partner and users by mail.
-
-- |
- I Reply to last Email to lead with some document attached.and check that communication history generated or not.
-
-
\ No newline at end of file
diff --git a/addons/crm_sale/test/test_crm_opportunity.yml b/addons/crm_sale/test/test_crm_opportunity.yml
deleted file mode 100644
index d7118dd0c90..00000000000
--- a/addons/crm_sale/test/test_crm_opportunity.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-- |
- I start by creating a new Opportunity. And I select partner for opportunity.
- I can see that after selecting partner his contact and email is automatically filled.
--
- !record {model: crm.opportunity, id: crm_opportunity_abcfuelcounits0}:
- email_from: info@balmerinc.be
- name: 'ABC FUEL CO 829264 - 10002 units '
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- stage_id: crm.stage_oppor1
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
-
-- |
- I check that the opportunity is in 'New' state.
--
- !assert {model: crm.opportunity, id: crm_opportunity_abcfuelcounits0}:
- - state == "draft"
-- |
- I open opportunity by click on "Open" button,
--
- !python {model: crm.opportunity}: |
- self.case_open(cr, uid, [ref("crm_opportunity_abcfuelcounits0")])
-
-- |
- I schedule Meeting on this current opportunity by clicking on "schedule
- Meeting".
--
- !python {model: crm.opportunity}: |
- self.action_makeMeeting(cr, uid, [ref("crm_opportunity_abcfuelcounits0")])
-
-- |
- I can see that Meeting's calendar view is shown.
- then I click on the date on which I want schedule meeting.
- I fill proper data for that meeting and save it
--
- !record {model: crm.meeting, id: crm_meeting_abcfuelcounits0}:
- alarm_id: base_calendar.alarm3
- date: '2010-04-16 00:00:00'
- date_deadline: '2010-04-16 08:00:00'
- duration: 8.0
- email_from: info@balmerinc.be
- name: 'ABC FUEL CO 829264 - 10002 units '
- opportunity_id: 'crm_opportunity_abcfuelcounits0'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- rrule_type: weekly
- section_id: crm.section_sales_department
- state: open
-- |
- In order to schedule a phonecall to the partner
- I click on "schedule call" button and select planned date for the call.
--
- !record {model: crm.opportunity2phonecall, id: crm_opportunity2phonecall_abcfuelcounits0}:
- date: '2010-04-17 11:15:00'
- name: 'ABC FUEL CO 829264 - 10002 units '
- section_id: crm.section_sales_department
- user_id: base.user_demo
-- |
- schedule phonecall by apply (action_apply)function of opportunity2phoncall wizard
--
- !python {model: crm.opportunity2phonecall}: |
- self.action_apply(cr, uid, [ref('crm_opportunity2phonecall_abcfuelcounits0')], {'active_ids': [ref("crm_opportunity_abcfuelcounits0")]})
-- |
- I check that phonecall record is created for that opportunity.
--
- !python {model: crm.phonecall}: |
- ids = self.search(cr, uid, [('name', '=', 'ABC FUEL CO 829264 - 10002 units')])
- assert len(ids)
-- |
- I can see phonecall record after click on "Schedule call" wizard.
--
- !record {model: crm.phonecall, id: crm_phonecall_abcfuelcounits0}:
- date: '2010-04-17 11:15:00'
- duration: 3.0
- name: 'ABC FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- section_id: crm.section_sales_department
-
\ No newline at end of file
diff --git a/addons/crm_sale/wizard/__init__.py b/addons/crm_sale/wizard/__init__.py
deleted file mode 100644
index 58a13f8c1e4..00000000000
--- a/addons/crm_sale/wizard/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import crm_lead_to_partner
-import crm_lead_to_opportunity
-import crm_opportunity_to_phonecall
-#import crm_phonecall_to_phonecall
-#import crm_phonecall_to_partner
-#import crm_phonecall_to_opportunity
-#import crm_partner_to_opportunity
\ No newline at end of file
diff --git a/addons/crm_sale/wizard/crm_lead_to_opportunity.py b/addons/crm_sale/wizard/crm_lead_to_opportunity.py
deleted file mode 100644
index 5aef886ab5c..00000000000
--- a/addons/crm_sale/wizard/crm_lead_to_opportunity.py
+++ /dev/null
@@ -1,327 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from mx.DateTime import now
-from osv import osv, fields
-from tools.translate import _
-
-
-class crm_lead2opportunity(osv.osv_memory):
- _name = 'crm.lead2opportunity'
- _description = 'Lead To Opportunity'
-
- def action_cancel(self, cr, uid, ids, context=None):
- """
- Closes Lead To Opportunity form
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- """
- return {'type': 'ir.actions.act_window_close'}
-
- def action_apply(self, cr, uid, ids, context=None):
- """
- This converts lead to opportunity and opens Opportunity view
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Opportunity IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Opportunity form
- """
- record_id = context and context.get('active_id', False) or False
- if not record_id:
- return {}
-
- lead_obj = self.pool.get('crm.lead')
- opp_obj = self. pool.get('crm.opportunity')
- data_obj = self.pool.get('ir.model.data')
- history_obj = self.pool.get('crm.case.history')
- model_obj = self.pool.get('ir.model')
-
- # Get Opportunity views
- result = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_case_opportunities_filter')
- res = data_obj.read(cr, uid, result, ['res_id'])
- id2 = data_obj._get_id(cr, uid, 'crm_sale', 'crm_case_form_view_oppor')
- id3 = data_obj._get_id(cr, uid, 'crm_sale', 'crm_case_tree_view_oppor')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- lead = lead_obj.browse(cr, uid, record_id, context=context)
- model_ids = model_obj.search(cr, uid, [('model', '=', 'crm.opportunity')])
-
-
- for this in self.browse(cr, uid, ids, context=context):
- new_opportunity_id = opp_obj.create(cr, uid, {
- 'name': this.name,
- 'referred': lead.referred,
- 'planned_revenue': this.planned_revenue,
- 'probability': this.probability,
- 'partner_id': lead.partner_id and lead.partner_id.id or False,
- 'section_id': lead.section_id and lead.section_id.id or False,
- 'description': lead.description or False,
- 'date_deadline': lead.date_deadline or False,
- 'partner_address_id': lead.partner_address_id and lead.partner_address_id.id or False ,
- 'priority': lead.priority,
- 'phone': lead.phone,
- 'email_from': lead.email_from
- })
- new_opportunity = opp_obj.browse(cr, uid, new_opportunity_id)
- vals = {
- 'partner_id': this.partner_id and this.partner_id.id or False,
- }
- if not lead.opportunity_id:
- vals.update({'opportunity_id' : new_opportunity.id})
-
- model_opportunity_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'crm.opportunity')], context=context)[0]
-
- for model in ('crm.case.log', 'crm.case.history'):
- log_proxy = self.pool.get(model)
- log_ids = log_proxy.search(cr, uid, [('model_id.model', '=', 'crm.lead'),('res_id', '=', lead.id)], context=context)
- for log_id in log_ids:
- log_proxy.copy(cr, uid, log_id, {'model_id':model_opportunity_id}, context=context)
-
- lead_obj.write(cr, uid, [lead.id], vals)
- lead_obj.case_close(cr, uid, [lead.id])
-
- # Copy lead history to opportunity
- for his_id in lead.history_line:
- history_ids = history_obj.copy(cr, uid, his_id.id, \
- {'model_id': model_ids[0], \
- 'res_id': new_opportunity_id})
-
- #opp_obj.case_open(cr, uid, [new_opportunity_id])
-
- value = {
- 'name': _('Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.opportunity',
- 'res_id': int(new_opportunity_id),
- 'view_id': False,
- 'views': [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
- return value
-
- _columns = {
- 'name' : fields.char('Opportunity Summary', size=64, required=True, select=1),
- 'probability': fields.float('Success Probability'),
- 'planned_revenue': fields.float('Expected Revenue'),
- 'partner_id': fields.many2one('res.partner', 'Partner'),
- }
-
- def view_init(self, cr, uid, fields, context=None):
- """
- This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- """
- lead_obj = self.pool.get('crm.lead')
-
- for lead in lead_obj.browse(cr, uid, context.get('active_ids', [])):
- if lead.state in ['done', 'cancel']:
- raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
-Leads Could not convert into Opportunity"))
- if lead.state != 'open':
- raise osv.except_osv(_('Warning !'), _('Lead should be in \
-\'Open\' state before converting to Opportunity.'))
- return False
-
- def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
- """
- lead_obj = self.pool.get('crm.lead')
- rec_ids = context and context.get('active_ids', [])
- partner_id = context.get('partner_id', False)
- data = context and context.get('active_ids', []) or []
- res = super(crm_lead2opportunity, self).default_get(cr, uid, fields, context=context)
- for lead in lead_obj.browse(cr, uid, data, context=context):
- if 'name' in fields:
- res.update({'name': lead.partner_name})
- if 'partner_id' in fields:
- res.update({'partner_id': partner_id and partner_id[0] or False})
- return res
-
-crm_lead2opportunity()
-
-class crm_lead2opportunity_partner(osv.osv_memory):
- _name = 'crm.lead2opportunity.partner'
- _description = 'Lead To Opportunity Partner'
- _inherit = 'crm.lead2partner'
-
- _columns = {
- 'partner_id': fields.many2one('res.partner', 'Partner'),
- 'action': fields.selection([('exist', 'Link to an existing partner'), ('create', 'Create a new partner')], 'Action'),
- }
-
- def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
- """
- lead_obj = self.pool.get('crm.lead')
- partner_obj = self.pool.get('res.partner')
- contact_obj = self.pool.get('res.partner.address')
- rec_ids = context and context.get('active_ids', [])
- partner_id = False
-
- data = context and context.get('active_ids', []) or []
- res = super(crm_lead2opportunity_partner, self).default_get(cr, uid, fields, context=context)
-
- for lead in lead_obj.browse(cr, uid, data, context=context):
- partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
- if not partner_ids and lead.email_from:
- address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
- if address_ids:
- addresses = contact_obj.browse(cr, uid, address_ids)
- partner_ids = addresses and [addresses[0].partner_id.id] or False
- partner_id = partner_ids and partner_ids[0] or False
-
- if 'partner_id' in fields:
- res.update({'partner_id': partner_id})
- if 'action' in fields:
- res.update({'action': partner_id and 'exist' or 'create'})
- return res
-
- def make_partner(self, cr, uid, ids, context=None):
- """
- This function Makes partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Partner form.
- """
- if not context:
- context = {}
-
- partner_ids = self._create_partner(cr, uid, ids, context)
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'])
- value = {}
- data_obj = self.pool.get('ir.model.data')
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_create')
-
- view_id = False
- if data_id:
- view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
-
- context.update({'partner_id': partner_ids})
- value = {
- 'name': _('Create Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead2opportunity',
- 'view_id': False,
- 'context': context,
- 'views': [(view_id, 'form')],
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- }
- return value
-
- def action_skip(self, cr, uid, ids, context=None):
- """
- This skips partner creation
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Opportunity IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for Opportunity form
- """
- value = {}
- data_obj = self.pool.get('ir.model.data')
- data_id = data_obj._get_id(cr, uid, 'crm_sale', 'view_crm_lead2opportunity_create')
- view_id = False
- if data_id:
- view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
-
- context.update({'partner_id': False})
- value = {
- 'name': _('Create Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead2opportunity',
- 'view_id': False,
- 'context': context,
- 'views': [(view_id, 'form')],
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- }
- return value
-
-
- def view_init(self, cr, uid, fields, context=None):
- """
- This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- """
- lead_obj = self.pool.get('crm.lead')
-
- for lead in lead_obj.browse(cr, uid, context.get('active_ids', [])):
- if lead.state in ['done', 'cancel']:
- raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
-Leads Could not convert into Opportunity"))
- if lead.state != 'open':
- raise osv.except_osv(_('Warning !'), _('Lead should be in \
-\'Open\' state before converting to Opportunity.'))
- return False
-
-crm_lead2opportunity_partner()
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml b/addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml
deleted file mode 100644
index 229b54e09fe..00000000000
--- a/addons/crm_sale/wizard/crm_lead_to_opportunity_view.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
- crm.lead2opportunity.create
- crm.lead2opportunity
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Create Opportunity
- ir.actions.act_window
- crm.lead2opportunity
- form
- form
- new
-
-
-
-
- crm.lead2opportunity.partner.form
- crm.lead2opportunity.partner
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/wizard/crm_lead_to_partner.py b/addons/crm_sale/wizard/crm_lead_to_partner.py
deleted file mode 100644
index 267c3296844..00000000000
--- a/addons/crm_sale/wizard/crm_lead_to_partner.py
+++ /dev/null
@@ -1,216 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import osv, fields
-from tools.translate import _
-
-class crm_lead2partner(osv.osv_memory):
- """ Converts lead to partner """
-
- _name = 'crm.lead2partner'
- _description = 'Lead to Partner'
-
- _columns = {
- 'action': fields.selection([('exist', 'Link to an existing partner'), \
- ('create', 'Create a new partner')], \
- 'Action', required=True),
- 'partner_id': fields.many2one('res.partner', 'Partner')
- }
-
- def view_init(self, cr, uid, fields, context=None):
- """
- This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- """
-
- lead_obj = self.pool.get('crm.lead')
- rec_ids = context and context.get('active_ids', [])
- for lead in lead_obj.browse(cr, uid, rec_ids, context=context):
- if lead.partner_id:
- raise osv.except_osv(_('Warning !'),
- _('A partner is already defined on this lead.'))
-
- def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
- """
- lead_obj = self.pool.get('crm.lead')
- partner_obj = self.pool.get('res.partner')
- contact_obj = self.pool.get('res.partner.address')
- rec_ids = context and context.get('active_ids', [])
- partner_id = False
-
- data = context and context.get('active_ids', []) or []
- res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context)
-
- for lead in lead_obj.browse(cr, uid, data, context=context):
- partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
- if not partner_ids and lead.email_from:
- address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
- if address_ids:
- addresses = contact_obj.browse(cr, uid, address_ids)
- partner_ids = addresses and [addresses[0].partner_id.id] or False
- partner_id = partner_ids and partner_ids[0] or False
-
- if 'partner_id' in fields:
- res.update({'partner_id': partner_id})
- if 'action' in fields:
- res.update({'action': partner_id and 'exist' or 'create'})
- return res
-
- def open_create_partner(self, cr, uid, ids, context=None):
- """
- This function Opens form of create partner.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for next form.
- """
- if not context:
- context = {}
-
- view_obj = self.pool.get('ir.ui.view')
- view_id = view_obj.search(cr, uid, [('model', '=', 'crm.lead2partner'), \
- ('name', '=', 'crm.lead2partner.view')])
- return {
- 'view_mode': 'form',
- 'view_type': 'form',
- 'view_id': view_id or False,
- 'res_model': 'crm.lead2partner',
- 'context': context,
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- }
-
-
- def _create_partner(self, cr, uid, ids, context=None):
- """
- This function Creates partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary {}.
- """
- if not context:
- context = {}
-
- lead_obj = self.pool.get('crm.lead')
- partner_obj = self.pool.get('res.partner')
- contact_obj = self.pool.get('res.partner.address')
- partner_ids = []
- partner_id = False
- contact_id = False
- rec_ids = context and context.get('active_ids', [])
-
- for data in self.browse(cr, uid, ids):
- for lead in lead_obj.browse(cr, uid, rec_ids):
- if data.action == 'create':
- partner_id = partner_obj.create(cr, uid, {
- 'name': lead.partner_name or lead.name,
- 'user_id': lead.user_id.id,
- 'comment': lead.description,
- })
- function_id = self.pool.get('res.partner.function').search(cr,uid,[('name','=',lead.function_name)])
- contact_id = contact_obj.create(cr, uid, {
- 'partner_id': partner_id,
- 'name': lead.name,
- 'phone': lead.phone,
- 'mobile': lead.mobile,
- 'email': lead.email_from,
- 'fax': lead.fax,
- 'title': lead.title,
- 'function': function_id and function_id[0] or False,
- 'street': lead.street,
- 'street2': lead.street2,
- 'zip': lead.zip,
- 'city': lead.city,
- 'country_id': lead.country_id and lead.country_id.id or False,
- 'state_id': lead.state_id and lead.state_id.id or False,
- })
-
- else:
- if data.partner_id:
- partner_id = data.partner_id.id
- contact_id = partner_obj.address_get(cr, uid, [partner_id])['default']
-
- partner_ids.append(partner_id)
-
- vals = {}
- if partner_id:
- vals.update({'partner_id': partner_id})
- if contact_id:
- vals.update({'partner_address_id': contact_id})
- lead_obj.write(cr, uid, [lead.id], vals)
- return partner_ids
-
- def make_partner(self, cr, uid, ids, context=None):
- """
- This function Makes partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Partner form.
- """
- if not context:
- context = {}
-
- partner_ids = self._create_partner(cr, uid, ids, context)
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'])
-
- value = {
- 'domain': "[]",
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'res.partner',
- 'res_id': partner_ids and int(partner_ids[0]) or False,
- 'view_id': False,
- 'context': context,
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
- return value
-
-crm_lead2partner()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/wizard/crm_lead_to_partner_view.xml b/addons/crm_sale/wizard/crm_lead_to_partner_view.xml
deleted file mode 100644
index 53d4f1b5476..00000000000
--- a/addons/crm_sale/wizard/crm_lead_to_partner_view.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
- crm.lead2partner.view.create
- crm.lead2partner
- form
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm_sale/wizard/crm_opportunity_to_phonecall.py b/addons/crm_sale/wizard/crm_opportunity_to_phonecall.py
deleted file mode 100644
index 73046fb4007..00000000000
--- a/addons/crm_sale/wizard/crm_opportunity_to_phonecall.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import osv, fields
-from tools.translate import _
-
-class crm_opportunity2phonecall(osv.osv_memory):
- """Converts Opportunity to Phonecall"""
-
- _name = 'crm.opportunity2phonecall'
- _description = 'Opportunity to Phonecall'
-
- _columns = {
- 'name' : fields.char('Call summary', size=64, required=True, select=1),
- 'user_id' : fields.many2one('res.users', "Assign To"),
- 'date': fields.datetime('Date' , required=True),
- 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
- }
-
- def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
- @return : default values of fields.
- """
-
- opp_obj = self.pool.get('crm.opportunity')
- record_ids = context and context.get('active_ids', []) or []
- res = super(crm_opportunity2phonecall, self).default_get(cr, uid, fields, context=context)
- for opp in opp_obj.browse(cr, uid, record_ids, context=context):
- if 'name' in fields:
- res.update({'name': opp.name})
- if 'user_id' in fields:
- res.update({'user_id': opp.user_id and opp.user_id.id or False})
- if 'section_id' in fields:
- res.update({'section_id': opp.section_id and opp.section_id.id or False})
- return res
-
- def action_cancel(self, cr, uid, ids, context=None):
- """
- Closes Opportunity to Phonecall form
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Opportunity to Phonecall's IDs
- @param context: A standard dictionary for contextual values
- """
- return {'type': 'ir.actions.act_window_close'}
-
- def action_apply(self, cr, uid, ids, context=None):
- """
- This converts Opportunity to Phonecall and opens Phonecall view
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Opportunity to Phonecall IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Opportunity form
- """
- value = {}
- record_ids = context and context.get('active_ids', []) or []
-
- phonecall_obj = self.pool.get('crm.phonecall')
- opp_obj = self.pool.get('crm.opportunity')
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'])
-
- data_obj = self.pool.get('ir.model.data')
- categ_id = mod_obj._get_id(cr, uid, 'crm', 'categ_phone1')
- categ_id = data_obj.browse(cr, uid, categ_id, context=context).res_id
-
- # Select the view
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- for this in self.browse(cr, uid, ids, context=context):
- for opp in opp_obj.browse(cr, uid, record_ids, context=context):
- new_case = phonecall_obj.create(cr, uid, {
- 'name' : opp.name,
- 'case_id' : opp.id ,
- 'user_id' : this.user_id and this.user_id.id or False,
- 'categ_id' : categ_id,
- 'description' : opp.description or False,
- 'date' : this.date,
- 'section_id' : opp.section_id and opp.section_id.id or False,
- 'partner_id': opp.partner_id and opp.partner_id.id or False,
- 'partner_address_id': opp.partner_address_id and opp.partner_address_id.id or False,
- 'partner_phone' : opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False),
- 'partner_mobile' : opp.partner_address_id and opp.partner_address_id.mobile or False,
- 'priority': opp.priority,
- 'opp_id': opp.id
- }, context=context)
-
- phonecall_obj.case_open(cr, uid, [new_case])
-
- value = {
- 'name': _('Phone Call'),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'crm.phonecall',
- 'res_id' : new_case,
- 'views': [(id3, 'form'), (id2, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
- return value
-
-crm_opportunity2phonecall()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml b/addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml
deleted file mode 100644
index 827ee867169..00000000000
--- a/addons/crm_sale/wizard/crm_opportunity_to_phonecall_view.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
- crm.opportunity2phonecall.form
- crm.opportunity2phonecall
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Schedule Call
- crm.opportunity2phonecall
- form
- form
-
- new
-
-
-
-
\ No newline at end of file
From 76201eb88a69fa27c9f1d300f03984971bbf830c Mon Sep 17 00:00:00 2001
From: "nch@tinyerp.com" <>
Date: Wed, 28 Apr 2010 12:24:06 +0530
Subject: [PATCH 056/389] [IMP]:ir.actions.todo added groups to the actions
bzr revid: nch@tinyerp.com-20100428065406-97056qrpvp4tun0e
---
bin/addons/base/ir/ir.xml | 5 +++++
bin/addons/base/ir/ir_actions.py | 13 +++++++------
bin/addons/base/res/res_config.py | 12 +++++++++++-
3 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml
index 667a77e8a13..77ae7643645 100644
--- a/bin/addons/base/ir/ir.xml
+++ b/bin/addons/base/ir/ir.xml
@@ -1383,6 +1383,11 @@
+
+
+
+
+
diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py
index 33be3fe99ee..a9eab3ea3da 100644
--- a/bin/addons/base/ir/ir_actions.py
+++ b/bin/addons/base/ir/ir_actions.py
@@ -387,13 +387,13 @@ class actions_server(osv.osv):
line = rs[0], "%s - (%s)" % (rs[1], rs[0])
res.append(line)
return res
-
+
def _select_objects(self, cr, uid, context={}):
model_pool = self.pool.get('ir.model')
ids = model_pool.search(cr, uid, [('name','not ilike','.')])
res = model_pool.read(cr, uid, ids, ['model', 'name'])
return [(r['model'], r['name']) for r in res] + [('','')]
-
+
def change_object(self, cr, uid, ids, copy_object, state, context={}):
if state == 'object_copy':
model_pool = self.pool.get('ir.model')
@@ -581,10 +581,10 @@ class actions_server(osv.osv):
continue
if not user:
raise osv.except_osv(_('Error'), _("Please specify server option --smtp-from !"))
-
+
subject = self.merge_message(cr, uid, action.subject, action, context)
body = self.merge_message(cr, uid, action.message, action, context)
-
+
if tools.email_send(user, [address], subject, body, debug=False, subtype='html') == True:
logger.notifyChannel('email', netsvc.LOG_INFO, 'Email successfully send to : %s' % (address))
else:
@@ -686,7 +686,7 @@ class actions_server(osv.osv):
cr.commit()
if action.record_id:
self.pool.get(action.model_id.model).write(cr, uid, [context.get('active_id')], {action.record_id.name:res_id})
-
+
if action.state == 'object_copy':
res = {}
for exp in action.fields_lines:
@@ -701,7 +701,7 @@ class actions_server(osv.osv):
obj_pool = None
res_id = False
-
+
model = action.copy_object.split(',')[0]
cid = action.copy_object.split(',')[1]
obj_pool = self.pool.get(model)
@@ -736,6 +736,7 @@ class ir_actions_todo(osv.osv):
'state': fields.selection(TODO_STATES, string='State', required=True),
'name':fields.char('Name', size=64),
'restart': fields.selection([('onskip','On Skip'),('always','Always'),('never','Never')],'Restart',required=True),
+ 'groups_id':fields.many2many('res.groups', 'res_groups_action_rel', 'uid', 'gid', 'Groups'),
'note':fields.text('Text', translate=True),
}
_defaults={
diff --git a/bin/addons/base/res/res_config.py b/bin/addons/base/res/res_config.py
index 68a5a383cbb..9899830a4f3 100644
--- a/bin/addons/base/res/res_config.py
+++ b/bin/addons/base/res/res_config.py
@@ -58,8 +58,18 @@ class res_config_configurable(osv.osv_memory):
'getting next %s' % todos)
active_todos = todos.search(cr, uid, [('state','=','open')],
limit=1)
+ dont_skip_todo = True
if active_todos:
- return todos.browse(cr, uid, active_todos[0], context=None)
+ todo_obj = todos.browse(cr, uid, active_todos[0], context=None)
+ todo_groups = map(lambda x:x.id, todo_obj.groups_id)
+ if todo_groups:
+ cr.execute("select 1 from res_groups_users_rel where uid=%s and gid=ANY(%s)",(uid, todo_groups,))
+ dont_skip_todo = bool(cr.fetchone())
+ if dont_skip_todo:
+ return todos.browse(cr, uid, active_todos[0], context=None)
+ else:
+ todos.write(cr, uid, active_todos[0], {'state':'skip'}, context=None)
+ return self._next_action(cr, uid)
return None
def _set_previous_todo(self, cr, uid, state):
From 75fdca9e4581e2290aa84a71315522a8d21f40e3 Mon Sep 17 00:00:00 2001
From: "atp (Open ERP)"
Date: Wed, 28 Apr 2010 12:46:17 +0530
Subject: [PATCH 057/389] [REVERT]:Uncommited changes for separating lead and
opportunity as separate module from crm.
bzr revid: atp@tinyerp.co.in-20100428071617-jushfbq1q3grm5mm
---
addons/crm/crm_lead.py | 198 +++++++++++
addons/crm/crm_lead_data.xml | 81 +++++
addons/crm/crm_lead_demo.xml | 112 ++++++
addons/crm/crm_lead_menu.xml | 33 ++
addons/crm/crm_lead_view.xml | 331 ++++++++++++++++++
addons/crm/crm_meeting.py | 25 +-
addons/crm/crm_opportunity.py | 249 +++++++++++++
addons/crm/crm_opportunity_data.xml | 95 +++++
addons/crm/crm_opportunity_demo.xml | 88 +++++
addons/crm/crm_opportunity_menu.xml | 57 +++
addons/crm/crm_opportunity_view.xml | 329 +++++++++++++++++
addons/crm/report/crm_lead_report.py | 88 +++++
addons/crm/report/crm_lead_report_view.xml | 116 ++++++
addons/crm/report/crm_opportunity_report.py | 100 ++++++
.../report/crm_opportunity_report_view.xml | 122 +++++++
addons/crm/test/test_crm_lead.yml | 113 ++++++
addons/crm/test/test_crm_opportunity.yml | 81 +++++
addons/crm/wizard/crm_lead_to_opportunity.py | 327 +++++++++++++++++
.../wizard/crm_lead_to_opportunity_view.xml | 63 ++++
addons/crm/wizard/crm_lead_to_partner.py | 216 ++++++++++++
.../crm/wizard/crm_lead_to_partner_view.xml | 53 +++
.../wizard/crm_opportunity_to_phonecall.py | 139 ++++++++
.../crm_opportunity_to_phonecall_view.xml | 41 +++
23 files changed, 3044 insertions(+), 13 deletions(-)
create mode 100644 addons/crm/crm_lead.py
create mode 100644 addons/crm/crm_lead_data.xml
create mode 100644 addons/crm/crm_lead_demo.xml
create mode 100644 addons/crm/crm_lead_menu.xml
create mode 100644 addons/crm/crm_lead_view.xml
create mode 100644 addons/crm/crm_opportunity.py
create mode 100644 addons/crm/crm_opportunity_data.xml
create mode 100644 addons/crm/crm_opportunity_demo.xml
create mode 100644 addons/crm/crm_opportunity_menu.xml
create mode 100644 addons/crm/crm_opportunity_view.xml
create mode 100644 addons/crm/report/crm_lead_report.py
create mode 100644 addons/crm/report/crm_lead_report_view.xml
create mode 100644 addons/crm/report/crm_opportunity_report.py
create mode 100644 addons/crm/report/crm_opportunity_report_view.xml
create mode 100644 addons/crm/test/test_crm_lead.yml
create mode 100644 addons/crm/test/test_crm_opportunity.yml
create mode 100644 addons/crm/wizard/crm_lead_to_opportunity.py
create mode 100644 addons/crm/wizard/crm_lead_to_opportunity_view.xml
create mode 100644 addons/crm/wizard/crm_lead_to_partner.py
create mode 100644 addons/crm/wizard/crm_lead_to_partner_view.xml
create mode 100644 addons/crm/wizard/crm_opportunity_to_phonecall.py
create mode 100644 addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
new file mode 100644
index 00000000000..9c4c38875c5
--- /dev/null
+++ b/addons/crm/crm_lead.py
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import fields, osv, orm
+from datetime import datetime, timedelta
+import crm
+import math
+import time
+import mx.DateTime
+from tools.translate import _
+
+class crm_lead(osv.osv):
+ """ CRM Lead Case """
+
+ _name = "crm.lead"
+ _description = "Leads Cases"
+ _order = "priority, id desc"
+ _inherit = ['res.partner.address', 'crm.case']
+
+ def case_open(self, cr, uid, ids, *args):
+ """
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of case's Ids
+ @param *args: Give Tuple Value
+ """
+
+ res = super(crm_lead, self).case_open(cr, uid, ids, *args)
+ self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')})
+ return res
+
+ def _compute_day(self, cr, uid, ids, fields, args, context={}):
+ """
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Openday’s IDs
+ @return: difference between current date and log date
+ @param context: A standard dictionary for contextual values
+ """
+ cal_obj = self.pool.get('resource.calendar')
+ res_obj = self.pool.get('resource.resource')
+
+ res = {}
+ for lead in self.browse(cr, uid, ids , context):
+ for field in fields:
+ res[lead.id] = {}
+ duration = 0
+ ans = False
+ if field == 'day_open':
+ if lead.date_open:
+ date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S")
+ date_open = datetime.strptime(lead.date_open, "%Y-%m-%d %H:%M:%S")
+ ans = date_open - date_create
+ date_until = lead.date_open
+ elif field == 'day_close':
+ if lead.date_closed:
+ date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S")
+ date_close = datetime.strptime(lead.date_closed, "%Y-%m-%d %H:%M:%S")
+ date_until = lead.date_closed
+ ans = date_close - date_create
+ if ans:
+ resource_id = False
+ if lead.user_id:
+ resource_ids = res_obj.search(cr, uid, [('user_id','=',lead.user_id.id)])
+ if len(resource_ids):
+ resource_id = resource_ids[0]
+
+ duration = float(ans.days)
+ if lead.section_id.resource_calendar_id:
+ duration = float(ans.days) * 24
+ new_dates = cal_obj.interval_get(cr,
+ uid,
+ lead.section_id.resource_calendar_id and lead.section_id.resource_calendar_id.id or False,
+ mx.DateTime.strptime(lead.create_date, '%Y-%m-%d %H:%M:%S'),
+ duration,
+ resource=resource_id
+ )
+ no_days = []
+ date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S')
+ for in_time, out_time in new_dates:
+ if in_time.date not in no_days:
+ no_days.append(in_time.date)
+ if out_time > date_until:
+ break
+ duration = len(no_days)
+ res[lead.id][field] = abs(int(duration))
+ return res
+
+ _columns = {
+
+ 'categ_id': fields.many2one('crm.case.categ', 'Lead Source', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.opportunity')]"),
+ 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]"),
+ 'partner_name': fields.char("Contact Name", size=64),
+
+ 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
+ 'date_closed': fields.datetime('Closed', readonly=True),
+ 'stage_id': fields.many2one('crm.case.stage', 'Stage', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]"),
+ 'opportunity_id': fields.many2one('crm.opportunity', 'Opportunity'),
+
+ 'user_id': fields.many2one('res.users', 'Salesman'),
+ 'referred': fields.char('Referred By', size=64),
+ 'date_open': fields.datetime('Opened', readonly=True),
+ 'day_open': fields.function(_compute_day, string='Days to Open', \
+ method=True, multi='day_open', type="float", store=True),
+ 'day_close': fields.function(_compute_day, string='Days to Close', \
+ method=True, multi='day_close', type="float", store=True),
+ 'function_name': fields.char('Function', size=64),
+ }
+
+ _defaults = {
+ 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
+ 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ }
+
+
+ def convert_opportunity(self, cr, uid, ids, context=None):
+ """ Precomputation for converting lead to opportunity
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of closeday’s IDs
+ @param context: A standard dictionary for contextual values
+ @return: Value of action in dict
+ """
+ if not context:
+ context = {}
+ context.update({'active_ids': ids})
+
+ data_obj = self.pool.get('ir.model.data')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create')
+ value = {}
+
+ view_id = False
+ if data_id:
+ view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
+ for case in self.browse(cr, uid, ids):
+ context.update({'opportunity_id': case.id})
+ context.update({'active_id': case.id})
+ if not case.partner_id:
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_partner')
+ view_id1 = False
+ if data_id:
+ view_id1 = data_obj.browse(cr, uid, data_id, context=context).res_id
+ value = {
+ 'name': _('Create Partner'),
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'crm.lead2opportunity.partner',
+ 'view_id': False,
+ 'context': context,
+ 'views': [(view_id1, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'nodestroy': True
+ }
+ break
+ else:
+ value = {
+ 'name': _('Create Opportunity'),
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'crm.lead2opportunity',
+ 'view_id': False,
+ 'context': context,
+ 'views': [(view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'nodestroy': True
+ }
+ return value
+
+crm_lead()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
new file mode 100644
index 00000000000..17211a9ef66
--- /dev/null
+++ b/addons/crm/crm_lead_data.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+ New
+
+
+
+
+ Assigned
+
+
+
+
+ In Process
+
+
+
+
+ Converted
+
+
+
+
+ Recycled
+
+
+
+
+ Dead
+
+
+
+
+
+
+ Telesales
+
+
+
+
+ Mail
+
+
+
+
+ Email
+
+
+
+
+ Print
+
+
+
+
+ Web
+
+
+
+
+ Radio
+
+
+
+
+ Television
+
+
+
+
+ Newsletter
+
+
+
+
+
+
diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml
new file mode 100644
index 00000000000..bc6638601c2
--- /dev/null
+++ b/addons/crm/crm_lead_demo.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml
new file mode 100644
index 00000000000..4d752ca8a9b
--- /dev/null
+++ b/addons/crm/crm_lead_menu.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Leads
+ crm.lead
+ tree,form
+
+
+
+
+
+ tree
+
+
+
+
+
+ form
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
new file mode 100644
index 00000000000..03318270e9b
--- /dev/null
+++ b/addons/crm/crm_lead_view.xml
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+ Lead Stages
+ crm.case.stage
+ form
+
+ [('object_id.model', '=', 'crm.lead')]
+ {'object_id':'crm.lead'}
+
+
+
+
+
+
+ Lead Resource Type
+ crm.case.resource.type
+ form
+
+ [('object_id.model', '=', 'crm.lead')]
+ {'object_id':'crm.lead'}
+
+
+
+
+
+
+ CRM - Leads Form
+ crm.lead
+ form
+
+
+
+
+
+
+
+
+ Opportunities Tree
+ crm.opportunity
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CRM - Opportunity Graph
+ crm.opportunity
+ graph
+
+
+
+
+
+
+
+
+
+
+
+
+ CRM - Opportunities Search
+ crm.opportunity
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
new file mode 100644
index 00000000000..d400700c0b5
--- /dev/null
+++ b/addons/crm/report/crm_lead_report.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import fields,osv
+import tools
+
+AVAILABLE_STATES = [
+ ('draft','Draft'),
+ ('open','Open'),
+ ('cancel', 'Cancelled'),
+ ('done', 'Closed'),
+ ('pending','Pending')
+]
+
+class crm_lead_report(osv.osv):
+ """ CRM Lead Report """
+ _name = "crm.lead.report"
+ _auto = False
+ _inherit = "crm.case.report"
+ _description = "CRM Lead Report"
+
+ _columns = {
+ 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category',\
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]" , readonly=True),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]", readonly=True),
+ 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ }
+ def init(self, cr):
+
+ """
+ CRM Lead Report
+ @param cr: the current row, from the database cursor
+ """
+
+ tools.drop_view_if_exists(cr, 'crm_lead_report')
+ cr.execute("""
+ create or replace view crm_lead_report as (
+ select
+ min(c.id) as id,
+ to_char(c.create_date, 'YYYY') as name,
+ to_char(c.create_date, 'MM') as month,
+ to_char(c.create_date, 'YYYY-MM-DD') as day,
+ c.state as state,
+ c.user_id,
+ c.stage_id,
+ c.company_id,
+ c.section_id,
+ c.categ_id,
+ c.partner_id,
+ count(*) as nbr,
+ 0 as avg_answers,
+ 0.0 as perc_done,
+ 0.0 as perc_cancel,
+ date_trunc('day',c.create_date) as create_date,
+ avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
+ from
+ crm_lead c
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\
+ c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id
+ ,c.create_date,to_char(c.create_date, 'YYYY-MM-DD')
+ )""")
+
+crm_lead_report()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
new file mode 100644
index 00000000000..d6502c190d9
--- /dev/null
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+ crm.lead.report.tree
+ crm.lead.report
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.lead.report.form
+ crm.lead.report
+
+ form
+
+
+
+
+
+
+
+
+
+
+
+ crm.lead.report.graph
+ crm.lead.report
+ graph
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.lead.report.select
+ crm.lead.report
+
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Leads
+ crm.lead.report
+ form
+ {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
+ tree,graph
+
+
+
+
+
+
+ tree
+
+
+
+
+
+
+ graph
+
+
+
+
+
+
+
+
diff --git a/addons/crm/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py
new file mode 100644
index 00000000000..a3af4be8b7c
--- /dev/null
+++ b/addons/crm/report/crm_opportunity_report.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import fields,osv
+import tools
+
+AVAILABLE_STATES = [
+ ('draft','Draft'),
+ ('open','Open'),
+ ('cancel', 'Cancelled'),
+ ('done', 'Closed'),
+ ('pending','Pending')
+]
+
+class crm_opportunity_report(osv.osv):
+ """ CRM Opportunity Report """
+ _name = "crm.opportunity.report"
+ _auto = False
+ _inherit = "crm.case.report"
+ _description = "CRM Opportunity Report"
+ _columns = {
+ 'probability': fields.float('Avg. Probability', readonly=True,group_operator='avg'),
+ 'amount_revenue': fields.float('Est.Revenue', readonly=True),
+ 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
+ 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category',\
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.opportunity')]", readonly=True),
+ 'stage_id':fields.many2one('crm.case.stage', 'Stage',\
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.opportunity')]", readonly=True),
+ 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'user_id':fields.many2one('res.users', 'User', readonly=True),
+ }
+
+ def init(self, cr):
+ """ Display Est.Revenue , Average Probability ,Est.Revenue Probability
+ @param cr: the current row, from the database cursor
+ """
+
+ tools.drop_view_if_exists(cr, 'crm_opportunity_report')
+ cr.execute("""
+ create or replace view crm_opportunity_report as (
+ select
+ min(c.id) as id,
+ to_char(c.create_date, 'YYYY') as name,
+ to_char(c.create_date, 'MM') as month,
+ to_char(c.create_date, 'YYYY-MM-DD') as day,
+ c.state as state,
+ c.user_id,
+ c.section_id,
+ c.categ_id,
+ c.stage_id,
+ c.partner_id,
+ c.company_id,
+ count(*) as nbr,
+ 0 as avg_answers,
+ 0.0 as perc_done,
+ 0.0 as perc_cancel,
+ date_trunc('day',c.create_date) as create_date,
+ sum(planned_revenue) as amount_revenue,
+ sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob,
+ avg(probability)::decimal(16,2) as probability,
+ avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close
+ from
+ crm_opportunity c
+ group by
+ to_char(c.create_date, 'YYYY'),
+ to_char(c.create_date, 'MM'),
+ to_char(c.create_date, 'YYYY-MM-DD'),
+ c.state,
+ c.user_id,
+ c.section_id,
+ c.stage_id,
+ c.categ_id,
+ c.partner_id,
+ company_id,
+ create_date
+ )""")
+
+crm_opportunity_report()
diff --git a/addons/crm/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml
new file mode 100644
index 00000000000..29a66b838f0
--- /dev/null
+++ b/addons/crm/report/crm_opportunity_report_view.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+ crm.opportunity.report.tree
+ crm.opportunity.report
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.opportunity.report.form
+ crm.opportunity.report
+
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.opportunity.report.graph
+ crm.opportunity.report
+ graph
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.opportunity.report.select
+ crm.opportunity.report
+
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Opportunities
+ crm.opportunity.report
+ form
+ tree,graph
+ {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
+
+
+
+
+ tree
+
+
+
+
+
+ graph
+
+
+
+
+
+
+
+
diff --git a/addons/crm/test/test_crm_lead.yml b/addons/crm/test/test_crm_lead.yml
new file mode 100644
index 00000000000..22fdfffca1b
--- /dev/null
+++ b/addons/crm/test/test_crm_lead.yml
@@ -0,0 +1,113 @@
+- |
+ In order to test the CRM in OpenERP,
+ I will do a customer qualification process that
+ starts with a fist contact with a customer (a lead), which will be converted to a
+ business opportunity and a partner.
+- |
+ In order to test the flow, I create a two new users "user_crm" and
+ I assign the group "salesman".
+-
+ !record {model: res.users, id: res_users_usercrm0}:
+ company_id: base.main_company
+ context_lang: en_US
+ context_section_id: crm.section_sales_department
+ groups_id:
+ - crm.group_crm_user
+ login: user_crm
+ name: user_crm
+ password: user_crm
+
+
+- |
+ I start by creating a new lead "New Customer" and I provide an address to this
+ new customer, as well as an email "info@mycustomer.com".
+-
+ !record {model: crm.lead, id: crm_lead_newcustomer0}:
+ email_from: info@mycustomer.com
+ name: New Customer
+ partner_name: Sandip zala
+ phone: (855) 924-4364
+ mobile: (333) 715-1450
+ section_id: crm.section_sales_department
+ referred: False
+ title: M.
+- |
+ I check that the lead is in 'draft' state,
+-
+ !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in Draft}:
+ - state == "draft"
+-
+ I open lead by click on "Open" button,
+-
+ !python {model: crm.lead}: |
+ self.case_open(cr, uid, [ref("crm_lead_newcustomer0")])
+
+- |
+ As the lead seems to be a real business opportunity, I will convert it to a
+ partner
+ and a business opportunity by clicking on the "Convert" button.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref('crm_lead_newcustomer0'))
+ if not lead.partner_id:
+ self.convert_opportunity(cr, uid, [ref("crm_lead_newcustomer0")], {'active_ids': [ref("crm_lead_newcustomer0")]})
+-
+ |
+ Now, select "create a new partner" option in this wizard.
+-
+ !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_0}:
+ action: 'create'
+-
+ I click on "Continue" button of this wizard.
+-
+ !python {model: crm.lead2opportunity.partner}: |
+ self.make_partner(cr, uid, [ref("crm_lead2opportunity_partner_create_0")], {'active_ids': [ref("crm_lead_newcustomer0")]})
+-
+ Now, I give value to this wizard field.
+-
+ !record {model: crm.lead2opportunity, id: crm_lead2opportunity_stonage_0}:
+ name: Sandip zala
+ planned_revenue: 0.00
+ probability: 0.00
+-
+ Then, Click on "Create Opportunity" button of this wizard.
+-
+ !python {model: crm.lead2opportunity}: |
+ self.action_apply(cr, uid, [ref('crm_lead2opportunity_stonage_0')], {'active_id': ref('crm_lead_newcustomer0')})
+
+- |
+ I can check that a lead and a business opportunity is now assigned to this
+ lead.
+-
+ # !python {model: crm.lead, id: crm_lead_newcustomer0}:
+ # - opportunity_id.id != False
+
+- |
+ I check that the partner associated to this lead as the same country, phone number
+ and name than the opportunity.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref("crm_lead_newcustomer0"))
+ print "lead", lead.partner_name
+ obj_opportunity = self.pool.get('crm.opportunity')
+ ids = obj_opportunity.search(cr, uid, [('name', '=', lead.partner_name)])
+ opportunity = obj_opportunity.browse(cr, uid, ids)[0]
+ assert lead.partner_name == opportunity.partner_id.name
+ assert lead.phone == opportunity.phone
+-
+ |
+ # yaml is also not working smpt server and send new email.
+
+- |
+ I configure with smtp server.
+- |
+ And I communicate with lead through send New mail to Lead using it email address from user which are loged.
+- |
+ I check that communication history generated when send email to lead.
+- |
+ Then, I add a cc which receive copy of future communication between partner and users by mail.
+
+- |
+ I Reply to last Email to lead with some document attached.and check that communication history generated or not.
+
+
\ No newline at end of file
diff --git a/addons/crm/test/test_crm_opportunity.yml b/addons/crm/test/test_crm_opportunity.yml
new file mode 100644
index 00000000000..d7118dd0c90
--- /dev/null
+++ b/addons/crm/test/test_crm_opportunity.yml
@@ -0,0 +1,81 @@
+- |
+ I start by creating a new Opportunity. And I select partner for opportunity.
+ I can see that after selecting partner his contact and email is automatically filled.
+-
+ !record {model: crm.opportunity, id: crm_opportunity_abcfuelcounits0}:
+ email_from: info@balmerinc.be
+ name: 'ABC FUEL CO 829264 - 10002 units '
+ partner_address_id: base.res_partner_address_1
+ partner_id: base.res_partner_9
+ probability: 1.0
+ stage_id: crm.stage_oppor1
+ categ_id: crm.categ_oppor2
+ section_id: crm.section_sales_department
+
+- |
+ I check that the opportunity is in 'New' state.
+-
+ !assert {model: crm.opportunity, id: crm_opportunity_abcfuelcounits0}:
+ - state == "draft"
+- |
+ I open opportunity by click on "Open" button,
+-
+ !python {model: crm.opportunity}: |
+ self.case_open(cr, uid, [ref("crm_opportunity_abcfuelcounits0")])
+
+- |
+ I schedule Meeting on this current opportunity by clicking on "schedule
+ Meeting".
+-
+ !python {model: crm.opportunity}: |
+ self.action_makeMeeting(cr, uid, [ref("crm_opportunity_abcfuelcounits0")])
+
+- |
+ I can see that Meeting's calendar view is shown.
+ then I click on the date on which I want schedule meeting.
+ I fill proper data for that meeting and save it
+-
+ !record {model: crm.meeting, id: crm_meeting_abcfuelcounits0}:
+ alarm_id: base_calendar.alarm3
+ date: '2010-04-16 00:00:00'
+ date_deadline: '2010-04-16 08:00:00'
+ duration: 8.0
+ email_from: info@balmerinc.be
+ name: 'ABC FUEL CO 829264 - 10002 units '
+ opportunity_id: 'crm_opportunity_abcfuelcounits0'
+ partner_address_id: base.res_partner_address_1
+ partner_id: base.res_partner_9
+ rrule_type: weekly
+ section_id: crm.section_sales_department
+ state: open
+- |
+ In order to schedule a phonecall to the partner
+ I click on "schedule call" button and select planned date for the call.
+-
+ !record {model: crm.opportunity2phonecall, id: crm_opportunity2phonecall_abcfuelcounits0}:
+ date: '2010-04-17 11:15:00'
+ name: 'ABC FUEL CO 829264 - 10002 units '
+ section_id: crm.section_sales_department
+ user_id: base.user_demo
+- |
+ schedule phonecall by apply (action_apply)function of opportunity2phoncall wizard
+-
+ !python {model: crm.opportunity2phonecall}: |
+ self.action_apply(cr, uid, [ref('crm_opportunity2phonecall_abcfuelcounits0')], {'active_ids': [ref("crm_opportunity_abcfuelcounits0")]})
+- |
+ I check that phonecall record is created for that opportunity.
+-
+ !python {model: crm.phonecall}: |
+ ids = self.search(cr, uid, [('name', '=', 'ABC FUEL CO 829264 - 10002 units')])
+ assert len(ids)
+- |
+ I can see phonecall record after click on "Schedule call" wizard.
+-
+ !record {model: crm.phonecall, id: crm_phonecall_abcfuelcounits0}:
+ date: '2010-04-17 11:15:00'
+ duration: 3.0
+ name: 'ABC FUEL CO 829264 - 10002 units'
+ partner_address_id: base.res_partner_address_1
+ partner_id: base.res_partner_9
+ section_id: crm.section_sales_department
+
\ No newline at end of file
diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py
new file mode 100644
index 00000000000..c8cce059f09
--- /dev/null
+++ b/addons/crm/wizard/crm_lead_to_opportunity.py
@@ -0,0 +1,327 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from mx.DateTime import now
+from osv import osv, fields
+from tools.translate import _
+
+
+class crm_lead2opportunity(osv.osv_memory):
+ _name = 'crm.lead2opportunity'
+ _description = 'Lead To Opportunity'
+
+ def action_cancel(self, cr, uid, ids, context=None):
+ """
+ Closes Lead To Opportunity form
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Partner's IDs
+ @param context: A standard dictionary for contextual values
+
+ """
+ return {'type': 'ir.actions.act_window_close'}
+
+ def action_apply(self, cr, uid, ids, context=None):
+ """
+ This converts lead to opportunity and opens Opportunity view
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Opportunity IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for created Opportunity form
+ """
+ record_id = context and context.get('active_id', False) or False
+ if not record_id:
+ return {}
+
+ lead_obj = self.pool.get('crm.lead')
+ opp_obj = self. pool.get('crm.opportunity')
+ data_obj = self.pool.get('ir.model.data')
+ history_obj = self.pool.get('crm.case.history')
+ model_obj = self.pool.get('ir.model')
+
+ # Get Opportunity views
+ result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
+ res = data_obj.read(cr, uid, result, ['res_id'])
+ id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
+ id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
+ if id2:
+ id2 = data_obj.browse(cr, uid, id2, context=context).res_id
+ if id3:
+ id3 = data_obj.browse(cr, uid, id3, context=context).res_id
+
+ lead = lead_obj.browse(cr, uid, record_id, context=context)
+ model_ids = model_obj.search(cr, uid, [('model', '=', 'crm.opportunity')])
+
+
+ for this in self.browse(cr, uid, ids, context=context):
+ new_opportunity_id = opp_obj.create(cr, uid, {
+ 'name': this.name,
+ 'referred': lead.referred,
+ 'planned_revenue': this.planned_revenue,
+ 'probability': this.probability,
+ 'partner_id': lead.partner_id and lead.partner_id.id or False,
+ 'section_id': lead.section_id and lead.section_id.id or False,
+ 'description': lead.description or False,
+ 'date_deadline': lead.date_deadline or False,
+ 'partner_address_id': lead.partner_address_id and lead.partner_address_id.id or False ,
+ 'priority': lead.priority,
+ 'phone': lead.phone,
+ 'email_from': lead.email_from
+ })
+ new_opportunity = opp_obj.browse(cr, uid, new_opportunity_id)
+ vals = {
+ 'partner_id': this.partner_id and this.partner_id.id or False,
+ }
+ if not lead.opportunity_id:
+ vals.update({'opportunity_id' : new_opportunity.id})
+
+ model_opportunity_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'crm.opportunity')], context=context)[0]
+
+ for model in ('crm.case.log', 'crm.case.history'):
+ log_proxy = self.pool.get(model)
+ log_ids = log_proxy.search(cr, uid, [('model_id.model', '=', 'crm.lead'),('res_id', '=', lead.id)], context=context)
+ for log_id in log_ids:
+ log_proxy.copy(cr, uid, log_id, {'model_id':model_opportunity_id}, context=context)
+
+ lead_obj.write(cr, uid, [lead.id], vals)
+ lead_obj.case_close(cr, uid, [lead.id])
+
+ # Copy lead history to opportunity
+ for his_id in lead.history_line:
+ history_ids = history_obj.copy(cr, uid, his_id.id, \
+ {'model_id': model_ids[0], \
+ 'res_id': new_opportunity_id})
+
+ #opp_obj.case_open(cr, uid, [new_opportunity_id])
+
+ value = {
+ 'name': _('Opportunity'),
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'crm.opportunity',
+ 'res_id': int(new_opportunity_id),
+ 'view_id': False,
+ 'views': [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
+ 'type': 'ir.actions.act_window',
+ 'search_view_id': res['res_id']
+ }
+ return value
+
+ _columns = {
+ 'name' : fields.char('Opportunity Summary', size=64, required=True, select=1),
+ 'probability': fields.float('Success Probability'),
+ 'planned_revenue': fields.float('Expected Revenue'),
+ 'partner_id': fields.many2one('res.partner', 'Partner'),
+ }
+
+ def view_init(self, cr, uid, fields, context=None):
+ """
+ This function checks for precondition before wizard executes
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ """
+ lead_obj = self.pool.get('crm.lead')
+
+ for lead in lead_obj.browse(cr, uid, context.get('active_ids', [])):
+ if lead.state in ['done', 'cancel']:
+ raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
+Leads Could not convert into Opportunity"))
+ if lead.state != 'open':
+ raise osv.except_osv(_('Warning !'), _('Lead should be in \
+\'Open\' state before converting to Opportunity.'))
+ return False
+
+ def default_get(self, cr, uid, fields, context=None):
+ """
+ This function gets default values
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ @return : default values of fields.
+ """
+ lead_obj = self.pool.get('crm.lead')
+ rec_ids = context and context.get('active_ids', [])
+ partner_id = context.get('partner_id', False)
+ data = context and context.get('active_ids', []) or []
+ res = super(crm_lead2opportunity, self).default_get(cr, uid, fields, context=context)
+ for lead in lead_obj.browse(cr, uid, data, context=context):
+ if 'name' in fields:
+ res.update({'name': lead.partner_name})
+ if 'partner_id' in fields:
+ res.update({'partner_id': partner_id and partner_id[0] or False})
+ return res
+
+crm_lead2opportunity()
+
+
+class crm_lead2opportunity_partner(osv.osv_memory):
+ _name = 'crm.lead2opportunity.partner'
+ _description = 'Lead To Opportunity Partner'
+ _inherit = 'crm.lead2partner'
+
+ _columns = {
+ 'partner_id': fields.many2one('res.partner', 'Partner'),
+ 'action': fields.selection([('exist', 'Link to an existing partner'), ('create', 'Create a new partner')], 'Action'),
+ }
+
+ def default_get(self, cr, uid, fields, context=None):
+ """
+ This function gets default values
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ @return : default values of fields.
+ """
+ lead_obj = self.pool.get('crm.lead')
+ partner_obj = self.pool.get('res.partner')
+ contact_obj = self.pool.get('res.partner.address')
+ rec_ids = context and context.get('active_ids', [])
+ partner_id = False
+
+ data = context and context.get('active_ids', []) or []
+ res = super(crm_lead2opportunity_partner, self).default_get(cr, uid, fields, context=context)
+
+ for lead in lead_obj.browse(cr, uid, data, context=context):
+ partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
+ if not partner_ids and lead.email_from:
+ address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
+ if address_ids:
+ addresses = contact_obj.browse(cr, uid, address_ids)
+ partner_ids = addresses and [addresses[0].partner_id.id] or False
+ partner_id = partner_ids and partner_ids[0] or False
+
+ if 'partner_id' in fields:
+ res.update({'partner_id': partner_id})
+ if 'action' in fields:
+ res.update({'action': partner_id and 'exist' or 'create'})
+ return res
+
+ def make_partner(self, cr, uid, ids, context=None):
+ """
+ This function Makes partner based on action.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Partner's IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for created Partner form.
+ """
+ if not context:
+ context = {}
+
+ partner_ids = self._create_partner(cr, uid, ids, context)
+ mod_obj = self.pool.get('ir.model.data')
+ result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
+ res = mod_obj.read(cr, uid, result, ['res_id'])
+ value = {}
+ data_obj = self.pool.get('ir.model.data')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create')
+ view_id = False
+ if data_id:
+ view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
+
+ context.update({'partner_id': partner_ids})
+ value = {
+ 'name': _('Create Opportunity'),
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'crm.lead2opportunity',
+ 'view_id': False,
+ 'context': context,
+ 'views': [(view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ }
+ return value
+
+ def action_skip(self, cr, uid, ids, context=None):
+ """
+ This skips partner creation
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Opportunity IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for Opportunity form
+ """
+ value = {}
+ data_obj = self.pool.get('ir.model.data')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create')
+ view_id = False
+ if data_id:
+ view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
+
+ context.update({'partner_id': False})
+ value = {
+ 'name': _('Create Opportunity'),
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'crm.lead2opportunity',
+ 'view_id': False,
+ 'context': context,
+ 'views': [(view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ }
+ return value
+
+
+ def view_init(self, cr, uid, fields, context=None):
+ """
+ This function checks for precondition before wizard executes
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ """
+ lead_obj = self.pool.get('crm.lead')
+
+ for lead in lead_obj.browse(cr, uid, context.get('active_ids', [])):
+ if lead.state in ['done', 'cancel']:
+ raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
+Leads Could not convert into Opportunity"))
+ if lead.state != 'open':
+ raise osv.except_osv(_('Warning !'), _('Lead should be in \
+\'Open\' state before converting to Opportunity.'))
+ return False
+
+crm_lead2opportunity_partner()
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
new file mode 100644
index 00000000000..229b54e09fe
--- /dev/null
+++ b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ crm.lead2opportunity.create
+ crm.lead2opportunity
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create Opportunity
+ ir.actions.act_window
+ crm.lead2opportunity
+ form
+ form
+ new
+
+
+
+
+ crm.lead2opportunity.partner.form
+ crm.lead2opportunity.partner
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/wizard/crm_lead_to_partner.py b/addons/crm/wizard/crm_lead_to_partner.py
new file mode 100644
index 00000000000..267c3296844
--- /dev/null
+++ b/addons/crm/wizard/crm_lead_to_partner.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import osv, fields
+from tools.translate import _
+
+class crm_lead2partner(osv.osv_memory):
+ """ Converts lead to partner """
+
+ _name = 'crm.lead2partner'
+ _description = 'Lead to Partner'
+
+ _columns = {
+ 'action': fields.selection([('exist', 'Link to an existing partner'), \
+ ('create', 'Create a new partner')], \
+ 'Action', required=True),
+ 'partner_id': fields.many2one('res.partner', 'Partner')
+ }
+
+ def view_init(self, cr, uid, fields, context=None):
+ """
+ This function checks for precondition before wizard executes
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ """
+
+ lead_obj = self.pool.get('crm.lead')
+ rec_ids = context and context.get('active_ids', [])
+ for lead in lead_obj.browse(cr, uid, rec_ids, context=context):
+ if lead.partner_id:
+ raise osv.except_osv(_('Warning !'),
+ _('A partner is already defined on this lead.'))
+
+ def default_get(self, cr, uid, fields, context=None):
+ """
+ This function gets default values
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ @return : default values of fields.
+ """
+ lead_obj = self.pool.get('crm.lead')
+ partner_obj = self.pool.get('res.partner')
+ contact_obj = self.pool.get('res.partner.address')
+ rec_ids = context and context.get('active_ids', [])
+ partner_id = False
+
+ data = context and context.get('active_ids', []) or []
+ res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context)
+
+ for lead in lead_obj.browse(cr, uid, data, context=context):
+ partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
+ if not partner_ids and lead.email_from:
+ address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
+ if address_ids:
+ addresses = contact_obj.browse(cr, uid, address_ids)
+ partner_ids = addresses and [addresses[0].partner_id.id] or False
+ partner_id = partner_ids and partner_ids[0] or False
+
+ if 'partner_id' in fields:
+ res.update({'partner_id': partner_id})
+ if 'action' in fields:
+ res.update({'action': partner_id and 'exist' or 'create'})
+ return res
+
+ def open_create_partner(self, cr, uid, ids, context=None):
+ """
+ This function Opens form of create partner.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Partner's IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for next form.
+ """
+ if not context:
+ context = {}
+
+ view_obj = self.pool.get('ir.ui.view')
+ view_id = view_obj.search(cr, uid, [('model', '=', 'crm.lead2partner'), \
+ ('name', '=', 'crm.lead2partner.view')])
+ return {
+ 'view_mode': 'form',
+ 'view_type': 'form',
+ 'view_id': view_id or False,
+ 'res_model': 'crm.lead2partner',
+ 'context': context,
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ }
+
+
+ def _create_partner(self, cr, uid, ids, context=None):
+ """
+ This function Creates partner based on action.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Partner's IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary {}.
+ """
+ if not context:
+ context = {}
+
+ lead_obj = self.pool.get('crm.lead')
+ partner_obj = self.pool.get('res.partner')
+ contact_obj = self.pool.get('res.partner.address')
+ partner_ids = []
+ partner_id = False
+ contact_id = False
+ rec_ids = context and context.get('active_ids', [])
+
+ for data in self.browse(cr, uid, ids):
+ for lead in lead_obj.browse(cr, uid, rec_ids):
+ if data.action == 'create':
+ partner_id = partner_obj.create(cr, uid, {
+ 'name': lead.partner_name or lead.name,
+ 'user_id': lead.user_id.id,
+ 'comment': lead.description,
+ })
+ function_id = self.pool.get('res.partner.function').search(cr,uid,[('name','=',lead.function_name)])
+ contact_id = contact_obj.create(cr, uid, {
+ 'partner_id': partner_id,
+ 'name': lead.name,
+ 'phone': lead.phone,
+ 'mobile': lead.mobile,
+ 'email': lead.email_from,
+ 'fax': lead.fax,
+ 'title': lead.title,
+ 'function': function_id and function_id[0] or False,
+ 'street': lead.street,
+ 'street2': lead.street2,
+ 'zip': lead.zip,
+ 'city': lead.city,
+ 'country_id': lead.country_id and lead.country_id.id or False,
+ 'state_id': lead.state_id and lead.state_id.id or False,
+ })
+
+ else:
+ if data.partner_id:
+ partner_id = data.partner_id.id
+ contact_id = partner_obj.address_get(cr, uid, [partner_id])['default']
+
+ partner_ids.append(partner_id)
+
+ vals = {}
+ if partner_id:
+ vals.update({'partner_id': partner_id})
+ if contact_id:
+ vals.update({'partner_address_id': contact_id})
+ lead_obj.write(cr, uid, [lead.id], vals)
+ return partner_ids
+
+ def make_partner(self, cr, uid, ids, context=None):
+ """
+ This function Makes partner based on action.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Lead to Partner's IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for created Partner form.
+ """
+ if not context:
+ context = {}
+
+ partner_ids = self._create_partner(cr, uid, ids, context)
+ mod_obj = self.pool.get('ir.model.data')
+ result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
+ res = mod_obj.read(cr, uid, result, ['res_id'])
+
+ value = {
+ 'domain': "[]",
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'res.partner',
+ 'res_id': partner_ids and int(partner_ids[0]) or False,
+ 'view_id': False,
+ 'context': context,
+ 'type': 'ir.actions.act_window',
+ 'search_view_id': res['res_id']
+ }
+ return value
+
+crm_lead2partner()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_lead_to_partner_view.xml b/addons/crm/wizard/crm_lead_to_partner_view.xml
new file mode 100644
index 00000000000..53d4f1b5476
--- /dev/null
+++ b/addons/crm/wizard/crm_lead_to_partner_view.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ crm.lead2partner.view.create
+ crm.lead2partner
+ form
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall.py b/addons/crm/wizard/crm_opportunity_to_phonecall.py
new file mode 100644
index 00000000000..148ec3aec6e
--- /dev/null
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from osv import osv, fields
+from tools.translate import _
+
+class crm_opportunity2phonecall(osv.osv_memory):
+ """Converts Opportunity to Phonecall"""
+
+ _name = 'crm.opportunity2phonecall'
+ _description = 'Opportunity to Phonecall'
+
+ _columns = {
+ 'name' : fields.char('Call summary', size=64, required=True, select=1),
+ 'user_id' : fields.many2one('res.users', "Assign To"),
+ 'date': fields.datetime('Date' , required=True),
+ 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
+ }
+
+ def default_get(self, cr, uid, fields, context=None):
+ """
+ This function gets default values
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+
+ @return : default values of fields.
+ """
+
+ opp_obj = self.pool.get('crm.opportunity')
+ record_ids = context and context.get('active_ids', []) or []
+ res = super(crm_opportunity2phonecall, self).default_get(cr, uid, fields, context=context)
+ for opp in opp_obj.browse(cr, uid, record_ids, context=context):
+ if 'name' in fields:
+ res.update({'name': opp.name})
+ if 'user_id' in fields:
+ res.update({'user_id': opp.user_id and opp.user_id.id or False})
+ if 'section_id' in fields:
+ res.update({'section_id': opp.section_id and opp.section_id.id or False})
+ return res
+
+ def action_cancel(self, cr, uid, ids, context=None):
+ """
+ Closes Opportunity to Phonecall form
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Opportunity to Phonecall's IDs
+ @param context: A standard dictionary for contextual values
+ """
+ return {'type': 'ir.actions.act_window_close'}
+
+ def action_apply(self, cr, uid, ids, context=None):
+ """
+ This converts Opportunity to Phonecall and opens Phonecall view
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param ids: List of Opportunity to Phonecall IDs
+ @param context: A standard dictionary for contextual values
+
+ @return : Dictionary value for created Opportunity form
+ """
+ value = {}
+ record_ids = context and context.get('active_ids', []) or []
+
+ phonecall_obj = self.pool.get('crm.phonecall')
+ opp_obj = self.pool.get('crm.opportunity')
+ mod_obj = self.pool.get('ir.model.data')
+ result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
+ res = mod_obj.read(cr, uid, result, ['res_id'])
+
+ data_obj = self.pool.get('ir.model.data')
+ categ_id = mod_obj._get_id(cr, uid, 'crm', 'categ_phone1')
+ categ_id = data_obj.browse(cr, uid, categ_id, context=context).res_id
+
+ # Select the view
+ id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
+ id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
+ if id2:
+ id2 = data_obj.browse(cr, uid, id2, context=context).res_id
+ if id3:
+ id3 = data_obj.browse(cr, uid, id3, context=context).res_id
+
+ for this in self.browse(cr, uid, ids, context=context):
+ for opp in opp_obj.browse(cr, uid, record_ids, context=context):
+ new_case = phonecall_obj.create(cr, uid, {
+ 'name' : opp.name,
+ 'case_id' : opp.id ,
+ 'user_id' : this.user_id and this.user_id.id or False,
+ 'categ_id' : categ_id,
+ 'description' : opp.description or False,
+ 'date' : this.date,
+ 'section_id' : opp.section_id and opp.section_id.id or False,
+ 'partner_id': opp.partner_id and opp.partner_id.id or False,
+ 'partner_address_id': opp.partner_address_id and opp.partner_address_id.id or False,
+ 'partner_phone' : opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False),
+ 'partner_mobile' : opp.partner_address_id and opp.partner_address_id.mobile or False,
+ 'priority': opp.priority,
+ 'opp_id': opp.id
+ }, context=context)
+
+ phonecall_obj.case_open(cr, uid, [new_case])
+
+ value = {
+ 'name': _('Phone Call'),
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'crm.phonecall',
+ 'res_id' : new_case,
+ 'views': [(id3, 'form'), (id2, 'tree'), (False, 'calendar'), (False, 'graph')],
+ 'type': 'ir.actions.act_window',
+ 'search_view_id': res['res_id']
+ }
+ return value
+
+crm_opportunity2phonecall()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
new file mode 100644
index 00000000000..827ee867169
--- /dev/null
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+ crm.opportunity2phonecall.form
+ crm.opportunity2phonecall
+ form
+
+