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

Proposed by gpa(OpenERP)
Status: Merged
Merged at revision: 15
Proposed branch: lp:~openbig/bigconsulting/added_changes_as_new_speci
Merge into: lp:bigconsulting
Diff against target: 888 lines (+759/-46)
11 files modified
stock_minimum_calculator/__init__.py (+2/-1)
stock_minimum_calculator/__terp__.py (+5/-1)
stock_minimum_calculator/stock_minimujm_calculator_wizard.xml (+11/-0)
stock_minimum_calculator/stock_minimum_calculator.py (+115/-15)
stock_minimum_calculator/stock_minimum_calculator_sequence.xml (+17/-0)
stock_minimum_calculator/stock_minimum_calculator_view.xml (+213/-29)
stock_minimum_calculator/stock_order_point_calculator.py (+217/-0)
stock_minimum_calculator/stock_order_point_calculator_view.xml (+50/-0)
stock_minimum_calculator/wizard/__init__.py (+26/-0)
stock_minimum_calculator/wizard/seasonal_trend_set.py (+71/-0)
stock_minimum_calculator/wizard/seasonal_trend_set_view.xml (+32/-0)
To merge this branch: bzr merge lp:~openbig/bigconsulting/added_changes_as_new_speci
Reviewer Review Type Date Requested Status
openbig Pending
Review via email: mp+27165@code.launchpad.net

Description of the change

Added changes as new specification on stock_minimum_calculator

To post a comment you must log in.
14. By gpa(OpenERP)

changes on the stock_minimum_calculator

15. By gpa(OpenERP)

changes on stock_minimum_calculator optimated lead time

16. By gpa(OpenERP)

changes in stock_minimum_calculator added constraint on valid

17. By gpa(OpenERP)

modify on stock_minimum_calcularot

18. By gpa(OpenERP)

added sequence number to minimum rule name

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-05-26 14:22:22 +0000
+++ stock_minimum_calculator/__init__.py 2010-06-11 07:44:24 +0000
@@ -21,5 +21,6 @@
21##############################################################################21##############################################################################
2222
23import stock_minimum_calculator23import stock_minimum_calculator
2424import wizard
25import stock_order_point_calculator
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:26# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
26\ No newline at end of file27\ No newline at end of file
2728
=== modified file 'stock_minimum_calculator/__terp__.py'
--- stock_minimum_calculator/__terp__.py 2010-05-26 14:22:22 +0000
+++ stock_minimum_calculator/__terp__.py 2010-06-11 07:44:24 +0000
@@ -31,7 +31,11 @@
31 """,31 """,
32 "depends": ['stock','mrp'],32 "depends": ['stock','mrp'],
33 "demo_xml": [],33 "demo_xml": [],
34 "update_xml": ['stock_minimum_calculator_view.xml' ],34 "update_xml": ['stock_minimum_calculator_view.xml',
35 "stock_minimujm_calculator_wizard.xml",
36 "stock_order_point_calculator_view.xml",
37 "stock_minimum_calculator_sequence.xml"
38 ],
35 "license": "GPL-3",39 "license": "GPL-3",
36 "active": False,40 "active": False,
37 "installable": True,41 "installable": True,
3842
=== added file 'stock_minimum_calculator/stock_minimujm_calculator_wizard.xml'
--- stock_minimum_calculator/stock_minimujm_calculator_wizard.xml 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/stock_minimujm_calculator_wizard.xml 2010-06-11 07:44:24 +0000
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <wizard
5 string="Set Seasonal Trend"
6 model="product.product"
7 name="set_seasonal.trend"
8 menu="True"
9 id="id_set_seasonal_trend"/>
10 </data>
11</openerp>
012
=== modified file 'stock_minimum_calculator/stock_minimum_calculator.py'
--- stock_minimum_calculator/stock_minimum_calculator.py 2010-05-26 14:22:22 +0000
+++ stock_minimum_calculator/stock_minimum_calculator.py 2010-06-11 07:44:24 +0000
@@ -21,20 +21,120 @@
21##############################################################################21##############################################################################
22from osv import fields, osv22from osv import fields, osv
23from tools.translate import _23from tools.translate import _
2424import time
25class stock_minimum_calculator(osv.osv_memory):25
26 _name = 'stock.minimum.calculator'26class stock_holding_rate(osv.osv):
2727 _name = "stock.holding.rate"
28 def set_default(self, cr, uid, ids, context=None):28 _columns = {
29 product_obj = self.pool.get('product.product')29 'rate_id':fields.char("ID",size=64, required=True),
30 min_rule_obj = self.pool.get('stock.warehouse.orderpoint')30 'name':fields.char("Name",size=64, required=True),
31 stock_rule_ids = min_rule_obj.search(cr,uid,[])31 'stock_hold_rate':fields.float("Stock Holding Rate"),
32 FIELDS = ['qty_available','virtual_available','incoming_qty','outgoing_qty']32 'date_start': fields.date('Start Date', required=True),
33 for rule_record in min_rule_obj.browse(cr, uid, stock_rule_ids, context=context):33 'date_stop': fields.date('End Date', required=True),
34 context.update({'warehouse':rule_record.warehouse_id.id,'location':rule_record.location_id.id})34 'active': fields.boolean('Active'),
35 data = product_obj._product_available(cr,uid,[rule_record.product_id.id],FIELDS,context=context)35 'holding_ids': fields.one2many('supplier.product', 'suppinfo_id', 'Supplier'),
36 return {}36 }
3737stock_holding_rate()
38stock_minimum_calculator()38
39
40class supplier_product(osv.osv):
41 _name = 'supplier.product'
42 _rec_name = 'partner_id'
43 _columns = {
44 'suppinfo_id': fields.many2one('stock.holding.rate', 'Holding',),
45 'partner_id': fields.many2one('res.partner', 'Suplier Information',),
46 'supp_stock':fields.float("Supplier Stock"),
47 }
48
49supplier_product()
50
51class res_partner(osv.osv):
52 _inherit = "res.partner"
53 _columns = {
54 'stock_holding_rate_id':fields.many2one("stock.holding.rate",'Holding Rate'),
55 }
56res_partner()
57
58
59class supplier_cost_opti_lead_time(osv.osv):
60 _name = "supplier.cost.opti.lead.time"
61 _columns = {
62 'supp_cost_id':fields.char("ID",size=64, required=True),
63 'name':fields.char("Name of the rule",size=64, required=True),
64 'partner_id': fields.many2one('res.partner', 'Suplier'),
65 'date_start': fields.date('Date', required=True),
66 'active': fields.boolean('Active'),
67 'yrl_purchase_rev':fields.float("YRL Purchase Revenue",required=True),
68 'economic_no_order':fields.float("Economic Number of orders",readonly=True),
69 'cost_per_del':fields.float("Cost Per Delivery",required=True),
70 'economic_lead_time':fields.float("Economic Lead Time",readonly=True),
71 'stock_holding_rate_id':fields.many2one("stock.holding.rate",'Holding Rate',required=True),
72 'staus': fields.selection([
73 ('draft','Draft'),
74 ('valid','Valid'),
75 ('cancel','Cancel'),
76 ],'Status',readonly=True),
77 }
78 _defaults = {
79 'date_start': lambda *a: time.strftime('%Y-%m-%d'),
80 }
81
82 def action_compute(self, cr, uid, ids, context={}):
83 for id in ids:
84 cost_op = self.browse(cr, uid,id,context=context)
85 economic_numer_orders = (cost_op.yrl_purchase_rev * cost_op.stock_holding_rate_id.stock_hold_rate)/ (2*cost_op.cost_per_del)
86 economic_lead_time = 360 / economic_numer_orders
87 self.write(cr, uid, [id],{'economic_lead_time':economic_lead_time,'economic_no_order':economic_numer_orders})
88 return True
89
90 def action_cancel(self, cr, uid, ids, context={}):
91 for o in self.browse(cr, uid, ids):
92 self.write(cr, uid, [o.id], {'staus': 'cancel'})
93 return True
94
95 def action_validate(self, cr, uid, ids, context={}):
96 for o in self.browse(cr, uid, ids):
97 already_id = self_obj.search(cr, uid, [('partner_id','=',o.partner_id.id),('id', 'not in', ids),('staus','=','valid')])
98 if already_id:
99 old_partner_id = self.browse(cr, uid, already_id[0])
100 if o.partner_id.id == old_partner_id.partner_id.id:
101 raise osv.except_osv(_('Error !'),
102 _('You can not this partner becasue this partner aleready with valid entry'))
103 self.write(cr, uid, [o.id], {'staus': 'valid'})
104 return True
105
106supplier_cost_opti_lead_time()
107
108class product_seasonal(osv.osv):
109 _name = 'product.seasonal'
110 _columns = {
111 'name':fields.char("Seasonal Name",size=64, required=True),
112 'code':fields.char("Code",size=64, required=True),
113 'seasonal_factor':fields.float("Seasonal Factor"),
114 }
115
116product_seasonal()
117
118class product_product(osv.osv):
119 _inherit = "product.product"
120 _columns = {
121 'seasonal_id':fields.many2one("product.seasonal",'Seasonal Model'),
122 'plan_avg_consume':fields.float("Plan Average Daily Consumption"),
123 }
124product_product()
125
126
127class stock_warehosue_orderpoint_period(osv.osv):
128 ### Add for percenatage of the period
129 _name = "stock.warehosue.orderpoint.period"
130 _columns = {
131 'name':fields.char("Name",size=64,required=True),
132 'product_id':fields.many2one('product.product', 'Product',required=True),
133 'partner_id':fields.many2one('res.partner','Partner',required=True),
134 'period_id' :fields.many2one('account.period',"Period",required=True),
135 'percentage':fields.float("Percenatage",required=True),
136 }
137
138stock_warehosue_orderpoint_period()
39139
40# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:140# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
41\ No newline at end of file141\ No newline at end of file
42142
=== added file 'stock_minimum_calculator/stock_minimum_calculator_sequence.xml'
--- stock_minimum_calculator/stock_minimum_calculator_sequence.xml 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/stock_minimum_calculator_sequence.xml 2010-06-11 07:44:24 +0000
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data noupdate="1">
4 <!-- Sequences for stock.orderpoint.step2 -->
5 <record id="sequence_stock_op_point" model="ir.sequence.type">
6 <field name="name">Stock orderpoint step2</field>
7 <field name="code">stock.orderpoint.step2</field>
8 </record>
9 <record id="sequence_stock_op" model="ir.sequence">
10 <field name="name">Stock orderpoint step2</field>
11 <field name="code">stock.orderpoint.step2</field>
12 <field name="prefix">OP/</field>
13 <field name="padding">5</field>
14 <field name="number_increment">1</field>
15 </record>
16 </data>
17</openerp>
018
=== modified file 'stock_minimum_calculator/stock_minimum_calculator_view.xml'
--- stock_minimum_calculator/stock_minimum_calculator_view.xml 2010-05-26 14:22:22 +0000
+++ stock_minimum_calculator/stock_minimum_calculator_view.xml 2010-06-11 07:44:24 +0000
@@ -1,35 +1,219 @@
1<?xml version="1.0" encoding="utf-8"?>1<?xml version="1.0" encoding="utf-8"?>
2<openerp>2<openerp>
3 <data>3 <data>
4 <record id="view_stock_minimum_calculator_form" model="ir.ui.view">4
5 <field name="name">stock.minimum.calculator.form</field>5 <record id="stock_holding_rate_tree_view" model="ir.ui.view">
6 <field name="model">stock.minimum.calculator</field>6 <field name="name">stock.holding.rate.tree</field>
7 <field name="type">form</field>7 <field name="model">stock.holding.rate</field>
8 <field name="arch" type="xml">8 <field name="type">tree</field>
9 <form string="Stock Rule Computation">9 <field name="arch" type="xml">
10 <separator string="Stock Rule Computation" colspan="4" />10 <tree string="Stock Holding Rate">
11 <label align="0.7" colspan="4" string="Would you like to re-calculation Minimum stock Rule?"/>11 <field name="name"/>
12 <separator string="" colspan="4" />12 <field name="rate_id"/>
13 <label string ="" colspan="2"/>13 <field name="stock_hold_rate"/>
14 <button icon="gtk-cancel" special="cancel" string="Cancel" colspan="1"/>14 <field name="date_start"/>
15 <button icon="gtk-ok" string="Re-compute" name="set_default" type="object" colspan="1"/>15 <field name="date_stop"/>
16 </form>16 <field name="stock_hold_rate"/>
17 </field>17 </tree>
18 </record>18 </field>
19 19 </record>
20 <record id="action_stock_minimum_calculator" model="ir.actions.act_window">20
21 <field name="name">Stock Order Point</field>21 <record id="stock_holding_rate_form_view" model="ir.ui.view">
22 <field name="type">ir.actions.act_window</field>22 <field name="name">stock.holding.rate.form</field>
23 <field name="res_model">stock.minimum.calculator</field>23 <field name="model">stock.holding.rate</field>
24 <field name="view_type">form</field>24 <field name="type">form</field>
25 <field name="view_mode">tree,form</field>25 <field name="arch" type="xml">
26 <field name="view_id" ref="view_stock_minimum_calculator_form"/>26 <form string="Stock Holding Rate">
27 <field name="target">new</field>27 <group colspan="6" col="6">
28 </record>28 <field name="name"/>
29 29 <field name="rate_id"/>
30 <menuitem action="action_stock_minimum_calculator"30 <field name="active"/>
31 id="menu_action_stock_minimum_calculator"31 <field name="date_start"/>
32 parent="product.menu_config_product" />32 <field name="date_stop"/>
33 <field name="stock_hold_rate"/>
34 </group>
35 <field name="holding_ids" nolabel="1" colspan="4" widget="one2many_list">
36 <tree editable="bottom" string="Supplier">
37 <field name="partner_id"/>
38 <field name="supp_stock"/>
39 </tree>
40 <form>
41 <field name="partner_id"/>
42 <field name="supp_stock"/>
43 </form>
44 </field>
45 </form>
46 </field>
47 </record>
48 <record id="stock_holding_rate_tree_view_normal_action" model="ir.actions.act_window">
49 <field name="name">Stock Holding Rate</field>
50 <field name="type">ir.actions.act_window</field>
51 <field name="res_model">stock.holding.rate</field>
52 <field name="view_type">form</field>
53 <field name="view_id" ref="stock_holding_rate_tree_view"/>
54 </record>
55 <menuitem action="stock_holding_rate_tree_view_normal_action" id="menu_stock_holding_rate" parent="stock.menu_stock_configuration"/>
56
57 <record id="supplier_cost_opti_lead_time_tree_view" model="ir.ui.view">
58 <field name="name">supplier.cost.opti.lead.time.tree</field>
59 <field name="model">supplier.cost.opti.lead.time</field>
60 <field name="type">tree</field>
61 <field name="arch" type="xml">
62 <tree string="Supplier Cost Optimated Lead Times">
63 <field name="supp_cost_id"/>
64 <field name="name"/>
65 <field name="partner_id"/>
66 <field name="date_start"/>
67 <field name="yrl_purchase_rev"/>
68 <field name="economic_no_order"/>
69 <field name="cost_per_del"/>
70 <field name="economic_lead_time"/>
71 <field name="stock_holding_rate_id"/>
72 <field name="staus"/>
73 </tree>
74 </field>
75 </record>
76
77 <record id="supplier_cost_opti_lead_time_form_view" model="ir.ui.view">
78 <field name="name">supplier.cost.opti.lead.time.form</field>
79 <field name="model">supplier.cost.opti.lead.time</field>
80 <field name="type">form</field>
81 <field name="arch" type="xml">
82 <form string="Supplier Cost Optimated Lead Times">
83 <group colspan="6" col="6">
84 <field name="name"/>
85 <field name="supp_cost_id"/>
86 <field name="active"/>
87 <field name="partner_id"/>
88 <field name="date_start"/>
89 </group>
90 <group colspan="2" col="2">
91 <separator colspan="4" string="Automatic Declaration"/>
92 <field name="yrl_purchase_rev"/>
93 <field name="cost_per_del"/>
94 <field name="stock_holding_rate_id"/>
95 </group>
96 <group colspan="2" col="2">
97 <separator colspan="4" string="Economic Number of orders"/>
98 <field name="economic_no_order"/>
99 <field name="economic_lead_time"/>
100 <button name="action_compute" string="Calculate Lead Time" type="object"/>
101 </group>
102 <field name="staus"/>
103 <button name="action_cancel" string="Cancel" type="object"/>
104 <button name="action_validate" string="Valid" type="object"/>
105 </form>
106 </field>
107 </record>
108 <record id="supplier_cost_opti_lead_time_normal_action" model="ir.actions.act_window">
109 <field name="name">Supplier Cost Optimated Lead Times</field>
110 <field name="type">ir.actions.act_window</field>
111 <field name="res_model">supplier.cost.opti.lead.time</field>
112 <field name="view_type">form</field>
113 <field name="view_id" ref="supplier_cost_opti_lead_time_tree_view"/>
114 </record>
115 <menuitem action="supplier_cost_opti_lead_time_normal_action" id="menu_supplier_cost_opti_lead_time" parent="stock.menu_stock_configuration"/>
116
117
118
119 <record id="product_seasonal_tree_view" model="ir.ui.view">
120 <field name="name">product.seasonal.tree</field>
121 <field name="model">product.seasonal</field>
122 <field name="type">tree</field>
123 <field name="arch" type="xml">
124 <tree string="Product Seasonal">
125 <field name="name"/>
126 <field name="code"/>
127 <field name="seasonal_factor"/>
128 </tree>
129 </field>
130 </record>
131
132 <record id="product_seasonal_form_view" model="ir.ui.view">
133 <field name="name">product.seasonal.form</field>
134 <field name="model">product.seasonal</field>
135 <field name="type">form</field>
136 <field name="arch" type="xml">
137 <form string="Product Seasonal">
138 <field name="name"/>
139 <field name="code"/>
140 <field name="seasonal_factor"/>
141 </form>
142 </field>
143 </record>
144 <record id="product_seasonal_normal_action" model="ir.actions.act_window">
145 <field name="name">Product Seasonal</field>
146 <field name="type">ir.actions.act_window</field>
147 <field name="res_model">product.seasonal</field>
148 <field name="view_type">form</field>
149 <field name="view_id" ref="product_seasonal_tree_view"/>
150 </record>
151 <menuitem action="product_seasonal_normal_action" id="menu_product_seasonal" parent="stock.menu_stock_configuration"/>
152
153 <record model="ir.ui.view" id="view_supplier_holding_rate_form1">
154 <field name="name">res.partner.form</field>
155 <field name="model">res.partner</field>
156 <field name="inherit_id" ref="stock.view_partner_property_form"/>
157 <field name="type">form</field>
158 <field name="arch" type="xml">
159 <field name="property_stock_supplier" position="after">
160 <field name="stock_holding_rate_id" />
161 </field>
162 </field>
163 </record>
164 <record model="ir.ui.view" id="view_supplier_holding_rate_form">
165 <field name="name">product.product.form</field>
166 <field name="model">product.product</field>
167 <field name="inherit_id" ref="product.product_normal_form_view"/>
168 <field name="type">form</field>
169 <field name="arch" type="xml">
170 <field name="company_id" position="after">
171 <field name="seasonal_id" />
172 <field name="plan_avg_consume" />
173 </field>
174 </field>
175 </record>
176
177<!-- Add for percenatage of the period -->
178 <record id="stock_warehosue_orderpoint_period_tree_view" model="ir.ui.view">
179 <field name="name">stock.warehosue.orderpoint.period.tree</field>
180 <field name="model">stock.warehosue.orderpoint.period</field>
181 <field name="type">tree</field>
182 <field name="arch" type="xml">
183 <tree string="Period Percenatage">
184 <field name="name"/>
185 <field name="product_id"/>
186 <field name="partner_id"/>
187 <field name="period_id"/>
188 <field name="percentage"/>
189 </tree>
190 </field>
191 </record>
192
193 <record id="stock_warehosue_orderpoint_period_form_view" model="ir.ui.view">
194 <field name="name">stock.warehosue.orderpoint.period.form</field>
195 <field name="model">stock.warehosue.orderpoint.period</field>
196 <field name="type">form</field>
197 <field name="arch" type="xml">
198 <form string="Period Percenatage">
199 <field name="name"/>
200 <field name="product_id"/>
201 <field name="partner_id"/>
202 <field name="period_id"/>
203 <field name="percentage"/>
204 </form>
205 </field>
206 </record>
207 <record id="stock_warehosue_orderpoint_period_normal_action" model="ir.actions.act_window">
208 <field name="name">Period Percenatage</field>
209 <field name="type">ir.actions.act_window</field>
210 <field name="res_model">stock.warehosue.orderpoint.period</field>
211 <field name="view_type">form</field>
212 <field name="view_id" ref="stock_warehosue_orderpoint_period_tree_view"/>
213 </record>
214
215 <menuitem action="stock_warehosue_orderpoint_period_normal_action" id="menu_period_supplier" parent="stock.menu_stock_configuration"/>
216
33 217
34 </data>218 </data>
35</openerp>219</openerp>
36\ No newline at end of file220\ No newline at end of file
37221
=== added file 'stock_minimum_calculator/stock_order_point_calculator.py'
--- stock_minimum_calculator/stock_order_point_calculator.py 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/stock_order_point_calculator.py 2010-06-11 07:44:24 +0000
@@ -0,0 +1,217 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6#
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.
11#
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.
16#
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/>.
19#
20##############################################################################
21from osv import fields, osv
22import time
23from tools.translate import _
24
25class stock_orderpoint_step1(osv.osv_memory):
26
27 _name="stock.orderpoint.step1"
28 _columns = {
29 'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse',required=True),
30 'deactive': fields.boolean('Deactive Existing Rules'),
31 'delactive': fields.boolean('Delete Exiting Rules(for this warehosue)'),
32 }
33
34 def _de_next(self, cr, uid, ids, context=None):
35
36 mod_obj = self.pool.get('ir.model.data')
37 product_obj = self.pool.get('product.product')
38 min_rule_obj = self.pool.get('stock.warehouse.orderpoint')
39 form = self.read(cr, uid, ids, [])[0]
40
41 stock_rule_ids = min_rule_obj.search(cr,uid,[('warehouse_id','=',form['warehouse_id'])])
42
43 if form['deactive']:
44 for stock_rule_id in min_rule_obj.browse(cr, uid, stock_rule_ids, context=context):
45 min_rule_obj.write(cr, uid, [stock_rule_id.id], {'active':False}, context=context)
46
47 elif form['delactive']:
48 for stock_rule_id in min_rule_obj.browse(cr, uid, stock_rule_ids, context=context):
49 min_rule_obj.unlink(cr, uid, [stock_rule_id.id],context=context)
50
51
52 model_data_ids = mod_obj.search(cr, uid,[('model','=','ir.ui.view'),('name','=','view_stock_orderpoint_step2')], context=context)
53 resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
54 return {
55 'name': _('Stock Orderpoint Step2'),
56 'context': context,
57 'view_type': 'form',
58 'view_mode': 'form',
59 'res_model': 'stock.orderpoint.step2',
60 'views': [(resource_id,'form')],
61 'type': 'ir.actions.act_window',
62 'target': 'new',
63 }
64stock_orderpoint_step1()
65
66
67class stock_orderpoint_step2(osv.osv_memory):
68
69 _name="stock.orderpoint.step2"
70 _columns = {
71 'min_qty_calculation': fields.selection([('optimal_stock_coverage', 'Optimal Stock Coverage'),
72 ('normal_stock_coverage', 'Normal Stock Coverage'),
73 ], 'Method Calculation Minimum Qty',required=True),
74 'max_qty_calculation': fields.selection([('optimal_stock_coverage', 'Optimal Stock Coverage'),
75 ('normal_stock_coverage', 'Normal Stock Coverage'),
76 ], 'Method Calculation Maximum Qty',required=True),
77 }
78 _defaults = {
79 'min_qty_calculation': lambda *a: 'optimal_stock_coverage',
80 'max_qty_calculation': lambda *a: 'optimal_stock_coverage',
81 }
82
83 def _next_calculate(self, cr, uid, ids, context=None):
84
85 purchase_obj = self.pool.get('purchase.order')
86 sale_obj = self.pool.get('sale.order')
87 product_obj = self.pool.get('product.product')
88 supp_obj = self.pool.get("product.supplierinfo")
89 supp_cost_opt_obj = self.pool.get("supplier.cost.opti.lead.time")
90 wizard_obj = self.pool.get("stock.orderpoint.step1")
91 min_rule_obj = self.pool.get('stock.warehouse.orderpoint')
92 order_period_obj = self.pool.get("stock.warehosue.orderpoint.period")
93
94 form = self.read(cr, uid, ids, [])[0]
95
96 purchase_ids = purchase_obj.search(cr,uid,[])
97 start_pur_id = min(purchase_ids)
98 last_pur_id = max(purchase_ids)
99
100 ############# Calculation of purchase Quantity upto today
101 purchase_qty = 0.0
102 if purchase_ids:
103 for pur_id in purchase_ids:
104 purchase_data = purchase_obj.browse(cr,uid,pur_id)
105 for line in purchase_data.order_line:
106 purchase_qty += line.product_qty
107
108
109 ##### Calculation of sale order Quantity of open orders
110 sale_qty = 0.0
111 sale_ids = self.pool.get('sale.order').search(cr, uid, [('state','in',['manual','progress'])])
112 if sale_ids:
113 for sale_id in sale_ids:
114 sale_data = self.pool.get('sale.order').browse(cr,uid,sale_id)
115 for line in sale_data.order_line:
116 sale_qty += line.product_uom_qty
117
118
119 ##################calculation of date difference between first and last purchase order
120 first_purchase_date = purchase_obj.browse(cr,uid,start_pur_id).date_order
121 last_purchase_date = purchase_obj.browse(cr,uid,last_pur_id).date_order
122 first_date = time.mktime(time.strptime(first_purchase_date,'%Y-%m-%d'))
123 last_date = time.mktime(time.strptime(last_purchase_date,'%Y-%m-%d'))
124 diff_day = (last_date-first_date)/(3600*24)
125
126 ##### Calculation of purchase lead time
127 purchase_lead_time = 0.0
128 company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
129 purchase_lead_time = company.po_lead
130
131 ##### Calculation of supplier lead time
132 product_id = product_obj.browse(cr, uid, context['id'], context)
133 supplier_lead_time = 0.0
134 if product_id:
135 for supp in product_id.seller_ids:
136 sup = supp_obj.browse(cr, uid, supp.id, context)
137 supplier_lead_time = sup.delay
138
139
140 ##### Calculation of average_daily_consumption
141 average_daily_consumption = 0.0
142 if purchase_ids and diff_day > 0.0:
143 average_daily_consumption = (sale_qty + purchase_qty )/diff_day
144 else:
145 plan_consume = product_id.plan_avg_consume
146 average_daily_consumption = plan_consume
147 ######### calculation of safety stock
148 safety_stock = purchase_qty / len(purchase_ids)
149
150 ### calculation of Economic lead time (days)
151 cost_op_id = supp_cost_opt_obj.search(cr, uid, [('partner_id','=',sup.name.id)])
152 economic_lead_days = 0.0
153 economic_numer_orders = 0.0
154 economic_lead_time = 0.0
155 if cost_op_id:
156 cost_op = supp_cost_opt_obj.browse(cr, uid,cost_op_id[0])
157 economic_numer_orders = cost_op.economic_no_order
158 economic_lead_time = cost_op.economic_lead_time
159 economic_lead_days = economic_lead_time * 30 #Economic leaddays: field economic leadtime from supplier.leadtimes * 30
160
161 ### Calculation of the percentage of this days period
162 future_seasonal_fac = 0.0
163 periods = self.pool.get('account.period').find(cr, uid)
164 for period in periods:
165 trend_id = order_period_obj.search(cr, uid, [('period_id','=',period)])
166 if trend_id:
167 per = order_period_obj.browse(cr, uid,trend_id[0]).percentage
168 future_seasonal_fac = economic_lead_days + purchase_lead_time / per
169
170 #### Calculation of seasonal Factor
171
172 #??????seasonal factor = percentage of product.seasonaltrend for future period of follwing date:
173 #today + economic lead days + purchase lead time / "percentage of this days period"
174 seasonal_fac = 0.0
175 seasonal_fac = product_id.seasonal_id.seasonal_factor
176
177
178 ### Calculation for minimum quantity
179 optimal_stock_coverage = 0.0
180 normal_stock_coverage = 0.0
181 if form['min_qty_calculation'] == 'optimal_stock_coverage':
182 optimal_stock_coverage = average_daily_consumption * seasonal_fac * (economic_lead_days + purchase_lead_time) / safety_stock
183 else:
184 normal_stock_coverage = average_daily_consumption * (supplier_lead_time + purchase_lead_time)/safety_stock
185
186
187 ### Calculation for maximum quantity
188 optimal_stock_coverage_max = 0.0
189 normal_stock_coverage_max = 0.0
190 if form['max_qty_calculation'] == 'optimal_stock_coverage':
191 optimal_stock_coverage_max = (average_daily_consumption * seasonal_fac * (economic_lead_days + purchase_lead_time))
192 else:
193 normal_stock_coverage_max = average_daily_consumption * (supplier_lead_time + purchase_lead_time)
194
195 ids = wizard_obj.search(cr, uid, [])
196
197 wizz_id = wizard_obj.browse(cr, uid, ids[0])
198 max1 = 'max'
199 name = self.pool.get('ir.sequence').get(cr, uid, 'stock.orderpoint.step2')
200
201 self.pool.get('stock.warehouse.orderpoint').create(cr, uid, {
202 'name': name,
203 'active': True,
204 'warehouse_id': wizz_id.warehouse_id.id,
205 'location_id': product_id.property_stock_inventory.id,
206 'product_id': context['id'],
207 'product_min_qty': optimal_stock_coverage or normal_stock_coverage,
208 'product_max_qty': optimal_stock_coverage_max or normal_stock_coverage_max,
209 'qty_multiple':1,
210 'product_uom':product_id.uom_id.id,
211 'logic':'max'
212 } )
213 return {}
214
215stock_orderpoint_step2()
216
217# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file218\ No newline at end of file
1219
=== added file 'stock_minimum_calculator/stock_order_point_calculator_view.xml'
--- stock_minimum_calculator/stock_order_point_calculator_view.xml 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/stock_order_point_calculator_view.xml 2010-06-11 07:44:24 +0000
@@ -0,0 +1,50 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <record id="view_account_invoice_pay" model="ir.ui.view">
5 <field name="name">stock.orderpoint.step1.form</field>
6 <field name="model">stock.orderpoint.step1</field>
7 <field name="type">form</field>
8 <field name="arch" type="xml">
9 <form string="Wizard Order Point Calculator Step1 - Choose Warehouse and Updating Settings">
10 <group colspan="4" >
11 <field name="warehouse_id"/>
12 <field name="deactive"/>
13 <field name="delactive"/>
14 </group>
15 <group colspan="4" col="6">
16 <label string ="" colspan="2"/>
17 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
18 <button icon="gtk-execute" string="Next Step" name="_de_next" type="object"/>
19 </group>
20 </form>
21 </field>
22 </record>
23
24 <act_window name="Orderpoint Calculator"
25 res_model="stock.orderpoint.step1"
26 src_model="product.product"
27 view_mode="form"
28 target="new"
29 context="{'id': active_id}"
30 id="action_view_stock_orderpoint_step1"/>
31
32 <record id="view_stock_orderpoint_step2" model="ir.ui.view">
33 <field name="name">stock.orderpoint.step2.form</field>
34 <field name="model">stock.orderpoint.step2</field>
35 <field name="type">form</field>
36 <field name="arch" type="xml">
37 <form string="Wizard Order Point Calculator Step2 - Choose Method">
38 <field name="min_qty_calculation"/>
39 <field name="max_qty_calculation" />
40 <group colspan="4" col="6">
41 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
42 <button icon="gtk-execute" string="Next Step" name="_next_calculate" type="object"/>
43 </group>
44 </form>
45 </field>
46 </record>
47
48
49 </data>
50</openerp>
0\ No newline at end of file51\ No newline at end of file
152
=== added directory 'stock_minimum_calculator/wizard'
=== added file 'stock_minimum_calculator/wizard/__init__.py'
--- stock_minimum_calculator/wizard/__init__.py 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/wizard/__init__.py 2010-06-11 07:44:24 +0000
@@ -0,0 +1,26 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import seasonal_trend_set
24
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
26
027
=== added file 'stock_minimum_calculator/wizard/seasonal_trend_set.py'
--- stock_minimum_calculator/wizard/seasonal_trend_set.py 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/wizard/seasonal_trend_set.py 2010-06-11 07:44:24 +0000
@@ -0,0 +1,71 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6#
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.
11#
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.
16#
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/>.
19#
20##############################################################################
21
22import wizard
23import pooler
24import time
25from tools.translate import _
26
27seasonal_trend_form = """<?xml version="1.0"?>
28<form string="Seasonal Product Trend ">
29 <field name="trend_seasonal_id"/>
30 <field name="active"/>
31</form>"""
32
33seasonal_trend_fields = {
34 'trend_seasonal_id': {'string': 'Seasonal Model', 'type': 'many2one', 'relation': 'product.seasonal', 'required': True},
35 'active': {'string':'Replace Models', 'type':'boolean'},
36 }
37
38def _set_seasonal(self, cr, uid, data, context):
39
40 product_obj = pooler.get_pool(cr.dbname).get('product.product')
41 form = data['form']
42
43 if form['active']:
44 for id in data['ids']:
45 product_obj.write(cr, uid, id, {'seasonal_id':form['trend_seasonal_id']}, context=context)
46 else:
47 product_obj.write(cr, uid, data['id'], {'seasonal_id':form['trend_seasonal_id']}, context=context)
48
49 return {}
50
51
52class product_seasonal_trend(wizard.interface):
53 states = {
54 'init' : {
55 'actions' : [],
56 'result' : {'type' : 'form',
57 'arch' : seasonal_trend_form,
58 'fields' : seasonal_trend_fields,
59 'state' : [('end', 'Cancel'),('set_seasonal', 'Ok') ]}
60 },
61 'set_seasonal' : {
62 'actions' : [],
63 'result' : {'type' : 'action',
64 'action' : _set_seasonal,
65 'state' : 'end'}
66 }
67 }
68product_seasonal_trend("set_seasonal.trend")
69
70
71# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file72\ No newline at end of file
173
=== added file 'stock_minimum_calculator/wizard/seasonal_trend_set_view.xml'
--- stock_minimum_calculator/wizard/seasonal_trend_set_view.xml 1970-01-01 00:00:00 +0000
+++ stock_minimum_calculator/wizard/seasonal_trend_set_view.xml 2010-06-11 07:44:24 +0000
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="view_stock_order_rule" model="ir.ui.view">
6 <field name="name">product.seasonal.trend.form</field>
7 <field name="model">product.seasonal.trend</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Set Seasonal Trend">
11 <field name="trend_seasonal_id" />
12 <field name="active" />
13 <group colspan="4" col="6">
14 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
15 <button icon="gtk-execute" string="OK" name="_set_seasonal" type="object"/>
16 </group>
17 </form>
18 </field>
19 </record>
20
21 <act_window
22 res_model = "product.seasonal.trend"
23 src_model = "product.product"
24 view_type = "form"
25 view_mode = "form"
26 name= "Set Seasonal Trend"
27 target="new"
28 context="{'id': active_id}"
29 id="action_product_seasonal_trend"/>
30
31 </data>
32</openerp>
0\ No newline at end of file33\ No newline at end of file

Subscribers

People subscribed via source and target branches