Master purchase indent

This commit is contained in:
Haresh Chavda 2018-01-29 11:35:08 +00:00 committed by Parthiv Patel
parent 1d4dae4cb4
commit 887dec3ed5
17 changed files with 165 additions and 79 deletions

View File

@ -5,4 +5,3 @@
from . import res_branch from . import res_branch
from . import ir_branch_company from . import ir_branch_company
from . import res_partner from . import res_partner

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from flectra import api, fields, models from flectra import api, fields, models
# from flectra.exceptions import ValidationError
class Company(models.Model): class Company(models.Model):
@ -22,6 +23,7 @@ class Company(models.Model):
'company_id': company.id}) 'company_id': company.id})
return company return company
class ResBranch(models.Model): class ResBranch(models.Model):
_name = "res.branch" _name = "res.branch"
@ -45,7 +47,8 @@ class ResBranch(models.Model):
phone = fields.Char() phone = fields.Char()
mobile = fields.Char() mobile = fields.Char()
_sql_constraints = [('branch_code_company_uniq', 'unique (code,company_id)', _sql_constraints = [('branch_code_company_uniq',
'unique (code,company_id)',
'The branch code must be unique per company!')] 'The branch code must be unique per company!')]
@api.model @api.model
@ -109,13 +112,23 @@ class Users(models.Model):
default=_get_branch, default=_get_branch,
domain="[('company_id','=',company_id)" domain="[('company_id','=',company_id)"
"]") "]")
branches_count = fields.Integer(compute='_compute_branches_count', branches_count = fields.Integer(
string="Number of Companies", compute='_compute_branches_count',
default=_branches_count) string="Number of Companies", default=_branches_count)
# To do : Check with all base module test cases
# @api.multi
# @api.constrains('default_branch_id', 'branch_ids')
# def _check_branches(self):
# for user in self:
# if user.branch_ids \
# and user.default_branch_id not in user.branch_ids:
# raise ValidationError(_('The selected Default Branch (%s) '
# 'is not in the Branches!') % (
# user.default_branch_id.name))
@api.multi @api.multi
def _compute_branches_count(self): def _compute_branches_count(self):
branches_count = self._branches_count() branches_count = self._branches_count()
for user in self: for user in self:
user.branches_count = branches_count user.branches_count = branches_count

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from flectra import api, fields, models from flectra import api, models
class Partner(models.Model): class Partner(models.Model):
_name = "res.partner" _name = "res.partner"
@ -17,6 +18,3 @@ class Partner(models.Model):
self.branch_id.with_context(ctx).write(branch_vals) self.branch_id.with_context(ctx).write(branch_vals)
result = super(Partner, self).write(vals) result = super(Partner, self).write(vals)
return result return result

View File

@ -5,6 +5,7 @@ from flectra.tests.common import TransactionCase
import logging import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class TestMultiBranch(TransactionCase): class TestMultiBranch(TransactionCase):
def setUp(self): def setUp(self):
super(TestMultiBranch, self).setUp() super(TestMultiBranch, self).setUp()
@ -14,10 +15,11 @@ class TestMultiBranch(TransactionCase):
self.branch0 = self.env.ref('base_branch_company.data_branch_1') self.branch0 = self.env.ref('base_branch_company.data_branch_1')
self.branch1 = self.env.ref('base_branch_company.data_branch_2') self.branch1 = self.env.ref('base_branch_company.data_branch_2')
self.user_1 = self.create_user(self.main_company, 'user_1', self.branch0, self.user_1 = self.create_user(
[self.branch0, self.branch1]) self.main_company, 'user_1', self.branch0,
self.user_2 = self.create_user(self.main_company, 'user_2', self.branch1, [self.branch0, self.branch1])
[self.branch1]) self.user_2 = self.create_user(
self.main_company, 'user_2', self.branch1, [self.branch1])
self.model_id = \ self.model_id = \
self.env['ir.model'].search([('model', '=', 'res.partner')]) self.env['ir.model'].search([('model', '=', 'res.partner')])
@ -45,7 +47,7 @@ class TestMultiBranch(TransactionCase):
def create_user(self, main_company, user_name, branch_id, branch_ids): def create_user(self, main_company, user_name, branch_id, branch_ids):
data = { data = {
'company_ids': [(4, main_company.id)], 'company_ids': [(4, main_company.id)],
'branch_ids': [(4, branch_id.id) for branch_id in branch_ids], 'branch_ids': [(4, branch.id) for branch in branch_ids],
'company_id': main_company.id, 'company_id': main_company.id,
'default_branch_id': branch_id.id, 'default_branch_id': branch_id.id,
'login': user_name, 'login': user_name,
@ -57,24 +59,17 @@ class TestMultiBranch(TransactionCase):
user_obj = self.env['res.users'].create(data) user_obj = self.env['res.users'].create(data)
return user_obj return user_obj
def test_user_authentication(self): def test_user_authentication(self):
partner = self.partner_obj.sudo(self.user_1.id).search( partner = self.partner_obj.sudo(self.user_1.id).search(
[('id', '=', self.branch_partner1.id), [('id', '=', self.branch_partner1.id),
('branch_id', '=', self.branch0.id)]) ('branch_id', '=', self.branch0.id)])
self.assertNotEqual(partner.ids, [], 'Test User have access to ' self.assertNotEqual(partner.ids, [],
'Branch %s' % self.branch0.name) 'Test User have access to Branch %s' %
self.branch0.name)
partner = self.partner_obj.sudo(self.user_2.id).search( partner = self.partner_obj.sudo(self.user_2.id).search(
[('id', '=', self.branch_partner0.id), [('id', '=', self.branch_partner0.id),
('branch_id', '=', self.branch0.id)]) ('branch_id', '=', self.branch0.id)])
self.assertEqual(partner.ids, [], self.assertEqual(partner.ids, [],
'Test User should not have access to ' 'Test User should not have access to Branch %s' %
'Branch %s' % self.branch0.name) self.branch0.name)

View File

@ -90,7 +90,7 @@
<xpath expr="//page[@name='access_rights']/group[1]" position="after"> <xpath expr="//page[@name='access_rights']/group[1]" position="after">
<group groups="base_branch_company.group_multi_branch"> <group groups="base_branch_company.group_multi_branch">
<group string="Allowed Branches" attrs="{'invisible': [('branches_count', '&lt;=', 1)]}"> <group string="Allowed Branches" attrs="{'invisible': [('branches_count', '&lt;=', 1)]}">
<field name="default_branch_id"/> <field name="default_branch_id" required="1"/>
<field name="branch_ids" widget="many2many_tags"/> <field name="branch_ids" widget="many2many_tags"/>
<field string="Branches count" name="branches_count" invisible="1"/> <field string="Branches count" name="branches_count" invisible="1"/>
</group> </group>

View File

@ -70,7 +70,11 @@ class PurchaseOrder(models.Model):
def _default_picking_type(self): def _default_picking_type(self):
type_obj = self.env['stock.picking.type'] type_obj = self.env['stock.picking.type']
company_id = self.env.context.get('company_id') or self.env.user.company_id.id company_id = self.env.context.get('company_id') or self.env.user.company_id.id
types = type_obj.search([('code', '=', 'incoming'), ('warehouse_id.company_id', '=', company_id)]) branch_id = self.env.context.get(
'branch_id') or self.env.user.default_branch_id.id
types = type_obj.search([('code', '=', 'incoming'),
('warehouse_id.company_id', '=', company_id),
('warehouse_id.branch_id', '=', branch_id)])
if not types: if not types:
types = type_obj.search([('code', '=', 'incoming'), ('warehouse_id', '=', False)]) types = type_obj.search([('code', '=', 'incoming'), ('warehouse_id', '=', False)])
return types[:1] return types[:1]

View File

@ -15,6 +15,7 @@
<field name="product_qty">2</field> <field name="product_qty">2</field>
<field name="remaining_qty">2.0</field> <field name="remaining_qty">2.0</field>
<field name="company_id" ref="base.main_company"/> <field name="company_id" ref="base.main_company"/>
<field name="branch_id" ref="base_branch_company.data_branch_2"/>
</record> </record>
<function model="purchase.indent" name="action_confirm" <function model="purchase.indent" name="action_confirm"

View File

@ -204,7 +204,7 @@ msgid "Group By"
msgstr "" msgstr ""
#. module: purchase_indent #. module: purchase_indent
#: model:ir.model.fields,field_description:purchase_indent.field_purchase_indent_intend_history_ids #: model:ir.model.fields,field_description:purchase_indent.field_purchase_indent_indent_history_ids
#: model:ir.ui.view,arch_db:purchase_indent.view_purchase_indent_form #: model:ir.ui.view,arch_db:purchase_indent.view_purchase_indent_form
msgid "History" msgid "History"
msgstr "" msgstr ""

View File

@ -2,7 +2,7 @@
from datetime import datetime from datetime import datetime
from flectra.exceptions import Warning, AccessError from flectra.exceptions import Warning, AccessError, ValidationError
from flectra.tools.misc import formatLang from flectra.tools.misc import formatLang
import flectra.addons.decimal_precision as dp import flectra.addons.decimal_precision as dp
@ -167,6 +167,7 @@ class PurchaseRequisition(models.Model):
purchase_indent_ids = fields.Many2many( purchase_indent_ids = fields.Many2many(
'purchase.indent', string='Purchase Indent') 'purchase.indent', string='Purchase Indent')
branch_id = fields.Many2one('res.branch', string="Branch")
@api.multi @api.multi
def action_draft(self): def action_draft(self):
@ -205,18 +206,21 @@ class PurchaseRequisitionLine(models.Model):
'purchase.indent.line', 'Purchase Indent Line Ref') 'purchase.indent.line', 'Purchase Indent Line Ref')
purchase_indent_ids = fields.Many2many( purchase_indent_ids = fields.Many2many(
'purchase.indent', string='Purchase Indent') 'purchase.indent', string='Purchase Indent')
branch_id = fields.Many2one(related='requisition_id.branch_id',
string='Branch', store=True)
class PurchaseIndent(models.Model): class PurchaseIndent(models.Model):
_name = 'purchase.indent' _name = 'purchase.indent'
_inherit = ['mail.thread', 'mail.activity.mixin'] _inherit = ['mail.thread', 'mail.activity.mixin',
'ir.branch.company.mixin']
_description = "Purchase Indent" _description = "Purchase Indent"
@api.multi @api.multi
def _compute_order_count(self): def _compute_order_count(self):
po_list = [] po_list = []
pa_list = [] pa_list = []
for history_id in self.intend_history_ids: for history_id in self.indent_history_ids:
if history_id.order_id: if history_id.order_id:
po_list.append(history_id.order_id.id) po_list.append(history_id.order_id.id)
elif history_id.purchase_requisition_id: elif history_id.purchase_requisition_id:
@ -260,7 +264,7 @@ class PurchaseIndent(models.Model):
partner_id = fields.Many2one( partner_id = fields.Many2one(
'res.partner', related='user_id.partner_id', 'res.partner', related='user_id.partner_id',
string="Partner", track_visibility='onchange') string="Partner", track_visibility='onchange')
intend_history_ids = fields.One2many( indent_history_ids = fields.One2many(
'purchase.indent.history', 'purchase_indent_id', 'History') 'purchase.indent.history', 'purchase_indent_id', 'History')
purchase_order_count = fields.Integer( purchase_order_count = fields.Integer(
compute='_compute_order_count', string='# of Purchase Order') compute='_compute_order_count', string='# of Purchase Order')
@ -280,20 +284,34 @@ class PurchaseIndent(models.Model):
help="Technical field used to display the Drop Ship Address", help="Technical field used to display the Drop Ship Address",
readonly=True) readonly=True)
@api.constrains('company_id', 'branch_id')
def _check_company(self):
for order in self:
if order.branch_id \
and order.company_id != order.branch_id.company_id:
raise ValidationError(
_('Configuration Error of Company:\n'
'The Purchase Indent Company (%s) and '
'the Company (%s) of Branch must '
'be the same company!') % (
order.company_id.name,
order.branch_id.company_id.name)
)
@api.multi @api.multi
def set_qty_state_cancel(self, purchase_order_id=False, def set_qty_state_cancel(self, purchase_order_id=False,
purchase_agreement_id=False): purchase_agreement_id=False):
intend_history_ids = [] indent_history_ids = []
indent_line_obj = self.env['purchase.indent.line'] indent_line_obj = self.env['purchase.indent.line']
if purchase_order_id: if purchase_order_id:
intend_history_ids = self.env['purchase.indent.history'].search([ indent_history_ids = self.env['purchase.indent.history'].search([
('order_id', '=', purchase_order_id.id), ('order_id', '=', purchase_order_id.id),
('purchase_requisition_id', '=', False)]) ('purchase_requisition_id', '=', False)])
elif purchase_agreement_id: elif purchase_agreement_id:
intend_history_ids = self.env['purchase.indent.history'].search([ indent_history_ids = self.env['purchase.indent.history'].search([
('order_id', '=', False), ('order_id', '=', False),
('purchase_requisition_id', '=', purchase_agreement_id.id)]) ('purchase_requisition_id', '=', purchase_agreement_id.id)])
for history_id in intend_history_ids: for history_id in indent_history_ids:
indent_line_id = indent_line_obj.sudo().search([ indent_line_id = indent_line_obj.sudo().search([
('product_id', '=', history_id.product_id.id), ('product_id', '=', history_id.product_id.id),
('purchase_indent_id', '=', history_id.purchase_indent_id.id)]) ('purchase_indent_id', '=', history_id.purchase_indent_id.id)])
@ -307,16 +325,16 @@ class PurchaseIndent(models.Model):
def set_qty_state_confirm(self, purchase_order_id=False, def set_qty_state_confirm(self, purchase_order_id=False,
purchase_agreement_id=False): purchase_agreement_id=False):
indent_line_obj = self.env['purchase.indent.line'] indent_line_obj = self.env['purchase.indent.line']
intend_history_ids = [] indent_history_ids = []
if purchase_order_id: if purchase_order_id:
intend_history_ids = self.env['purchase.indent.history'].search([ indent_history_ids = self.env['purchase.indent.history'].search([
('order_id', '=', purchase_order_id.id), ('order_id', '=', purchase_order_id.id),
('state', '=', 'Cancelled')]) ('state', '=', 'Cancelled')])
elif purchase_agreement_id: elif purchase_agreement_id:
intend_history_ids = self.env['purchase.indent.history'].search([ indent_history_ids = self.env['purchase.indent.history'].search([
('purchase_requisition_id', '=', purchase_agreement_id.id), ('purchase_requisition_id', '=', purchase_agreement_id.id),
('state', '=', 'Cancelled')]) ('state', '=', 'Cancelled')])
for history_id in intend_history_ids: for history_id in indent_history_ids:
indent_line_id = indent_line_obj.sudo().search([ indent_line_id = indent_line_obj.sudo().search([
('product_id', '=', history_id.product_id.id), ('product_id', '=', history_id.product_id.id),
('purchase_indent_id', '=', history_id.purchase_indent_id.id)]) ('purchase_indent_id', '=', history_id.purchase_indent_id.id)])
@ -442,7 +460,7 @@ class PurchaseIndent(models.Model):
@api.multi @api.multi
def get_purchase_order_list(self): def get_purchase_order_list(self):
order_list = [ order_list = [
history_id.order_id.id for history_id in self.intend_history_ids] history_id.order_id.id for history_id in self.indent_history_ids]
return { return {
'name': 'Purchase Orders', 'name': 'Purchase Orders',
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
@ -455,7 +473,7 @@ class PurchaseIndent(models.Model):
@api.multi @api.multi
def get_purchase_agreement_list(self): def get_purchase_agreement_list(self):
pr_list = [history_id.purchase_requisition_id.id pr_list = [history_id.purchase_requisition_id.id
for history_id in self.intend_history_ids] for history_id in self.indent_history_ids]
return { return {
'name': 'Purchase Agreements', 'name': 'Purchase Agreements',
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
@ -528,6 +546,8 @@ class PurchaseIndentLine(models.Model):
company_id = fields.Many2one( company_id = fields.Many2one(
'res.company', related='purchase_indent_id.company_id', 'res.company', related='purchase_indent_id.company_id',
string='Company', store=True, readonly=True) string='Company', store=True, readonly=True)
branch_id = fields.Many2one(related='purchase_indent_id.branch_id',
string='Branch', store=True)
requisition_qty = fields.Float( requisition_qty = fields.Float(
string="Requisition Quantity", string="Requisition Quantity",
digits=dp.get_precision('Discount')) digits=dp.get_precision('Discount'))
@ -599,6 +619,10 @@ class PurchaseIndentHistory(models.Model):
self_id.product_qty - self_id.requisition_qty self_id.product_qty - self_id.requisition_qty
purchase_indent_id = fields.Many2one('purchase.indent', 'Purchase Indent') purchase_indent_id = fields.Many2one('purchase.indent', 'Purchase Indent')
branch_id = fields.Many2one(related='purchase_indent_id.branch_id',
string='Branch', store=True)
company_id = fields.Many2one(related='purchase_indent_id.company_id',
string="Company", store=True)
product_id = fields.Many2one( product_id = fields.Many2one(
'product.product', string='Product', 'product.product', string='Product',
domain=[('purchase_ok', '=', True)], domain=[('purchase_ok', '=', True)],

View File

@ -54,6 +54,10 @@
<strong>Category:</strong> <strong>Category:</strong>
<p t-field="o.category_id.name"/> <p t-field="o.category_id.name"/>
</div> </div>
<div t-if="o.branch_id" class="col-xs-3">
<strong>Branch:</strong>
<p t-field="o.branch_id.name"/>
</div>
</div> </div>
<table width="100%" class="table table-striped table-bordered" <table width="100%" class="table table-striped table-bordered"
border="1"> border="1">

View File

@ -20,4 +20,26 @@
</field> </field>
</record> </record>
<!-- Multi Branch -->
<record model="ir.rule" id="purchase_indent_multi_branch_rule">
<field name="name">Purchase Indent multi-branch</field>
<field name="model_id" ref="model_purchase_indent"/>
<field name="global" eval="True"/>
<field name="domain_force">
['|', ('branch_id', '=', False), '|', ('branch_id', '=', user.default_branch_id.id),
('branch_id', 'in', user.branch_ids.ids)]
</field>
</record>
<record model="ir.rule" id="purchase_indent_line_multi_branch_rule">
<field name="name">Purchase Indent Line multi-branch</field>
<field name="model_id" ref="model_purchase_indent_line"/>
<field name="global" eval="True"/>
<field name="domain_force">
['|', ('branch_id', '=', False), '|', ('branch_id', '=', user.default_branch_id.id),
('branch_id', 'in', user.branch_ids.ids)]
</field>
</record>
</flectra> </flectra>

View File

@ -2,11 +2,9 @@
import logging import logging
from datetime import datetime from datetime import datetime
from flectra.exceptions import Warning from flectra.exceptions import Warning
from flectra.tests.common import TransactionCase from flectra.tests.common import TransactionCase
from flectra.tools.misc import formatLang from flectra.tools.misc import formatLang
from flectra import _ from flectra import _
@ -17,22 +15,30 @@ class TestPurchaseIndent(TransactionCase):
self.PurchaseIndent = self.env['purchase.indent'] self.PurchaseIndent = self.env['purchase.indent']
self.PurchaseIndentLine = self.env['purchase.indent.line'] self.PurchaseIndentLine = self.env['purchase.indent.line']
self.Requisition_Req = self.env['wiz.requisition.request'] self.Requisition_Req = self.env['wiz.requisition.request']
self.company_id = self.env.ref('base.main_company')
def test_00_purchase_indent_flow(self): self.branch_id = self.env.ref('base_branch_company.data_branch_2')
self.partner_id = self.env.ref('base.res_partner_address_12') self.partner_id = self.env.ref('base.res_partner_address_12')
self.category_id = self.env.ref('product.product_category_5') self.category_id = self.env.ref('product.product_category_5')
self.product_id_1 = self.env.ref('product.product_product_24') self.product_id_1 = self.env.ref('product.product_product_24')
self.product_id_2 = self.env.ref('product.product_product_16') self.product_id_2 = self.env.ref('product.product_product_16')
self.product_id_3 = self.env.ref('product.consu_delivery_03') self.product_id_3 = self.env.ref('product.consu_delivery_03')
self.company_id = self.env.ref('base.main_company')
self.agreement_type_id = \ self.agreement_type_id = \
self.env.ref('purchase_requisition.type_multi') self.env.ref('purchase_requisition.type_multi')
purchase_indent_vals_1 = { purchase_indent_vals = {
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'category_id': self.category_id.id, 'category_id': self.category_id.id,
'request_date': datetime.today(), 'request_date': datetime.today(),
'user_id': self.env.user.id, 'user_id': self.env.user.id,
'branch_id': self.branch_id.id
}
self.purchase_indent_id = \
self.PurchaseIndent.create(purchase_indent_vals)
self.purchase_indent_id_1 = self.purchase_indent_id.copy()
def test_00_purchase_indent_flow(self):
self.purchase_indent_id.write({
'indent_line': [ 'indent_line': [
(0, 0, { (0, 0, {
'name': self.product_id_1.name, 'name': self.product_id_1.name,
@ -46,13 +52,9 @@ class TestPurchaseIndent(TransactionCase):
'product_qty': 15.0, 'product_qty': 15.0,
'product_uom': self.product_id_2.uom_po_id.id, 'product_uom': self.product_id_2.uom_po_id.id,
})], })],
} })
purchase_indent_vals_2 = { self.purchase_indent_id_1.write({
'company_id': self.company_id.id,
'category_id': self.category_id.id,
'request_date': datetime.today(),
'user_id': self.env.user.id,
'indent_line': [ 'indent_line': [
(0, 0, { (0, 0, {
'name': self.product_id_3.name, 'name': self.product_id_3.name,
@ -72,31 +74,32 @@ class TestPurchaseIndent(TransactionCase):
'product_qty': 5.0, 'product_qty': 5.0,
'product_uom': self.product_id_2.uom_po_id.id, 'product_uom': self.product_id_2.uom_po_id.id,
})], })],
} })
self.pi = self.PurchaseIndent.create(purchase_indent_vals_1)
self.pi_1 = self.PurchaseIndent.create(purchase_indent_vals_2)
self.assertTrue(
self.pi, 'Purchase Indent: no purchase indent created')
self.assertTrue(
self.pi_1, 'Purchase Indent: no purchase indent created')
for line in self.pi.indent_line: self.assertTrue(
self.purchase_indent_id,
'Purchase Indent: no purchase indent created')
self.assertTrue(
self.purchase_indent_id_1,
'Purchase Indent: no purchase indent created')
for line in self.purchase_indent_id.indent_line:
if line.product_qty < 0: if line.product_qty < 0:
raise Warning(_("Quantity (%s) can not be Negative!") % ( raise Warning(_("Quantity (%s) can not be Negative!") % (
formatLang(self.env, line.product_qty, digits=2))) formatLang(self.env, line.product_qty, digits=2)))
for line in self.pi_1.indent_line: for line in self.purchase_indent_id_1.indent_line:
if line.product_qty < 0: if line.product_qty < 0:
raise Warning(_("Quantity (%s) can not be Negative!") % ( raise Warning(_("Quantity (%s) can not be Negative!") % (
formatLang(self.env, line.product_qty, digits=2))) formatLang(self.env, line.product_qty, digits=2)))
self.pi.action_confirm() self.purchase_indent_id.action_confirm()
self.pi_1.action_confirm() self.purchase_indent_id_1.action_confirm()
requisition_id = self.Requisition_Req.create({ requisition_id = self.Requisition_Req.create({
'category_id': self.category_id.id, 'category_id': self.category_id.id,
'order_type': 'po', 'order_type': 'po',
'purchase_indent_id': self.pi.id, 'purchase_indent_id': self.purchase_indent_id.id,
}) })
requisition_id.onchange_purchase_indent_id() requisition_id.onchange_purchase_indent_id()
requisition_id.dummy_wiz_indent_line[0].write({'requisition_qty': 5}) requisition_id.dummy_wiz_indent_line[0].write({'requisition_qty': 5})
@ -106,10 +109,15 @@ class TestPurchaseIndent(TransactionCase):
for line in requisition_id.wiz_indent_line: for line in requisition_id.wiz_indent_line:
line.write({'price_unit': 100}) line.write({'price_unit': 100})
requisition_id.action_create() requisition_id.action_create()
logging.info('Successful: Purchase Order Created!')
# Cancel Purchase Order
self.purchase_indent_id.indent_history_ids[0].order_id.button_cancel()
requisition_id_1 = self.Requisition_Req.create({ requisition_id_1 = self.Requisition_Req.create({
'category_id': self.category_id.id, 'category_id': self.category_id.id,
'order_type': 'pa', 'order_type': 'pa',
'purchase_indent_id': self.pi_1.id, 'purchase_indent_id': self.purchase_indent_id_1.id,
'requisition_type_id': self.agreement_type_id.id, 'requisition_type_id': self.agreement_type_id.id,
}) })
@ -120,4 +128,4 @@ class TestPurchaseIndent(TransactionCase):
for line in requisition_id_1.wiz_indent_line: for line in requisition_id_1.wiz_indent_line:
line.write({'price_unit': 100}) line.write({'price_unit': 100})
requisition_id_1.action_create() requisition_id_1.action_create()
logging.info('\n\nSuccessful: Purchase Agreement Created!') logging.info('Successful: Purchase Agreement Created!')

View File

@ -21,8 +21,14 @@
<field name="model">purchase.requisition</field> <field name="model">purchase.requisition</field>
<field name="inherit_id" ref="purchase_requisition.view_purchase_requisition_form"/> <field name="inherit_id" ref="purchase_requisition.view_purchase_requisition_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//button[@name='%(purchase_requisition.action_purchase_requisition_to_so)d']" position="replace">
<button name="%(purchase_requisition.action_purchase_requisition_to_so)d" type="action"
string="New Quotation" class="btn-primary" context="{'default_branch_id': branch_id}"
attrs="{'invisible': [('state', 'not in', ['in_progress', 'open'])]}"/>
</xpath>
<xpath expr="//field[@name='vendor_id']" position="after"> <xpath expr="//field[@name='vendor_id']" position="after">
<field name="purchase_indent_ids" widget="many2many_tags" readonly="1"/> <field name="purchase_indent_ids" widget="many2many_tags" readonly="1"/>
<field name='branch_id' readonly="1"/>
</xpath> </xpath>
<xpath expr="//notebook/page/field/tree/field[@name='product_qty']" position="after"> <xpath expr="//notebook/page/field/tree/field[@name='product_qty']" position="after">
<field name="purchase_indent_ids" widget="many2many_tags" readonly="1"/> <field name="purchase_indent_ids" widget="many2many_tags" readonly="1"/>
@ -41,6 +47,7 @@
<field name="request_date"/> <field name="request_date"/>
<field name="category_id"/> <field name="category_id"/>
<field name="company_id"/> <field name="company_id"/>
<field name="branch_id" groups="base_branch_company.group_multi_branch"/>
<field name="state"/> <field name="state"/>
</tree> </tree>
</field> </field>
@ -53,7 +60,7 @@
<form string="Purchase Indent"> <form string="Purchase Indent">
<header> <header>
<button name="action_confirm" states="draft" string="Confirm" type="object" class="oe_highlight"/> <button name="action_confirm" states="draft" string="Confirm" type="object" class="oe_highlight"/>
<button name="%(action_wiz_requisition_request)d" states="confirm,requisition" string="Create Requisition" type="action" context="{'default_purchase_indent_id': active_id, 'default_category_id': category_id}" class="oe_highlight" groups="base.group_system,purchase.group_purchase_manager"/> <button name="%(action_wiz_requisition_request)d" states="confirm,requisition" string="Create Requisition" type="action" context="{'default_purchase_indent_id': active_id, 'default_category_id': category_id, 'default_branch_id': branch_id}" class="oe_highlight" groups="base.group_system,purchase.group_purchase_manager"/>
<button name="action_cancel" states="confirm" string="Cancel" type="object"/> <button name="action_cancel" states="confirm" string="Cancel" type="object"/>
<button name="button_draft" states="cancel" string="Set to Draft" type="object"/> <button name="button_draft" states="cancel" string="Set to Draft" type="object"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,requisition,done" readonly="1"/> <field name="state" widget="statusbar" statusbar_visible="draft,confirm,requisition,done" readonly="1"/>
@ -73,8 +80,9 @@
<group col="4"> <group col="4">
<field name="category_id" options="{'no_create': True}" required="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/> <field name="category_id" options="{'no_create': True}" required="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="request_date" attrs="{'readonly': [('state', '!=', 'draft')]}"/> <field name="request_date" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="company_id" options="{'no_create': True}" attrs="{'readonly': [('state', '!=', 'draft')]}" required="1"/> <field name="company_id" options="{'no_create': True}" attrs="{'readonly': [('state', '!=', 'draft')]}" required="1"/>
<field name="user_id"/> <field name="user_id"/>
<field name="branch_id" groups="base_branch_company.group_multi_branch" options="{'no_create': True}" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="picking_type_id" domain="[('code','=','incoming')]" options="{'no_create': True}" groups="stock.group_stock_multi_locations"/> <field name="picking_type_id" domain="[('code','=','incoming')]" options="{'no_create': True}" groups="stock.group_stock_multi_locations"/>
<field name="dest_address_id" groups="stock.group_stock_multi_locations" attrs="{'invisible': [('default_location_dest_id_usage', '!=', 'customer')], 'required': [('default_location_dest_id_usage', '=', 'customer')]}"/> <field name="dest_address_id" groups="stock.group_stock_multi_locations" attrs="{'invisible': [('default_location_dest_id_usage', '!=', 'customer')], 'required': [('default_location_dest_id_usage', '=', 'customer')]}"/>
<field name="default_location_dest_id_usage" invisible="1"/> <field name="default_location_dest_id_usage" invisible="1"/>
@ -94,7 +102,7 @@
</field> </field>
</page> </page>
<page string="History"> <page string="History">
<field name="intend_history_ids" readonly="1"> <field name="indent_history_ids" readonly="1">
<tree editable="bottom"> <tree editable="bottom">
<field name="product_id"/> <field name="product_id"/>
<field name="state"/> <field name="state"/>
@ -127,6 +135,7 @@
<field name="name" string="Name" filter_domain="[('name','ilike',self)]"/> <field name="name" string="Name" filter_domain="[('name','ilike',self)]"/>
<field name="category_id" string="Category" filter_domain="[('category_id','ilike',self)]"/> <field name="category_id" string="Category" filter_domain="[('category_id','ilike',self)]"/>
<field name="user_id" string="Requestd By" filter_domain="[('user_id','ilike',self)]"/> <field name="user_id" string="Requestd By" filter_domain="[('user_id','ilike',self)]"/>
<field name="branch_id" string="Branch" filter_domain="[('branch_id','ilike',self)]"/>
<field name="state" string="State" filter_domain="[('state','ilike',self)]"/> <field name="state" string="State" filter_domain="[('state','ilike',self)]"/>
<filter name="draft" string="Draft" domain="[('state','=', 'draft')]"/> <filter name="draft" string="Draft" domain="[('state','=', 'draft')]"/>
<filter name="confirm" string="Confirm" domain="[('state','=','confirm')]"/> <filter name="confirm" string="Confirm" domain="[('state','=','confirm')]"/>
@ -135,6 +144,7 @@
<filter name="cancel" string="Cancel" domain="[('state', '=', 'cancel')]"/> <filter name="cancel" string="Cancel" domain="[('state', '=', 'cancel')]"/>
<group expand="0" string="Group By"> <group expand="0" string="Group By">
<filter string="Category" domain="[]" context="{'group_by':'category_id'}"/> <filter string="Category" domain="[]" context="{'group_by':'category_id'}"/>
<filter string="Branch" domain="[]" context="{'group_by':'branch_id'}"/>
<filter string="State" domain="[]" context="{'group_by':'state'}"/> <filter string="State" domain="[]" context="{'group_by':'state'}"/>
<filter string="Requestd By" domain="[]" context="{'group_by':'user_id'}"/> <filter string="Requestd By" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Request Date" domain="[]" context="{'group_by':'request_date'}"/> <filter string="Request Date" domain="[]" context="{'group_by':'request_date'}"/>

View File

@ -13,6 +13,7 @@ class WizRequisitionRequest(models.TransientModel):
_name = 'wiz.requisition.request' _name = 'wiz.requisition.request'
purchase_indent_id = fields.Many2one('purchase.indent', 'Purchase Indent') purchase_indent_id = fields.Many2one('purchase.indent', 'Purchase Indent')
branch_id = fields.Many2one('res.branch', string='Branch')
partner_id = fields.Many2one( partner_id = fields.Many2one(
'res.partner', 'Vendor', domain="[('supplier','=',True)]") 'res.partner', 'Vendor', domain="[('supplier','=',True)]")
wiz_indent_line = fields.One2many( wiz_indent_line = fields.One2many(
@ -47,6 +48,7 @@ class WizRequisitionRequest(models.TransientModel):
purchase_indent_ids = self.purchase_indent_id.search([ purchase_indent_ids = self.purchase_indent_id.search([
('category_id', '=', self.purchase_indent_id.category_id.id), ('category_id', '=', self.purchase_indent_id.category_id.id),
('state', 'in', ['confirm', 'requisition']), ('state', 'in', ['confirm', 'requisition']),
('branch_id', '=', self.purchase_indent_id.branch_id.id),
('company_id', '=', self.purchase_indent_id.company_id.id)]) ('company_id', '=', self.purchase_indent_id.company_id.id)])
list_data = [] list_data = []
value = {} value = {}
@ -179,14 +181,17 @@ class WizRequisitionRequest(models.TransientModel):
vals = { vals = {
'partner_id': self.partner_id.id, 'partner_id': self.partner_id.id,
'state': 'draft', 'state': 'draft',
'branch_id': self.branch_id.id,
'company_id': self.purchase_indent_id.company_id.id, 'company_id': self.purchase_indent_id.company_id.id,
} }
purchase_order_id = self.env['purchase.order'].create(vals) purchase_order_id = self.env['purchase.order'].with_context(
{'branch_id': self.branch_id.id}).create(vals)
else: else:
vals = { vals = {
'name': self.sudo().env['ir.sequence'].next_by_code( 'name': self.sudo().env['ir.sequence'].next_by_code(
'purchase.order.requisition') or 'New', 'purchase.order.requisition') or 'New',
'type_id': self.requisition_type_id.id, 'type_id': self.requisition_type_id.id,
'branch_id': self.branch_id.id,
'state': 'draft', 'state': 'draft',
'company_id': self.purchase_indent_id.company_id.id, 'company_id': self.purchase_indent_id.company_id.id,
} }
@ -199,6 +204,7 @@ class WizRequisitionRequest(models.TransientModel):
line_vals = { line_vals = {
'product_id': current_line.product_id.id, 'product_id': current_line.product_id.id,
'product_qty': current_line.product_qty, 'product_qty': current_line.product_qty,
'branch_id': self.branch_id.id,
'purchase_indent_ids': 'purchase_indent_ids':
[(6, 0, current_line.purchase_indent_ids.ids)], [(6, 0, current_line.purchase_indent_ids.ids)],
'purchase_indent_line_id': 'purchase_indent_line_id':
@ -271,6 +277,7 @@ class WizRequisitionRequest(models.TransientModel):
purchase_indent_ids = self.purchase_indent_id.search([ purchase_indent_ids = self.purchase_indent_id.search([
('category_id', '=', self.purchase_indent_id.category_id.id), ('category_id', '=', self.purchase_indent_id.category_id.id),
('state', 'in', ['confirm', 'requisition']), ('state', 'in', ['confirm', 'requisition']),
('branch_id', '=', self.purchase_indent_id.branch_id.id),
('company_id', '=', self.purchase_indent_id.company_id.id)]) ('company_id', '=', self.purchase_indent_id.company_id.id)])
for purchase_indent_id in purchase_indent_ids: for purchase_indent_id in purchase_indent_ids:
check = False check = False

View File

@ -18,6 +18,7 @@
<field name="requisition_type_id" <field name="requisition_type_id"
attrs="{'invisible': ['|', ('order_type', '!=', 'pa'), ('state', '=', 'confirm')], 'required': [('order_type', '=', 'pa')]}" attrs="{'invisible': ['|', ('order_type', '!=', 'pa'), ('state', '=', 'confirm')], 'required': [('order_type', '=', 'pa')]}"
widget="selection"/> widget="selection"/>
<field name="branch_id" invisible="1"/>
<field name="state" invisible="1"/> <field name="state" invisible="1"/>
</group> </group>
<group attrs="{'invisible': [('state', '!=', 'draft')]}"> <group attrs="{'invisible': [('state', '!=', 'draft')]}">

View File

@ -121,12 +121,12 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Purchase Agreements"> <form string="Purchase Agreements">
<header> <header>
<button name="%(action_purchase_requisition_to_so)d" type="action" <!--<button name="%(action_purchase_requisition_to_so)d" type="action"-->
string="New Quotation" <!--string="New Quotation"-->
attrs="{'invisible': [('state', '!=', 'open')]}"/> <!--attrs="{'invisible': [('state', '!=', 'open')]}"/>-->
<button name="%(action_purchase_requisition_to_so)d" type="action" <button name="%(action_purchase_requisition_to_so)d" type="action"
string="New Quotation" class="btn-primary" string="New Quotation" class="btn-primary"
attrs="{'invisible': [('state', '!=', 'in_progress')]}"/> attrs="{'invisible': [('state', 'not in', ['in_progress', 'open'])]}"/>
<button name="action_in_progress" states="draft" string="Confirm" type="object" class="btn-primary"/> <button name="action_in_progress" states="draft" string="Confirm" type="object" class="btn-primary"/>
<button name="action_open" states="in_progress" string="Validate" type="object" class="btn-primary"/> <button name="action_open" states="in_progress" string="Validate" type="object" class="btn-primary"/>
<button name="action_done" states="open" string="Done" type="object" class="btn-primary"/> <button name="action_done" states="open" string="Done" type="object" class="btn-primary"/>

View File

@ -198,7 +198,7 @@
<field name="code">NY</field> <field name="code">NY</field>
<field name="partner_id" ref="base.main_partner"/> <field name="partner_id" ref="base.main_partner"/>
<field name="company_id" ref="base.main_company"/> <field name="company_id" ref="base.main_company"/>
<field name="branch_id" ref="base_branch_company.data_branch_1"/> <field name="branch_id" ref="base_branch_company.data_branch_4"/>
</record> </record>
<!-- WA --> <!-- WA -->