Oihane (Avanzosc) has proposed merging lp:~oihanecruce/avanzosc/migrate2 into lp:~avanzosc-security-team/avanzosc/72horas.
Requested reviews: Pedro Manuel Baeza (pedro.baeza) For more details, see: https://code.launchpad.net/~oihanecruce/avanzosc/migrate2/+merge/222971 -- https://code.launchpad.net/~oihanecruce/avanzosc/migrate2/+merge/222971 Your team Avanzosc_security is subscribed to branch lp:~avanzosc-security-team/avanzosc/72horas.
=== modified file 'crm_extended/__init__.py' --- crm_extended/__init__.py 2014-06-11 10:23:47 +0000 +++ crm_extended/__init__.py 2014-06-12 16:23:53 +0000 @@ -1,25 +1,22 @@ -# -*- coding: utf-8 -*- +# -*- encoding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# Copyright (C) 2008-2014 AvanzOSC S.L. (Oihane) All Rights Reserved # # 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. +# 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. +# GNU 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 <http://www.gnu.org/licenses/>. +# along with this program. If not, see http://www.gnu.org/licenses/. # ############################################################################## -import crm_extended - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - +from . import models === modified file 'crm_extended/__openerp__.py' --- crm_extended/__openerp__.py 2014-06-11 10:23:47 +0000 +++ crm_extended/__openerp__.py 2014-06-12 16:23:53 +0000 @@ -3,6 +3,7 @@ # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# 2008-2014 AvanzOSC S.L. (Oihane) All Rights Reserved # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -26,17 +27,18 @@ 'category': 'Generic Modules/CRM & SRM', 'description': """ This module redesign Incoming calls menu to fit custom needs.""", - 'depends': ['crm_claim', 'stock', 'base_contact'], - 'init_xml': [], - 'update_xml': [ + 'depends': [ + 'crm', + 'crm_claim', + 'stock', + ], + 'data': [ 'security/ir.model.access.csv', - 'crm_extended_view.xml', - ], - 'demo_xml': [ - ], - 'test':[ + 'views/crm_phonecall_view.xml', + ], + 'demo': [ + ], + 'test': [ ], 'installable': True, } - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: === added directory 'crm_extended/models' === added file 'crm_extended/models/__init__.py' --- crm_extended/models/__init__.py 1970-01-01 00:00:00 +0000 +++ crm_extended/models/__init__.py 2014-06-12 16:23:53 +0000 @@ -0,0 +1,22 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2008-2014 AvanzOSC S.L. (Oihane) All Rights Reserved +# +# 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 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 http://www.gnu.org/licenses/. +# +############################################################################## + +from . import crm_phonecall \ No newline at end of file === renamed file 'crm_extended/crm_extended.py' => 'crm_extended/models/crm_phonecall.py' --- crm_extended/crm_extended.py 2014-06-11 10:23:47 +0000 +++ crm_extended/models/crm_phonecall.py 2014-06-12 16:23:53 +0000 @@ -3,6 +3,7 @@ # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# 2008-2014 AvanzOSC S.L. (Oihane) All Rights Reserved # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -19,94 +20,92 @@ # ############################################################################## -from osv import osv, fields -from tools.translate import _ +from openerp.osv import orm, fields +from openerp.tools.translate import _ from datetime import datetime -class crm_phonecall_result(osv.osv): +class CrmPhonecallResult(orm.Model): _name = "crm.phonecall.result" _description = "Phonecall Result" _columns = { - 'name': fields.char('Result Name', size=64, required=True, translate=True), + 'name': fields.char('Result Name', size=64, + required=True, translate=True), } -crm_phonecall_result() -class crm_phonecall_type(osv.osv): +class CrmPhonecallType(orm.Model): _name = "crm.phonecall.type" _description = "Phonecall Type" _columns = { - 'name': fields.char('Type', size=64, required=True, translate=True), + 'name': fields.char('Type', size=64, + required=True, translate=True), } -crm_phonecall_type() -class crm_phonecall_action(osv.osv): +class CrmPhonecallAction(orm.Model): _name = "crm.phonecall.action" _description = "Phonecall Next Action" _columns = { - 'name': fields.char('Next Action', size=64, required=True, translate=True), + 'name': fields.char('Next Action', size=64, + required=True, translate=True), } -crm_phonecall_action() -class crm_phonecall(osv.osv): +class CrmPhonecall(orm.Model): _inherit = 'crm.phonecall' _columns = { 'claim_id': fields.many2one('crm.claim', 'Claim'), - 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot', select=True), - 'partner_address_id': fields.many2one('res.partner.address', 'Partner Address', \ - domain="[('partner_id','=',partner_id)]"), - 'partner_contact': fields.many2one('res.partner.contact', 'Contact'), + 'prodlot_id': fields.many2one('stock.production.lot', + 'Production Lot', select=True), 'type_id': fields.many2one('crm.phonecall.type', 'Type of Call'), 'result_id': fields.many2one('crm.phonecall.result', 'Result of Call'), 'action_id': fields.many2one('crm.phonecall.action', 'Next Action'), } - + def create_claim(self, cr, uid, ids, context=None): - claim_obj = self.pool.get('crm.claim') - data_obj = self.pool.get('ir.model.data') + claim_obj = self.pool['crm.claim'] + data_obj = self.pool['ir.model.data'] for phone in self.browse(cr, uid, ids, context=context): claim_id = claim_obj.create(cr, uid, { - 'name': phone.name, - 'date': datetime.now(), - 'user_id': phone.user_id.id, - 'section_id': phone.section_id.id, - 'partner_id': phone.partner_id.id, - 'partner_address_id': phone.partner_address_id.id, - 'email_from': phone.partner_address_id.email, - 'partner_phone': phone.partner_address_id.phone, - 'partner_mobile': phone.partner_address_id.mobile, - 'ref': phone.prodlot_id and ('stock.production.lot,' + str(phone.prodlot_id.id)) or '' - }, context=context) - self.write(cr, uid, [phone.id], {'claim_id': claim_id}, context=context) - data_id = data_obj._get_id(cr, uid, 'crm_claim', 'crm_case_claims_form_view') + 'name': phone.name, + 'date': datetime.now(), + 'user_id': phone.user_id.id, + 'section_id': phone.section_id.id, + 'partner_id': phone.partner_id.id, + 'email_from': phone.partner_id.email, + 'partner_phone': phone.partner_id.phone or phone.partner_phone, + 'ref': phone.prodlot_id and ('stock.production.lot,' + + str(phone.prodlot_id.id)) or '' + }, context=context) + self.write(cr, uid, [phone.id], + {'claim_id': claim_id}, context=context) + data_id = data_obj._get_id(cr, uid, + 'crm_claim', + 'crm_case_claims_form_view') view_id1 = False if data_id: - view_id1 = data_obj.browse(cr, uid, data_id, context=context).res_id + view_id1 = data_obj.browse(cr, + uid, + data_id, + context=context).res_id value = { - 'name': _('Claim'), - 'view_type': 'form', - 'view_mode': 'form,tree', - 'res_model': 'crm.claim', - 'view_id': False, - 'context': context, - 'views': [(view_id1, 'form')], - 'type': 'ir.actions.act_window', - 'nodestroy': True, - 'res_id': int(claim_id), - } + 'name': _('Claim'), + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'crm.claim', + 'view_id': False, + 'context': context, + 'views': [(view_id1, 'form')], + 'type': 'ir.actions.act_window', + 'nodestroy': True, + 'res_id': int(claim_id), + } return value def create(self, cr, uid, vals, context=None): if not vals.get('duration', None) and vals.get('date', None): - delta = datetime.now() - datetime.strptime(vals.get('date'), '%Y-%m-%d %H:%M:%S') + delta = datetime.now() - datetime.strptime(vals.get('date'), + '%Y-%m-%d %H:%M:%S') vals['duration'] = delta.total_seconds()/60 - return super(crm_phonecall, self).create(cr, uid, vals, context=context) - -crm_phonecall() - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - + return super(CrmPhonecall, self).create(cr, uid, vals, context=context) === added directory 'crm_extended/views' === renamed file 'crm_extended/crm_extended_view.xml' => 'crm_extended/views/crm_phonecall_view.xml' --- crm_extended/crm_extended_view.xml 2014-06-11 10:23:47 +0000 +++ crm_extended/views/crm_phonecall_view.xml 2014-06-12 16:23:53 +0000 @@ -1,78 +1,30 @@ <?xml version="1.0"?> <openerp> <data> - - <record model="ir.ui.view" id="crm.crm_case_inbound_phone_form_view"> - <field name="arch" type="xml"> - <form string="Phone Call"> - <group colspan="4" col="7"> - <field name="name" required="1"/> - <field name="duration" widget="float_time"/> - <label string=" " colspan="2"/> - <button string="Schedule a Meeting" - name="action_make_meeting" - icon="gtk-redo" - type="object" /> - <field name="date" required="1"/> - <field name="user_id"/> - <field name="section_id" colspan="1" widget="selection" /> - <button string="Convert to Opportunity" - name="%(crm.phonecall2opportunity_act)d" - icon="gtk-index" type="action" - attrs="{'invisible':[('opportunity_id','!=',False)]}" /> - <label colspan="6" string=""/> - <button string="Schedule Other Call" - icon="terp-call-start" - name="%(crm.phonecall_to_phonecall_act)d" - type="action" /> - <field name="type_id"/> - <field name="result_id"/> - <field name="claim_id"/> - <button string="Create Claim" icon="gtk-convert" - name="create_claim" type="object" - attrs="{'invisible':[('claim_id','!=',False)]}" /> - <field name="action_id"/> - <field name="prodlot_id"/> - </group> - <group col="3" colspan="2"> - <separator colspan="3" string="Contacts" /> - <field name="partner_id" - on_change="onchange_partner_id(partner_id, email_from)" /> - <button string="Create a Partner" - icon="terp-partner" - name="%(crm.action_crm_phonecall2partner)d" - type="action" - attrs="{'invisible':[('partner_id','!=',False)]}" - groups="base.group_partner_manager" /> - <newline/> - <field name="partner_address_id" - on_change="onchange_partner_address_id(partner_address_id, email_from)" /> - <newline/> - <field name="partner_contact"/> - <newline/> - <field name="partner_mobile" /> - <newline/> - <field name="partner_phone" /> - </group> - <group col="2" colspan="2"> - <separator colspan="2" string="Categorization" /> - <field name="categ_id" widget="selection" - domain="[('object_id.model', '=', 'crm.phonecall')]" - string="Type" /> - <field name="priority"/> - <field name="opportunity_id"/> - </group> - <separator string="Description" colspan="4" /> - <field name="description" nolabel="1" colspan="4" /> - <separator colspan="4" /> - </form> - </field> - </record> + <record model="ir.ui.view" id="crm_case_phone_form_view"> + <field name="name">crm.phonecall.form</field> + <field name="model">crm.phonecall</field> + <field name="inherit_id" ref="crm.crm_case_phone_form_view"/> + <field name="arch" type="xml"> + <xpath expr="//button[@name='action_make_meeting']" position="after"> + <button class="oe_inline oe_stat_button" + name="create_claim" + type="object" + icon="fa-plus-square fa-fw" + attrs="{'invisible':[('claim_id','!=',False)]}"> + <div>Create<br/>Claim</div> + </button> + </xpath> + <field name="opportunity_id" position="after"> + <field name="claim_id"/> + <field name="prodlot_id"/> + </field> + </field> + </record> <record id="view_crm_phonecall_claim_tree" model="ir.ui.view"> <field name="name">Claim from Phonecall</field> <field name="model">crm.phonecall</field> - <field name="type">form</field> <field name="inherit_id" ref="crm.crm_case_inbound_phone_tree_view" /> <field name="arch" type="xml"> <xpath expr="//button[@string='Convert to Opportunity']" position="after"> @@ -81,33 +33,15 @@ attrs="{'invisible':[('claim_id','!=',False)]}"/> </xpath> <field name="partner_phone" position="before"> - <field name="partner_contact"/> <field name="prodlot_id"/> <field name="claim_id" invisible="1"/> </field> </field> </record> - - <record id="view_crm_phonecall_claim_search" model="ir.ui.view"> - <field name="name">Phonecall Search Inherited</field> - <field name="model">crm.phonecall</field> - <field name="type">form</field> - <field name="inherit_id" ref="crm.view_crm_case_phonecalls_filter" /> - <field name="arch" type="xml"> - <xpath expr="//filter[@string='Partner']" position="after"> - <filter string="Contact" icon="terp-partner" domain="[]" - context="{'group_by':'partner_address_id'}" /> - </xpath> - <field name="partner_id" position="after"> - <field name="partner_address_id" /> - </field> - </field> - </record> <record id="crm_phonecall_result-view" model="ir.ui.view"> <field name="name">crm.phonecall.result.form</field> <field name="model">crm.phonecall.result</field> - <field name="type">form</field> <field name="arch" type="xml"> <form string="Phonecall Result"> <separator string=" " colspan="4"/> @@ -119,7 +53,6 @@ <record id="crm_phonecall_result_tree-view" model="ir.ui.view"> <field name="name">crm.phonecall.result.tree</field> <field name="model">crm.phonecall.result</field> - <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Phonecall Result"> <field name="name"/> @@ -136,13 +69,12 @@ <menuitem action="crm_phonecall_result_act" id="menu_crm_phonecall_result_act" sequence="10" - groups="base.group_extended" + groups="base.group_no_one" parent="crm.menu_crm_config_phonecall" /> <record id="crm_phonecall_action-view" model="ir.ui.view"> <field name="name">crm.phonecall.action.form</field> <field name="model">crm.phonecall.action</field> - <field name="type">form</field> <field name="arch" type="xml"> <form string="Phonecall Action"> <separator string=" " colspan="4"/> @@ -154,7 +86,6 @@ <record id="crm_phonecall_action_tree-view" model="ir.ui.view"> <field name="name">crm.phonecall.action.tree</field> <field name="model">crm.phonecall.action</field> - <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Phonecall Action"> <field name="name"/> @@ -171,7 +102,7 @@ <menuitem action="crm_phonecall_action_act" id="menu_crm_phonecall_action_act" sequence="11" - groups="base.group_extended" + groups="base.group_no_one" parent="crm.menu_crm_config_phonecall" /> <record id="crm_phonecall_type-view" model="ir.ui.view"> @@ -206,7 +137,7 @@ <menuitem action="crm_phonecall_type_act" id="menu_crm_phonecall_type_act" sequence="15" - groups="base.group_extended" + groups="base.group_no_one" parent="crm.menu_crm_config_phonecall" /> </data> === modified file 'dos_fix_min_stock_rules/__init__.py' --- dos_fix_min_stock_rules/__init__.py 2014-06-11 10:23:47 +0000 +++ dos_fix_min_stock_rules/__init__.py 2014-06-12 16:23:53 +0000 @@ -19,6 +19,4 @@ # ############################################################################## -import wizard - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +from . import wizard === modified file 'dos_fix_min_stock_rules/__openerp__.py' --- dos_fix_min_stock_rules/__openerp__.py 2014-06-11 10:23:47 +0000 +++ dos_fix_min_stock_rules/__openerp__.py 2014-06-12 16:23:53 +0000 @@ -21,19 +21,24 @@ { - "name" : "DOS Fix Min Stock Rules", - "version" : "1.0", - "author" : "DOS", - "category" : "Production,Sale,Stock", - "website" : "www.dos-sl.es", - "description": "This module allows you to set minimum stock rules for the manufacture of packs in function of the sales of a period.", - "depends" : ["sale", "stock", "product", "procurement"], - "init_xml" : [], - "update_xml" : [ - 'wizard/fix_min_stock_rules_view.xml', - ], + "name": "DOS Fix Min Stock Rules", + "version": "1.0", + "author": "DOS", + "category": "Production,Sale,Stock", + "website": "www.dos-sl.es", + "description": """ + This module allows you to set minimum stock rules for the manufacture + of packs in function of the sales of a period. + """, + "depends": [ + "sale", + "stock", + "product", + "procurement" + ], + "data": [ + 'wizard/fix_min_stock_rules_view.xml', + ], "active": False, "installable": True } - - === modified file 'dos_fix_min_stock_rules/wizard/__init__.py' --- dos_fix_min_stock_rules/wizard/__init__.py 2014-06-11 10:23:47 +0000 +++ dos_fix_min_stock_rules/wizard/__init__.py 2014-06-12 16:23:53 +0000 @@ -19,8 +19,4 @@ # ############################################################################## -import fix_min_stock_rules - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - - +from . import fix_min_stock_rules === modified file 'dos_fix_min_stock_rules/wizard/fix_min_stock_rules.py' --- dos_fix_min_stock_rules/wizard/fix_min_stock_rules.py 2014-06-11 10:23:47 +0000 +++ dos_fix_min_stock_rules/wizard/fix_min_stock_rules.py 2014-06-12 16:23:53 +0000 @@ -20,135 +20,147 @@ ############################################################################## import time -from osv import osv, fields +from openerp.osv import orm, fields from datetime import datetime from dateutil.relativedelta import relativedelta -from tools.translate import _ - -class fix_min_stock_rules_wizard(osv.osv_memory): - - _name = 'fix.min.stock.rules.wizard' - _description = 'Fix Min Stock Rules' - - def _get_date_start(self, cr, uid, context=None): - if context is None: - context = {} - date_ref = datetime.now().strftime('%Y-%m-%d') - first_date = (datetime.strptime(date_ref, '%Y-%m-%d') - relativedelta(month=2)) - return first_date.strftime('%Y-%m-%d') - - _columns = { - 'date_start': fields.date('Date start', required=True), - 'date_end': fields.date('Date end', required=True), - 'adjust_min_qty': fields.integer('Adjust Min Quantity', required=True, help="Adjustment on the Min Quantity. "\ - "When the virtual stock goes belong the Min Quantity, OpenERP generates "\ - "a procurement to bring the virtual stock to the Max Quantity."), - 'percentege_max_qty': fields.integer('Percentage Max Quantity (%)', required=True, help="Percentage adjustment on the Max Quantity. "\ - "When the virtual stock goes belong the Max Quantity, OpenERP generates "\ - "a procurement to bring the virtual stock to the Max Quantity."), - } - - """ - 'product_min_qty': fields.integer('Min Quantity', required=True, help="When the virtual stock goes belong the Min Quantity, OpenERP generates "\ - "a procurement to bring the virtual stock to the Max Quantity."), - 'adjust_max_qty': fields.integer('Adjust Max Quantity', required=True, help="Adjustment on the Max Quantity. "\ - "When the virtual stock goes belong the Max Quantity, OpenERP generates "\ - "a procurement to bring the virtual stock to the Max Quantity."), - """ - - _defaults = { - 'date_start': _get_date_start, - 'date_end': time.strftime('%Y-%m-%d'), - } - - - def calculate_product_sales(self, cr, uid, product_id, date_start, date_end): - - total = 0 - - sql = "SELECT COALESCE(sum(product_uom_qty), 0) / 2 As total_sales " - sql += "FROM sale_order s " - sql += "INNER JOIN sale_order_line l ON s.id=l.order_id " - sql += "WHERE s.date_order >= '" + date_start + "' AND s.date_order <= '" + date_end + "' " - sql += "AND l.state IN ('confirmed', 'done') " - sql += "AND l.pack_product_id=" + str(product_id)+ " " - - cr.execute(sql) - - result = cr.dictfetchall() - - for res in result: - total += res['total_sales'] - - return total - - - def calculate_min_stock_rules(self, cr, uid, ids, context=None): - if context is None: - context = {} - - data = self.browse(cr, uid, ids)[0] - product_obj = self.pool.get('product.product') - stock_warehouse_obj = self.pool.get('stock.warehouse') - stock_warehouse_orderpoint_obj = self.pool.get('stock.warehouse.orderpoint') - - #Comprobamos que hay al menos un almacen definido - #Obtenemos Ubicacion Stock - location_id = None - stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, []) - - for warehouse in stock_warehouse_obj.browse(cr, uid, stock_warehouse_ids, context): - location_id = warehouse.lot_stock_id and warehouse.lot_stock_id.id or None - break - - #Validaciones - if not location_id: - raise osv.except_osv(_('Location of stock not defined !'), _('Not set a location of stock in the stock warehouse by default.')) - - if data.percentege_max_qty < 0 or data.percentege_max_qty > 100: - raise osv.except_osv(_('Incorrect percentage !'), _('The maximum quantity percentage must be between 0 and 100.')) - - - #Obtenemos todos los productos cuyo metodo suministro sea Producir (Pack) - product_ids = product_obj.search(cr, uid, [('supply_method', '=', 'produce')]) - for product in product_obj.browse(cr, uid, product_ids, context=context): - - total_product_sales = self.calculate_product_sales(cr, uid, product.id, data.date_start, data.date_end) - product_min_qty = total_product_sales + data.adjust_min_qty - product_max_qty = round(product_min_qty + (product_min_qty * data.percentege_max_qty / 100), 0) - - if product_min_qty > product_max_qty: - product_max_qty = product_min_qty - - stock_warehouse_orderpoint_ids = stock_warehouse_orderpoint_obj.search(cr, uid, [('product_id', '=', product.id), ('location_id', '=', location_id)]) - - if stock_warehouse_orderpoint_ids: - #Existe regla stock mínimo - stock_warehouse_orderpoint_id = stock_warehouse_orderpoint_ids[0] - - #Modificamos regla de stock mínimo con los nuevos valores - stock_warehouse_orderpoint_obj.write(cr, uid, [stock_warehouse_orderpoint_id], { - 'product_max_qty': product_max_qty, - 'product_min_qty': product_min_qty, - }) - - else: - #Si no existe regla de stock mínimo, la creamos - vals = {} - - vals['location_id'] = location_id - vals['logic'] = 'max' - vals['product_id'] = product.id - vals['product_max_qty'] = product_max_qty - vals['product_min_qty'] = product_min_qty - vals['product_uom'] = 1 - vals['qty_multiple'] = 1 - vals['warehouse_id'] = 1 - - stock_warehouse_orderpoint_obj.create(cr, uid, vals, context=context) - - return {'type': 'ir.actions.act_window_close',} - -fix_min_stock_rules_wizard() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +from openerp.tools.translate import _ + + +class FixMinStockRulesWizard(orm.TransientModel): + + _name = 'fix.min.stock.rules.wizard' + _description = 'Fix Min Stock Rules' + + def _get_date_start(self, cr, uid, context=None): + if context is None: + context = {} + date_ref = datetime.now().strftime('%Y-%m-%d') + first_date = (datetime.strptime(date_ref, + '%Y-%m-%d') - relativedelta(month=2)) + return first_date.strftime('%Y-%m-%d') + + _columns = { + 'date_start': fields.date('Date start', required=True), + 'date_end': fields.date('Date end', required=True), + 'adjust_min_qty': + fields.integer('Adjust Min Quantity', required=True, + help="Adjustment on the Min Quantity. When the virtual " + "stock goes belong the Min Quantity, penERP generates " + "a procurement to bring the virtual stock to the Max " + "Quantity."), + 'percentege_max_qty': + fields.integer('Percentage Max Quantity (%)', required=True, + help="Percentage adjustment on the Max Quantity. When " + "the virtual stock goes belong the Max Quantity, " + "OpenERP generates a procurement to bring the virtual " + "stock to the Max Quantity."), + } + + _defaults = { + 'date_start': _get_date_start, + 'date_end': time.strftime('%Y-%m-%d'), + } + + def calculate_product_sales(self, cr, uid, product_id, + date_start, date_end): + total = 0 + + sql = "SELECT COALESCE(sum(product_uom_qty), 0) / 2 As total_sales " + sql += "FROM sale_order s " + sql += "INNER JOIN sale_order_line l ON s.id=l.order_id " + sql += "WHERE s.date_order >= '" + date_start + "' " + sql += "AND s.date_order <= '" + date_end + "' " + sql += "AND l.state IN ('confirmed', 'done') " + sql += "AND l.pack_product_id=" + str(product_id) + " " + + cr.execute(sql) + + result = cr.dictfetchall() + + for res in result: + total += res['total_sales'] + + return total + + def calculate_min_stock_rules(self, cr, uid, ids, context=None): + if context is None: + context = {} + + data = self.browse(cr, uid, ids)[0] + product_obj = self.pool['product.product'] + warehouse_obj = self.pool['stock.warehouse'] + orderpoint_obj = self.pool['stock.warehouse.orderpoint'] + + #Comprobamos que hay al menos un almacen definido + #Obtenemos Ubicacion Stock + location_id = None + warehouse_ids = warehouse_obj.search(cr, uid, []) + + for warehouse in warehouse_obj.browse(cr, uid, warehouse_ids, context): + location_id = (warehouse.lot_stock_id and + warehouse.lot_stock_id.id) or None + break + + #Validaciones + if not location_id: + raise orm.except_orm(_('Location of stock not defined !'), + _('Not set a location of stock in the stock ' + 'warehouse by default.')) + + if data.percentege_max_qty < 0 or data.percentege_max_qty > 100: + raise orm.except_orm(_('Incorrect percentage !'), + _('The maximum quantity percentage must be ' + 'between 0 and 100.')) + + #Obtenemos los productos cuyo metodo suministro sea Producir (Pack) + product_ids = product_obj.search(cr, uid, + [('supply_method', '=', 'produce')], + context=context) + for product in product_obj.browse(cr, uid, product_ids, + context=context): + total_product_sales = self.calculate_product_sales(cr, uid, + product.id, + data.date_start, + data.date_end) + product_min_qty = total_product_sales + data.adjust_min_qty + product_max_qty = round(product_min_qty + + (product_min_qty * + data.percentege_max_qty / 100), 0) + + if product_min_qty > product_max_qty: + product_max_qty = product_min_qty + + orderpoint_ids = orderpoint_obj.search(cr, uid, + [('product_id', '=', + product.id), + ('location_id', '=', + location_id)]) + + if orderpoint_ids: + #Existe regla stock mínimo + orderpoint_id = orderpoint_ids[0] + + #Modificamos regla de stock mínimo con los nuevos valores + orderpoint_obj.write(cr, uid, + [orderpoint_id], + {'product_max_qty': product_max_qty, + 'product_min_qty': product_min_qty, + }) + + else: + #Si no existe regla de stock mínimo, la creamos + vals = { + 'localtion_id': location_id, + 'logic': 'max', + 'product_id': product.id, + 'product_max_qty': product_max_qty, + 'product_min_qty': product_min_qty, + 'product_uom': 1, + 'qty_multiple': 1, + 'warehouse_id': 1, + } + + orderpoint_obj.create(cr, uid, vals, + context=context) + + return {'type': 'ir.actions.act_window_close'} === modified file 'dos_fix_min_stock_rules/wizard/fix_min_stock_rules_view.xml' --- dos_fix_min_stock_rules/wizard/fix_min_stock_rules_view.xml 2014-06-11 10:23:47 +0000 +++ dos_fix_min_stock_rules/wizard/fix_min_stock_rules_view.xml 2014-06-12 16:23:53 +0000 @@ -2,41 +2,48 @@ <openerp> <data> - <record id="fix_min_stock_rules_wizard_view" model="ir.ui.view"> - <field name="name">Fix Min Stock Rules</field> - <field name="model">fix.min.stock.rules.wizard</field> - <field name="type">form</field> - <field name="arch" type="xml"> - <form string="Fix Min Stock Rules"> - <newline/> - <label colspan="4" width="220" string="Calculate the minimum stock rules packs (mix model-operators) in terms of sales over a set period:"/> - <separator colspan="4"/> - <group colspan="4" col="4"> - <field name="date_start"/> - <field name="date_end"/> - <field name="adjust_min_qty"/> - <field name="percentege_max_qty"/> - </group> - <separator colspan="4"/> - <group colspan="4" col="4"> - <button special="cancel" string="Cancel" icon="gtk-cancel"/> - <button name="calculate_min_stock_rules" string="Calculate" type="object" icon="gtk-ok"/> - </group> - </form> - </field> - </record> + <record id="fix_min_stock_rules_wizard_view" model="ir.ui.view"> + <field name="name">Fix Min Stock Rules</field> + <field name="model">fix.min.stock.rules.wizard</field> + <field name="arch" type="xml"> + <form string="Fix Min Stock Rules"> + <newline/> + <label colspan="4" width="220" + string="Calculate the minimum stock rules packs + (mix model-operators) in terms of sales over a set + period:"/> + <separator colspan="4"/> + <group colspan="4" col="4"> + <field name="date_start"/> + <field name="date_end"/> + <field name="adjust_min_qty"/> + <field name="percentege_max_qty"/> + </group> + <separator colspan="4"/> + <group colspan="4" col="4"> + <button special="cancel" string="Cancel" icon="gtk-cancel"/> + <button name="calculate_min_stock_rules" + string="Calculate" type="object" + icon="gtk-ok"/> + </group> + </form> + </field> + </record> - <record id="action_fix_min_stock_rules_wizard" model="ir.actions.act_window"> - <field name="name">Fix Min Stock Rules Wizard</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">fix.min.stock.rules.wizard</field> - <field name="view_type">form</field> - <field name="view_mode">form</field> - <field name="view_id" ref="fix_min_stock_rules_wizard_view"/> - <field name="target">new</field> - </record> - - <menuitem name="Fix Min Stock Rules" id="menu_fix_min_stock_rules" parent="procurement.menu_stock_sched" action="action_fix_min_stock_rules_wizard" sequence="40"/> + <record id="action_fix_min_stock_rules_wizard" + model="ir.actions.act_window"> + <field name="name">Fix Min Stock Rules Wizard</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">fix.min.stock.rules.wizard</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="view_id" ref="fix_min_stock_rules_wizard_view"/> + <field name="target">new</field> + </record> + + <menuitem name="Fix Min Stock Rules" id="menu_fix_min_stock_rules" + parent="stock.menu_stock_sched" + action="action_fix_min_stock_rules_wizard" sequence="40"/> </data> </openerp> \ No newline at end of file
-- Mailing list: https://launchpad.net/~avanzosc Post to : [email protected] Unsubscribe : https://launchpad.net/~avanzosc More help : https://help.launchpad.net/ListHelp

