diff --git a/mrp_production_project_estimated_cost/__openerp__.py b/mrp_production_project_estimated_cost/__openerp__.py index 87703d2cf..134022270 100644 --- a/mrp_production_project_estimated_cost/__openerp__.py +++ b/mrp_production_project_estimated_cost/__openerp__.py @@ -36,6 +36,7 @@ "mrp", "mrp_operations_extension", "mrp_project_link", + "product_variant_cost" ], "data": [ "data/analytic_journal_data.xml", diff --git a/mrp_production_project_estimated_cost/models/mrp_bom.py b/mrp_production_project_estimated_cost/models/mrp_bom.py index 3e55eca2d..6209cd794 100644 --- a/mrp_production_project_estimated_cost/models/mrp_bom.py +++ b/mrp_production_project_estimated_cost/models/mrp_bom.py @@ -24,7 +24,7 @@ class MrpBom(models.Model): _inherit = "mrp.bom" product_standard_price = fields.Float(string="Product Standard Price", - related="product_id.standard_price") + related="product_id.cost_price") product_manual_standard_price = fields.Float( string="Product Manual Standard Price", related="product_id.manual_standard_cost") diff --git a/mrp_production_project_estimated_cost/models/mrp_production.py b/mrp_production_project_estimated_cost/models/mrp_production.py index 733dd6d0e..d868a686b 100644 --- a/mrp_production_project_estimated_cost/models/mrp_production.py +++ b/mrp_production_project_estimated_cost/models/mrp_production.py @@ -63,7 +63,7 @@ class MrpProduction(models.Model): string="Product Manual Cost", related="product_id.manual_standard_cost") product_cost = fields.Float( - string="Product Cost", related="product_id.standard_price") + string="Product Cost", related="product_id.cost_price") analytic_line_ids = fields.One2many( comodel_name="account.analytic.line", inverse_name="mrp_production_id", string="Cost Lines") @@ -148,6 +148,39 @@ class MrpProduction(models.Model): 'context': self.env.context } + def _prepare_cost_analytic_line(self, journal, name, production, product, + general_account=None, workorder=None, + qty=1, amount=0, estim_std=0, estim_avg=0): + analytic_line_obj = self.env['account.analytic.line'] + property_obj = self.env['ir.property'] + if not general_account: + general_account = ( + product.property_account_income or + product.categ_id.property_account_income_categ or + property_obj.get('property_account_expense_categ', + 'product.category')) + if not self.analytic_account_id: + raise exceptions.Warning( + _('You must define one Analytic Account for this MO: %s') % + (production.name)) + vals = { + 'name': name, + 'mrp_production_id': production.id, + 'workorder': workorder and workorder.id or False, + 'account_id': self.analytic_account_id.id, + 'journal_id': journal.id, + 'user_id': self.env.uid, + 'date': analytic_line_obj._get_default_date(), + 'product_id': product and product.id or False, + 'unit_amount': qty, + 'amount': amount, + 'product_uom_id': product and product.uom_id.id or False, + 'general_account_id': general_account.id, + 'estim_std_cost': estim_std, + 'estim_avg_cost': estim_avg, + } + return vals + @api.multi def calculate_production_estimated_cost(self): analytic_line_obj = self.env['account.analytic.line'] @@ -161,9 +194,12 @@ class MrpProduction(models.Model): raise exceptions.Warning( _("One consume line has no product assigned.")) name = _('%s-%s' % (record.name, line.work_order.name or '')) - vals = record._prepare_estim_cost_analytic_line( - journal, name, record, line.work_order, line.product_id, - line.product_qty) + product = line.product_id + qty = line.product_qty + vals = record._prepare_cost_analytic_line( + journal, name, record, product, workorder=line.work_order, + qty=qty, estim_std=-(qty * product.manual_standard_cost), + estim_avg=-(qty * product.cost_price)) analytic_line_obj.create(vals) journal = record.env.ref('mrp_production_project_estimated_cost.' 'analytic_journal_machines', False) @@ -175,20 +211,26 @@ class MrpProduction(models.Model): if (wc.time_start and line.workcenter_id.pre_op_product): name = (_('%s-%s Pre-operation') % (record.name, line.workcenter_id.name)) - vals = record._prepare_estim_cost_analytic_line( - journal, name, record, line, - line.workcenter_id.pre_op_product, wc.time_start) - amount = line.workcenter_id.pre_op_product.standard_price - vals['amount'] = amount + product = line.workcenter_id.pre_op_product + amount = product.cost_price * wc.time_start + qty = wc.time_start + vals = record._prepare_cost_analytic_line( + journal, name, record, product, workorder=line, + qty=qty, amount=-amount, + estim_std=-(qty * product.manual_standard_cost), + estim_avg=-(amount)) analytic_line_obj.create(vals) if (wc.time_stop and line.workcenter_id.post_op_product): name = (_('%s-%s Post-operation') % (record.name, line.workcenter_id.name)) - vals = record._prepare_estim_cost_analytic_line( - journal, name, record, line, - line.workcenter_id.post_op_product, wc.time_stop) - amount = line.workcenter_id.post_op_product.standard_price - vals['amount'] = amount + product = line.workcenter_id.post_op_product + amount = product.cost_price * wc.time_stop + qty = wc.time_stop + vals = record._prepare_cost_analytic_line( + journal, name, record, product, workorder=line, + qty=qty, amount=-amount, + estim_std=-(qty * product.manual_standard_cost), + estim_avg=-(amount)) analytic_line_obj.create(vals) if line.cycle and line.workcenter_id.costs_cycle: if not line.workcenter_id.product_id: @@ -198,12 +240,12 @@ class MrpProduction(models.Model): name = (_('%s-%s-C-%s') % (record.name, line.routing_wc_line.operation.code, line.workcenter_id.name)) - vals = record._prepare_estim_cost_analytic_line( - journal, name, record, line, - line.workcenter_id.product_id, line.cycle) - cost = line.workcenter_id.costs_cycle - vals['estim_avg_cost'] = line.cycle * cost - vals['estim_std_cost'] = vals['estim_avg_cost'] + product = line.workcenter_id.product_id + estim_cost = -(line.workcenter_id.costs_cycle * line.cycle) + vals = record._prepare_cost_analytic_line( + journal, name, record, product, workorder=line, + qty=line.cycle, estim_std=estim_cost, + estim_avg=estim_cost) analytic_line_obj.create(vals) if line.hour and line.workcenter_id.costs_hour: if not line.workcenter_id.product_id: @@ -218,67 +260,38 @@ class MrpProduction(models.Model): hour += wc.time_stop if wc.time_start and not line.workcenter_id.pre_op_product: hour += wc.time_start - vals = record._prepare_estim_cost_analytic_line( - journal, name, record, line, - line.workcenter_id.product_id, hour) - cost = line.workcenter_id.costs_hour - vals['estim_avg_cost'] = hour * cost - vals['estim_std_cost'] = vals['estim_avg_cost'] + estim_cost = -(hour * line.workcenter_id.costs_hour) + vals = record._prepare_cost_analytic_line( + journal, name, record, line.workcenter_id.product_id, + workorder=line, qty=hour, + estim_std=estim_cost, estim_avg=estim_cost) analytic_line_obj.create(vals) if wc.op_number > 0 and line.hour: if not line.workcenter_id.product_id: raise exceptions.Warning( _("There is at least this workcenter without " "product: %s") % line.workcenter_id.name) - journal_wk = record.env.ref( + journal = record.env.ref( 'mrp_production_project_estimated_cost.analytic_' 'journal_operators', False) name = (_('%s-%s-%s') % (record.name, line.routing_wc_line.operation.code, line.workcenter_id.product_id.name)) - vals = record._prepare_estim_cost_analytic_line( - journal_wk, name, record, line, - line.workcenter_id.product_id, - line.hour * wc.op_number) - vals['estim_avg_cost'] = (wc.op_number * wc.op_avg_cost * - line.hour) - vals['estim_std_cost'] = vals['estim_avg_cost'] + estim_cost = -(wc.op_number * wc.op_avg_cost * line.hour) + qty = line.hour * wc.op_number + vals = record._prepare_cost_analytic_line( + journal, name, record, line.workcenter_id.product_id, + workorder=line, qty=qty, estim_std=estim_cost, + estim_avg=estim_cost) analytic_line_obj.create(vals) - def _prepare_estim_cost_analytic_line(self, journal, name, production, - workorder, product, qty): - analytic_line_obj = self.env['account.analytic.line'] - general_account = (product.property_account_income or - product.categ_id.property_account_income_categ or - False) - if not general_account: - raise exceptions.Warning( - _('You must define Income account in the product "%s", or in' - ' the product category') % (product.name)) - if not self.analytic_account_id: - raise exceptions.Warning( - _('You must define one Analytic Account for this MO: %s') % - (production.name)) - vals = { - 'name': name, - 'mrp_production_id': production.id, - 'workorder': workorder.id, - 'account_id': self.analytic_account_id.id, - 'journal_id': journal.id, - 'user_id': self._uid, - 'date': analytic_line_obj._get_default_date(), - 'product_id': product.id, - 'unit_amount': qty, - 'product_uom_id': product.uom_id.id, - 'general_account_id': general_account.id, - 'estim_std_cost': qty * product.manual_standard_cost, - 'estim_avg_cost': qty * product.standard_price, - } - return vals - @api.multi def load_product_std_price(self): for record in self: product = record.product_id if record.unit_std_cost: product.manual_standard_cost = record.unit_std_cost + + @api.multi + def _get_min_qty_for_production(self, routing=False): + return 1 diff --git a/mrp_production_project_estimated_cost/views/account_analytic_line_view.xml b/mrp_production_project_estimated_cost/views/account_analytic_line_view.xml index 95c9f7cd4..d658d458f 100644 --- a/mrp_production_project_estimated_cost/views/account_analytic_line_view.xml +++ b/mrp_production_project_estimated_cost/views/account_analytic_line_view.xml @@ -20,6 +20,9 @@ account.analytic.line + + + @@ -36,6 +39,7 @@ + @@ -49,5 +53,19 @@ + + Production Analytic Lines + ir.actions.act_window + account.analytic.line + form + tree,form + + {'default_mrp_production_id': active_id, + 'search_default_group_production': 1, + 'search_default_group_workorder': 1, + 'search_default_group_journal': 1} + [('mrp_production_id','=',active_id)] + + diff --git a/mrp_production_project_estimated_cost/views/mrp_production_view.xml b/mrp_production_project_estimated_cost/views/mrp_production_view.xml index 2ff2db9c2..214df2194 100644 --- a/mrp_production_project_estimated_cost/views/mrp_production_view.xml +++ b/mrp_production_project_estimated_cost/views/mrp_production_view.xml @@ -83,10 +83,16 @@
+
diff --git a/mrp_production_project_estimated_cost/wizard/wiz_create_fictitious_of.py b/mrp_production_project_estimated_cost/wizard/wiz_create_fictitious_of.py index 9d2811d8e..613c96d81 100644 --- a/mrp_production_project_estimated_cost/wizard/wiz_create_fictitious_of.py +++ b/mrp_production_project_estimated_cost/wizard/wiz_create_fictitious_of.py @@ -9,7 +9,7 @@ class WizCreateFictitiousOf(models.TransientModel): _name = "wiz.create.fictitious.of" date_planned = fields.Datetime( - string='Scheduled Date', required=True, default=fields.Datetime.now()) + string='Scheduled Date', required=True, default=fields.Datetime.now) load_on_product = fields.Boolean("Load cost on product") project_id = fields.Many2one("project.project", string="Project") @@ -17,6 +17,7 @@ class WizCreateFictitiousOf(models.TransientModel): def do_create_fictitious_of(self): production_obj = self.env['mrp.production'] product_obj = self.env['product.product'] + routing_obj = self.env['mrp.routing'] self.ensure_one() active_ids = self.env.context['active_ids'] active_model = self.env.context['active_model'] @@ -34,8 +35,21 @@ class WizCreateFictitiousOf(models.TransientModel): 'user_id': self._uid, 'active': False, 'product_uom': product.uom_id.id, - 'project_id': self.project_id.id + 'project_id': self.project_id.id, + 'analytic_account_id': ( + self.project_id.analytic_account_id.id) } + prod_vals = production_obj.product_id_change(product.id, + 1)['value'] + vals.update(prod_vals) + if 'routing_id' in vals: + routing = routing_obj.browse(vals['routing_id']) + product_qty = production_obj._get_min_qty_for_production( + routing) + vals['product_qty'] = product_qty + prod_vals = production_obj.product_id_change( + product.id, product_qty)['value'] + vals.update(prod_vals) new_production = production_obj.create(vals) new_production.action_compute() production_list.append(new_production.id)