Merge lp:~openbig/bigconsulting/new_changes_in_stock_minimum_calculator into lp:bigconsulting

Proposed by gpa(OpenERP)
Status: Merged
Merged at revision: 27
Proposed branch: lp:~openbig/bigconsulting/new_changes_in_stock_minimum_calculator
Merge into: lp:bigconsulting
Diff against target: 359 lines (+105/-115)
6 files modified
stock_minimum_calculator/__init__.py (+0/-1)
stock_minimum_calculator/__terp__.py (+1/-1)
stock_minimum_calculator/stock_minimum_calculator.py (+0/-14)
stock_minimum_calculator/stock_minimum_calculator_view.xml (+0/-41)
stock_minimum_calculator/supplier_cost_optimated_leadtimes.py (+9/-6)
stock_minimum_calculator/wizard/stock_order_point_calculator.py (+95/-52)
To merge this branch: bzr merge lp:~openbig/bigconsulting/new_changes_in_stock_minimum_calculator
Reviewer Review Type Date Requested Status
openbig Pending
Review via email: mp+28140@code.launchpad.net

Description of the change

changes in the stock_minimum_calculator module as client specification.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'stock_minimum_calculator/__init__.py'
--- stock_minimum_calculator/__init__.py 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/__init__.py 2010-06-22 08:06:27 +0000
@@ -21,7 +21,6 @@
21##############################################################################21##############################################################################
2222
23import stock_minimum_calculator23import stock_minimum_calculator
24import stock_order_point_calculator
25import supplier_cost_optimated_leadtimes24import supplier_cost_optimated_leadtimes
26import wizard25import wizard
2726
2827
=== modified file 'stock_minimum_calculator/__terp__.py'
--- stock_minimum_calculator/__terp__.py 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/__terp__.py 2010-06-22 08:06:27 +0000
@@ -29,7 +29,7 @@
29 minimum stock rules based on real and virtual stock comparison so 29 minimum stock rules based on real and virtual stock comparison so
30 we have proper re-order quentity for each products.30 we have proper re-order quentity for each products.
31 """,31 """,
32 "depends": ['stock','mrp'],32 "depends": ['stock','mrp',"sale"],
33 "demo_xml": ["stock_minimum_calculator_demo.xml"],33 "demo_xml": ["stock_minimum_calculator_demo.xml"],
34 "update_xml": ['stock_minimum_calculator_view.xml',34 "update_xml": ['stock_minimum_calculator_view.xml',
35 "stock_minimujm_calculator_wizard.xml",35 "stock_minimujm_calculator_wizard.xml",
3636
=== modified file 'stock_minimum_calculator/stock_minimum_calculator.py'
--- stock_minimum_calculator/stock_minimum_calculator.py 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/stock_minimum_calculator.py 2010-06-22 08:06:27 +0000
@@ -65,18 +65,4 @@
65 }65 }
66product_product()66product_product()
6767
68
69class stock_warehosue_orderpoint_period(osv.osv):
70 ### Add for percenatage of the period
71 _name = "stock.warehosue.orderpoint.period"
72 _columns = {
73 'name':fields.char("Name",size=64,required=True),
74 'product_id':fields.many2one('product.product', 'Product',required=True),
75 'partner_id':fields.many2one('res.partner','Partner',required=True),
76 'period_id' :fields.many2one('account.period',"Period",required=True),
77 'percentage':fields.float("Percenatage",required=True),
78 }
79
80stock_warehosue_orderpoint_period()
81
82# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:68# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
83\ No newline at end of file69\ No newline at end of file
8470
=== modified file 'stock_minimum_calculator/stock_minimum_calculator_view.xml'
--- stock_minimum_calculator/stock_minimum_calculator_view.xml 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/stock_minimum_calculator_view.xml 2010-06-22 08:06:27 +0000
@@ -102,46 +102,5 @@
102 </field>102 </field>
103 </record> 103 </record>
104 104
105<!-- Add for percenatage of the period -->
106 <record id="stock_warehosue_orderpoint_period_tree_view" model="ir.ui.view">
107 <field name="name">stock.warehosue.orderpoint.period.tree</field>
108 <field name="model">stock.warehosue.orderpoint.period</field>
109 <field name="type">tree</field>
110 <field name="arch" type="xml">
111 <tree string="Period Percenatage">
112 <field name="name"/>
113 <field name="product_id"/>
114 <field name="partner_id"/>
115 <field name="period_id"/>
116 <field name="percentage"/>
117 </tree>
118 </field>
119 </record>
120
121 <record id="stock_warehosue_orderpoint_period_form_view" model="ir.ui.view">
122 <field name="name">stock.warehosue.orderpoint.period.form</field>
123 <field name="model">stock.warehosue.orderpoint.period</field>
124 <field name="type">form</field>
125 <field name="arch" type="xml">
126 <form string="Period Percenatage">
127 <field name="name"/>
128 <field name="product_id"/>
129 <field name="partner_id"/>
130 <field name="period_id"/>
131 <field name="percentage"/>
132 </form>
133 </field>
134 </record>
135 <record id="stock_warehosue_orderpoint_period_normal_action" model="ir.actions.act_window">
136 <field name="name">Period Percenatage</field>
137 <field name="type">ir.actions.act_window</field>
138 <field name="res_model">stock.warehosue.orderpoint.period</field>
139 <field name="view_type">form</field>
140 <field name="view_id" ref="stock_warehosue_orderpoint_period_tree_view"/>
141 </record>
142
143 <menuitem action="stock_warehosue_orderpoint_period_normal_action" id="menu_period_supplier" parent="stock.menu_stock_configuration"/>
144
145
146 </data>105 </data>
147</openerp>106</openerp>
148\ No newline at end of file107\ No newline at end of file
149108
=== modified file 'stock_minimum_calculator/supplier_cost_optimated_leadtimes.py'
--- stock_minimum_calculator/supplier_cost_optimated_leadtimes.py 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/supplier_cost_optimated_leadtimes.py 2010-06-22 08:06:27 +0000
@@ -40,9 +40,8 @@
40 }40 }
41 41
42 def _compute(self, cr, uid, ids, context=None):42 def _compute(self, cr, uid, ids, context=None):
43 43
44 form = self.read(cr, uid, ids, [], context=context)[0]44 form = self.read(cr, uid, ids, [], context=context)[0]
45
46 analytic_account_obj = self.pool.get('account.analytic.account')45 analytic_account_obj = self.pool.get('account.analytic.account')
47 analytic_line_obj = self.pool.get('account.analytic.line')46 analytic_line_obj = self.pool.get('account.analytic.line')
48 stock_hold_rate_obj = self.pool.get("stock.holding.rate")47 stock_hold_rate_obj = self.pool.get("stock.holding.rate")
@@ -76,11 +75,15 @@
76 stock_hold_id = stock_hold_rate_obj.browse(cr, uid, form['stock_holding_rate_id'])75 stock_hold_id = stock_hold_rate_obj.browse(cr, uid, form['stock_holding_rate_id'])
77 stock_hold_rate = stock_hold_id.stock_hold_rate76 stock_hold_rate = stock_hold_id.stock_hold_rate
78 77
78 economic_numer_orders = 0.0
79 economic_lead_time = 0.0
80
79 if pur_balance and cost_balance:81 if pur_balance and cost_balance:
80 for id in ids:82 economic_numer_orders = (pur_balance * stock_hold_rate)/ (2 * cost_balance)
81 economic_numer_orders = (pur_balance * stock_hold_rate)/ (2 * cost_balance)83 economic_lead_time = 360 / economic_numer_orders
82 economic_lead_time = 360 / economic_numer_orders84
83 self.write(cr, uid, [id],{'cost_per_del':cost_balance,'purchase_rev':pur_balance, 'economic_no_order':economic_numer_orders,'economic_lead_time':economic_lead_time})85 for id in ids:
86 self.write(cr, uid, [id],{'cost_per_del':cost_balance,'purchase_rev':pur_balance, 'economic_no_order':economic_numer_orders,'economic_lead_time':economic_lead_time})
84 87
85 return True 88 return True
86 89
8790
=== modified file 'stock_minimum_calculator/wizard/stock_order_point_calculator.py'
--- stock_minimum_calculator/wizard/stock_order_point_calculator.py 2010-06-15 06:50:37 +0000
+++ stock_minimum_calculator/wizard/stock_order_point_calculator.py 2010-06-22 08:06:27 +0000
@@ -24,7 +24,9 @@
24import time24import time
25from tools.translate import _25from tools.translate import _
26import mx.DateTime26import mx.DateTime
27from mx.DateTime import RelativeDateTime, now, DateTime, localtime27from mx.DateTime import RelativeDateTime, now, DateTime
28from tools import config
29import math
2830
29orderpoint_calculator_form = """<?xml version="1.0"?>31orderpoint_calculator_form = """<?xml version="1.0"?>
30<form string="Order Point Calculator ">32<form string="Order Point Calculator ">
@@ -89,17 +91,26 @@
89 },91 },
90 }92 }
9193
94_messages_form = '''<?xml version="1.0"?>
95<form string="Warning">
96 <label string="Information Regarding Method of Calculation" colspan="4"/>
97 <field name="message" colspan="4" nolabel="1"/>
98</form>'''
99_message_fields = {
100 'message': {'string':'Message' ,'type':'text', 'readonly':True}
101 }
102
92def _get_default(obj, cr, uid, data, context=None):103def _get_default(obj, cr, uid, data, context=None):
93 pool = pooler.get_pool(cr.dbname)104 pool = pooler.get_pool(cr.dbname)
94105
95 warehouse_id = pool.get('stock.warehouse').search(cr, uid, [])[0]106 warehouse_id = pool.get('stock.warehouse').search(cr, uid, [])[0]
96 location_id = pool.get('stock.location').search(cr, uid, [('name','=','Stock')])[0]107 location_id = pool.get('stock.location').search(cr, uid, [('name','=','Stock')])[0]
97108
98 date = now().strftime('%Y-%m-%d')109 from_date = now().strftime('%Y-%m-%d')
99 date = mx.DateTime.strptime(date, '%Y-%m-%d') - RelativeDateTime(months=3)110 from_date = mx.DateTime.strptime(from_date, '%Y-%m-%d') - RelativeDateTime(months=3)
100 date = date.strftime('%Y-%m-%d')111 from_date = from_date.strftime('%Y-%m-%d')
101112
102 return {'warehouse_id': warehouse_id, 'location_id':location_id,'date_start':date}113 return {'warehouse_id': warehouse_id, 'location_id':location_id,'date_start':from_date}
103114
104def _do_calculate(self, cr, uid, data, context):115def _do_calculate(self, cr, uid, data, context):
105116
@@ -112,11 +123,6 @@
112 supp_cost_opt_obj = pool.get('supplier.cost.opti.lead.time')123 supp_cost_opt_obj = pool.get('supplier.cost.opti.lead.time')
113 min_rule_obj = pool.get('stock.warehouse.orderpoint')124 min_rule_obj = pool.get('stock.warehouse.orderpoint')
114125
115 stock_rule_ids = min_rule_obj.search(cr,uid,[('warehouse_id','=',data['form']['warehouse_id'])])
116 if data['form']['delactive']:
117 for stock_rule_id in min_rule_obj.browse(cr, uid, stock_rule_ids, context=context):
118 min_rule_obj.unlink(cr, uid, [stock_rule_id.id],context=context)
119
120 ##### Calculation of purchase lead time 126 ##### Calculation of purchase lead time
121 purchase_lead_time = 0.0127 purchase_lead_time = 0.0
122 company = pool.get('res.users').browse(cr, uid, uid, context).company_id128 company = pool.get('res.users').browse(cr, uid, uid, context).company_id
@@ -129,21 +135,24 @@
129 supplier_lead_time = 0.0135 supplier_lead_time = 0.0
130 if product_id:136 if product_id:
131 for supp in product_id.seller_ids:137 for supp in product_id.seller_ids:
132 sup = supp_obj.browse(cr, uid, supp.id, context)138 sup = supp_obj.browse(cr, uid, supp.id, context)
133 supplier_lead_time = sup.delay139 supplier_lead_time = sup.delay
134 140
135 ###### Calculation of average_daily_consumption141 ###### Calculation of average_daily_consumption
136 date_start = data['form']['date_start']142 date_start = data['form']['date_start']
137 date_stop = data['form']['date_stop']143 date_stop = data['form']['date_stop']
138 average_daily_consumption = 0.0144 average_daily_consumption = 0.0
145 sale_line_obj = pool.get("sale.order.line")
139 consum_qty = 0.0 146 consum_qty = 0.0
140 sale_ids = sale_obj.search(cr,uid,[('date_order','>=',date_start),('date_order','<=',date_stop)])147 sale_ids = sale_obj.search(cr,uid,[('date_order','>=',date_start),('date_order','<=',date_stop)])
141 if sale_ids:148 if sale_ids:
142 for sid in sale_ids:149 for sid in sale_ids:
143 sale_data = sale_obj.browse(cr,uid,sid)150 sale_line_id = sale_line_obj.search(cr,uid,[('order_id','=',sid),('product_id','=',product_id.id)])
144 for line in sale_data.order_line:151 for line_id in sale_line_id:
145 consum_qty += line.product_uom_qty152 sale_line_data= sale_line_obj.browse(cr,uid,line_id)
146 153 consum_qty += sale_line_data.product_uom_qty
154 ###here cosume quantity is total of selected produdct
155
147 ##################calculation of date difference between first and last sale order156 ##################calculation of date difference between first and last sale order
148 sale_ids = sale_obj.search(cr,uid,[])157 sale_ids = sale_obj.search(cr,uid,[])
149 if sale_ids:158 if sale_ids:
@@ -161,18 +170,17 @@
161 plan_average_daily_consumption = 0.0170 plan_average_daily_consumption = 0.0
162 if product_id.plan_avg_consume:171 if product_id.plan_avg_consume:
163 plan_average_daily_consumption = product_id.plan_avg_consume172 plan_average_daily_consumption = product_id.plan_avg_consume
164
165 ########## calculation historical consumption of products and open sales orders“173 ########## calculation historical consumption of products and open sales orders“
166 ### total sale qty with open state174 ### total sale qty with open state
167 175
168 sale_qty = 0.0 176 sale_qty = 0.0
169 sale_ids = sale_obj.search(cr, uid, [('state','in',['manual','progress'])])177 open_sale_ids = sale_obj.search(cr, uid, [('state','in',['manual','progress'])])
170 if sale_ids:178 if sale_ids:
171 for sale_id in sale_ids:179 for sale_id in open_sale_ids:
172 sale_data = sale_obj.browse(cr,uid,sale_id)180 sale_open_line_ids= sale_line_obj.search(cr,uid,[('order_id','=',sale_id),('product_id','=',product_id.id)])
173 for line in sale_data.order_line:181 for open_line_id in sale_open_line_ids:
174 sale_qty += line.product_uom_qty 182 sale_line_data= sale_line_obj.browse(cr,uid,open_line_id)
175 183 sale_qty += sale_line_data.product_uom_qty
176 ###################184 ###################
177 purchase_ids = purchase_obj.search(cr,uid,[])185 purchase_ids = purchase_obj.search(cr,uid,[])
178 if purchase_ids:186 if purchase_ids:
@@ -189,34 +197,60 @@
189 product_max_qty = 0.0 197 product_max_qty = 0.0
190 product_min_qty = 0.0198 product_min_qty = 0.0
191 199
200
192 if data['form']['method_qty_calculation'] == 'his_cons_with_product':201 if data['form']['method_qty_calculation'] == 'his_cons_with_product':
193 product_min_qty = average_daily_consumption * (supplier_lead_time + purchase_lead_time)202 product_min_qty = int(math.ceil(average_daily_consumption * (supplier_lead_time + purchase_lead_time)))
194 product_max_qty = 2 * product_min_qty203 product_max_qty = 2 * product_min_qty
195 204
196 elif data['form']['method_qty_calculation'] == 'his_cons_without_product':205 elif data['form']['method_qty_calculation'] == 'his_cons_without_product':
197 product_min_qty = plan_average_daily_consumption * (supplier_lead_time + purchase_lead_time)206 product_min_qty = int(math.ceil(plan_average_daily_consumption * (supplier_lead_time + purchase_lead_time)))
198 product_max_qty = 2 * product_min_qty 207 product_max_qty = 2 * product_min_qty
199 208
200 else:209 else:
201 product_min_qty = (average_daily_consumption + sale_qty) / pur_diff_day * (supplier_lead_time + purchase_lead_time)210 try:
202 product_max_qty = 2 * product_min_qty211 product_min_qty = int(math.ceil((consum_qty + sale_qty) / pur_diff_day * (supplier_lead_time + purchase_lead_time)))
203 212 except Exception,e:
204 max1 = 'max'213 product_min_qty = 0.0
205 name = pool.get('ir.sequence').get(cr, uid, 'stock.orderpoint.calculator')214 product_max_qty = 2 * product_min_qty
206 pool.get('stock.warehouse.orderpoint').create(cr, uid, {215
207 'name': name,216 if data['form']['delactive']:
208 'active': True,217 stock_rule_ids = min_rule_obj.search(cr,uid,[('warehouse_id','=',data['form']['warehouse_id']),('product_id','=',product_id.id)])
209 'warehouse_id': data['form']['warehouse_id'],218 for stock_rule_id in stock_rule_ids:
210 'location_id': product_id.property_stock_inventory.id,219 min_rule_obj.unlink(cr, uid, [stock_rule_id],context=context)
211 'product_id': id,220
212 'product_min_qty': product_min_qty,221 mini_stock_rule_id = min_rule_obj.search(cr,uid,[('warehouse_id','=',data['form']['warehouse_id']),('product_id','=',product_id.id)])
213 'product_max_qty': product_max_qty,222 if mini_stock_rule_id:
214 'qty_multiple':1,223 for stock_rule_id in mini_stock_rule_id:
215 'product_uom':product_id.uom_id.id,224 min_rule_obj.write(cr, uid, [stock_rule_id],{'product_min_qty':product_min_qty,'product_max_qty':product_max_qty,},context=context)
216 'logic':'max'225 else:
217 } )226 name = pool.get('ir.sequence').get(cr, uid, 'stock.orderpoint.calculator')
227 pool.get('stock.warehouse.orderpoint').create(cr, uid, {
228 'name': name,
229 'active': True,
230 'warehouse_id': data['form']['warehouse_id'],
231 'location_id': product_id.property_stock_inventory.id,
232 'product_id': id,
233 'product_min_qty': product_min_qty,
234 'product_max_qty': product_max_qty,
235 'qty_multiple':1,
236 'product_uom':product_id.uom_id.id,
237 'logic':'max'
238 } )
218 239
240
219 return {}241 return {}
242
243def _get_message(self, cr, uid, data, context):
244
245 if data['form']['method_qty_calculation'] == 'his_cons_with_product':
246 data['form']['message'] = _("Are your sure that you have enough historical data to calculate stock orderpoint rules with this methodology, Otherwise you should try the other options, \n Calculate without historical consumption of products or ,Calculate with historical consumption of products and sales orders")
247 elif data['form']['method_qty_calculation'] == 'his_cons_without_product':
248 data['form']['message'] = _("Your calculation is based on the field plan average daily consumption.\n Are your sure not to calculate with the method , Calculate with historical consumption of products")
249 else:
250 data['form']['message'] = _("Are your sure that you have really not enough historical data to calculate stock orderpoint rules? \n Otherwise you should prefer the options , Calculate with historical consumption of products. This results may calculate better results than calculation with this methodology.")
251 return data['form']
252
253
220 254
221class orderpoint_calculator(wizard.interface):255class orderpoint_calculator(wizard.interface):
222 states = {256 states = {
@@ -228,11 +262,20 @@
228 'state' : [('end', 'Cancel'),('calculation', 'Calculation') ]}262 'state' : [('end', 'Cancel'),('calculation', 'Calculation') ]}
229 },263 },
230 'calculation' : {264 'calculation' : {
231 'actions' : [],265 'actions' : [ _do_calculate ],
232 'result' : {'type' : 'action',266 'result' : {'type' : 'state',
233 'action' : _do_calculate,267 'state' : 'end2'}
234 'state' : 'end'}268 },
235 }269
270 'end2': {
271 'actions': [ _get_message ],
272 'result': {'type': 'form', 'arch': _messages_form,
273 'fields': _message_fields,
274 'state': (
275 ('end', 'Close'),
276 )
277 },
278 },
236 }279 }
237orderpoint_calculator("orderpoint.calculator")280orderpoint_calculator("orderpoint.calculator")
238281

Subscribers

People subscribed via source and target branches