1
# -*- coding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7
# This program is free software: you can redistribute it and/or modify
8
# it under the terms of the GNU Affero General Public License as
9
# published by the Free Software Foundation, either version 3 of the
10
# License, or (at your option) any later version.
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU Affero General Public License for more details.
17
# You should have received a copy of the GNU Affero General Public License
18
# along with this program. If not, see <http://www.gnu.org/licenses/>.
20
##############################################################################
23
from report.interface import report_rml
24
#from report.interface import toxml
25
from tools import to_xml
26
from report import report_sxw
27
from datetime import datetime
28
from tools.translate import _
31
#FIXME: we should use toxml
32
class report_custom(report_rml):
33
def create_xml(self, cr, uid, ids, datas, context=None):
34
number = (datas.get('form', False) and datas['form']['number']) or 1
35
pool = pooler.get_pool(cr.dbname)
36
product_pool = pool.get('product.product')
37
product_uom_pool = pool.get('product.uom')
38
supplier_info_pool = pool.get('product.supplierinfo')
39
workcenter_pool = pool.get('mrp.workcenter')
40
user_pool = pool.get('res.users')
41
bom_pool = pool.get('mrp.bom')
42
rml_obj=report_sxw.rml_parse(cr, uid, product_pool._name,context)
43
rml_obj.localcontext.update({'lang':context.get('lang',False)})
44
company_currency = user_pool.browse(cr, uid, uid).company_id.currency_id
45
def process_bom(bom, currency_id, factor=1):
49
prod = product_pool.browse(cr, uid, bom['product_id'])
51
prod_name = bom['name']
52
prod_qtty = factor * bom['product_qty']
53
product_uom = product_uom_pool.browse(cr, uid, bom['product_uom'], context=context)
54
main_sp_price, main_sp_name , main_strd_price = '','',''
55
sellers, sellers_price = '',''
58
main_sp_name = "<b>%s</b>\r\n" %(prod.seller_id.name)
59
price = supplier_info_pool.price_get(cr, uid, prod.seller_id.id, prod.id, number*prod_qtty)[prod.seller_id.id]
60
price = product_uom_pool._compute_price(cr, uid, prod.uom_id.id, price, to_uom_id=product_uom.id)
61
main_sp_price = """<b>"""+rml_obj.formatLang(price)+' '+ company_currency.symbol+"""</b>\r\n"""
62
sum += prod_qtty*price
63
std_price = product_uom_pool._compute_price(cr, uid, prod.uom_id.id, prod.standard_price, to_uom_id=product_uom.id)
64
main_strd_price = str(std_price) + '\r\n'
65
sum_strd = prod_qtty*std_price
66
for seller_id in prod.seller_ids:
67
sellers += '- <i>'+ seller_id.name.name +'</i>\r\n'
68
price = supplier_info_pool.price_get(cr, uid, seller_id.name.id, prod.id, number*prod_qtty)[seller_id.name.id]
69
price = product_uom_pool._compute_price(cr, uid, prod.uom_id.id, price, to_uom_id=product_uom.id)
70
sellers_price += """<i>"""+rml_obj.formatLang(price) +' '+ company_currency.symbol +"""</i>\r\n"""
71
xml += """<col para='yes'> """+ prod_name +""" </col>
72
<col para='yes'> """+ main_sp_name + sellers + """ </col>
73
<col f='yes'>"""+ rml_obj.formatLang(prod_qtty) +' '+ product_uom.name +"""</col>
74
<col f='yes'>"""+ rml_obj.formatLang(float(main_strd_price)) +' '+ company_currency.symbol +"""</col>
75
<col f='yes'>""" + main_sp_price + sellers_price + """</col>'"""
78
return xml, sum, sum_strd
80
def process_workcenter(wrk):
81
workcenter = workcenter_pool.browse(cr, uid, wrk['workcenter_id'])
82
cost_cycle = wrk['cycle']*workcenter.costs_cycle
83
cost_hour = wrk['hour']*workcenter.costs_hour
84
total = cost_cycle + cost_hour
86
xml += "<col para='yes'>" + workcenter.name + '</col>'
88
xml += """<col f='yes'>"""+rml_obj.formatLang(cost_cycle)+' '+ company_currency.symbol + """</col>"""
89
xml += """<col f='yes'>"""+rml_obj.formatLang(cost_hour)+' '+ company_currency.symbol + """</col>"""
90
xml += """<col f='yes'>"""+rml_obj.formatLang(cost_hour + cost_cycle)+' '+ company_currency.symbol + """</col>"""
99
<date>""" + to_xml(rml_obj.formatLang(datetime.now().strftime('%Y-%m-%d %H:%M:%S'),date_time=True)) + """</date>
100
<company>%s</company>
101
<PageSize>210.00mm,297.00mm</PageSize>
102
<PageWidth>595.27</PageWidth>
103
<PageHeight>841.88</PageHeight>
104
<tableSize>55.00mm,58.00mm,29.00mm,29.00mm,29.00mm</tableSize>
105
""" % (user_pool.browse(cr, uid, uid).company_id.name)
107
<report-footer>Generated by OpenERP</report-footer>
111
workcenter_header = """
112
<lines style='header'>
116
<col t='yes'>%s</col>
117
<col t='yes'>%s</col>
118
<col t='yes'>%s</col>
121
""" % (_('Work Center name'), _('Cycles Cost'), _('Hourly Cost'),_('Work Cost'))
126
<col t='yes'>%s</col>
127
<col t='yes'>%s</col>
128
<col t='yes'>%s</col>
130
""" % (_('Components'), _('Components suppliers'), _('Quantity'),_('Cost Price per Uom'), _('Supplier Price per Uom'))
132
purchase_price_digits = rml_obj.get_digits(dp='Purchase Price')
134
for product in product_pool.browse(cr, uid, ids, context=context):
135
bom_id = bom_pool._bom_find(cr, uid, product.id, product.uom_id.id)
136
title = "<title>%s</title>" %(_("Cost Structure"))
137
title += "<title>%s</title>" %product.name
138
xml += "<lines style='header'>" + title + prod_header + "</lines>"
140
total_strd = number * product.standard_price
141
total = number * product_pool.price_get(cr, uid, [product.id], 'standard_price')[product.id]
142
xml += """<lines style='lines'><row>
143
<col para='yes'>-</col>
144
<col para='yes'>-</col>
145
<col para='yes'>-</col>
146
<col para='yes'>-</col>
147
<col para='yes'>-</col>
149
xml += """<lines style='total'> <row>
150
<col> """ + _('Total Cost of ') + str(number) +' '+ product.uom_id.name + """: </col>
153
<col t='yes'>"""+ rml_obj.formatLang(total_strd, digits=purchase_price_digits) +' '+ company_currency.symbol + """</col>
154
<col t='yes'>"""+ rml_obj.formatLang(total, digits=purchase_price_digits) +' '+ company_currency.symbol + """</col>
157
bom = bom_pool.browse(cr, uid, bom_id, context=context)
158
factor = number * product.uom_id.factor / bom.product_uom.factor
159
sub_boms = bom_pool._bom_explode(cr, uid, bom, factor / bom.product_qty)
163
'product_qty': bom.product_qty,
164
'name': bom.product_id.name,
165
'product_uom': bom.product_uom.id,
166
'product_id': bom.product_id.id
169
for sub_bom in (sub_boms and sub_boms[0]) or [parent_bom]:
170
txt, sum, sum_strd = process_bom(sub_bom, company_currency.id)
173
total_strd += sum_strd
175
xml += "<lines style='lines'>" + xml_tmp + '</lines>'
176
xml += """<lines style='sub_total'> <row>
177
<col> """ + _('Components Cost of ') + str(number) +' '+ product.uom_id.name + """: </col>
180
<col t='yes'>"""+ rml_obj.formatLang(total_strd, digits=purchase_price_digits) +' '+ company_currency.symbol + """</col>
186
for wrk in (sub_boms and sub_boms[1]):
187
txt, sum = process_workcenter(wrk)
191
xml += workcenter_header
192
xml += "<lines style='lines'>" + xml_tmp + '</lines>'
193
xml += """<lines style='sub_total'> <row>
194
<col> """ + _('Work Cost of ') + str(number) +' '+ product.uom_id.name +""": </col>
198
<col t='yes'>"""+ rml_obj.formatLang(total2, digits=purchase_price_digits) +' '+ company_currency.symbol +"""</col>
200
xml += """<lines style='total'> <row>
201
<col> """ + _('Total Cost of ') + str(number) +' '+ product.uom_id.name + """: </col>
204
<col t='yes'>"""+ rml_obj.formatLang(total_strd+total2, digits=purchase_price_digits) +' '+ company_currency.symbol + """</col>
208
xml = '<?xml version="1.0" ?><report>' + config_start + config_stop + xml + '</report>'
212
report_custom('report.product.price', 'product.product', '', 'addons/mrp/report/price.xsl')