avanzosc team mailing list archive
-
avanzosc team
-
Mailing list archive
-
Message #00450
Re: [Merge] lp:~oihanecruce/avanzosc/migrate2 into lp:~avanzosc-security-team/avanzosc/72horas
Review: Approve
Buenas, Oihane,
Está muy bien la migración del módulo crm_extended. Me ha gustado que quitaras la vista hardcodeada y que la pusieras por herencia con los cambios significativos. Sólo te he hecho tres comentarios in-line de lo mismo.
Añade por favor al sistema la tarea de migrar datos para este módulo.
Es mejor que cada módulo tenga su propio MP y discusión. Por eso, te pido que para el segundo módulo, crees un nuevo MP.
Un saludo.
Diff comments:
> === 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"
Mejor no poner directamente el grupo.
> 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"
Idem
> 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"
Idem
> 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
>
--
https://code.launchpad.net/~oihanecruce/avanzosc/migrate2/+merge/222971
Your team Avanzosc_security is subscribed to branch lp:~avanzosc-security-team/avanzosc/72horas.
References