Merge branch 'master-multi-branch' into 'master'

[IMP]: Feature: New Branch Configuration and Setup

See merge request flectra-hq/flectra!25
This commit is contained in:
Parthiv Patel 2018-02-12 11:47:42 +00:00
commit a5fa03a1be
11 changed files with 213 additions and 11 deletions

View File

@ -102,7 +102,7 @@ class account_abstract_payment(models.AbstractModel):
class account_register_payments(models.TransientModel):
_name = "account.register.payments"
_inherit = 'account.abstract.payment'
_inherit = ['account.abstract.payment']
_description = "Register payments on multiple invoices"
invoice_ids = fields.Many2many('account.invoice', string='Invoices', copy=False)
@ -240,7 +240,7 @@ class account_register_payments(models.TransientModel):
class account_payment(models.Model):
_name = "account.payment"
_inherit = ['mail.thread', 'account.abstract.payment', 'ir.branch.company.mixin']
_inherit = ['mail.thread', 'account.abstract.payment']
_description = "Payments"
_order = "payment_date desc, name desc"
@ -269,6 +269,15 @@ class account_payment(models.Model):
else:
self.payment_difference = self._compute_total_invoices_amount() - self.amount
@api.depends('journal_id')
def _compute_branch(self):
for payment in self:
if payment.journal_id:
payment.branch_id = \
payment.journal_id.branch_id
company_id = fields.Many2one(store=True)
name = fields.Char(readonly=True, copy=False, default="Draft Payment") # The name is attributed upon post()
state = fields.Selection([('draft', 'Draft'), ('posted', 'Posted'), ('sent', 'Sent'), ('reconciled', 'Reconciled'), ('cancelled', 'Cancelled')], readonly=True, default='draft', copy=False, string="Status")
@ -297,6 +306,8 @@ class account_payment(models.Model):
# FIXME: ondelete='restrict' not working (eg. cancel a bank statement reconciliation with a payment)
move_line_ids = fields.One2many('account.move.line', 'payment_id', readonly=True, copy=False, ondelete='restrict')
move_reconciled = fields.Boolean(compute="_get_move_reconciled", readonly=True)
branch_id = fields.Many2one('res.branch', 'Branch',
compute='_compute_branch', readonly=True, store=True)
def open_payment_matching_screen(self):
# Open reconciliation view for customers/suppliers
@ -461,7 +472,6 @@ class account_payment(models.Model):
If the payment is a transfer, a second journal entry is created in the destination journal to receive money from the transfer account.
"""
for rec in self:
if rec.state != 'draft':
raise UserError(_("Only a draft payment can be posted."))
@ -524,9 +534,7 @@ class account_payment(models.Model):
#if all the invoices selected share the same currency, record the paiement in that currency too
invoice_currency = self.invoice_ids[0].currency_id
debit, credit, amount_currency, currency_id = aml_obj.with_context(date=self.payment_date).compute_amount_fields(amount, self.currency_id, self.company_id.currency_id, invoice_currency)
move = self.env['account.move'].create(self._get_move_vals())
#Write line corresponding to invoice payment
counterpart_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, move.id, False)
counterpart_aml_dict.update(self._get_counterpart_move_line_vals(self.invoice_ids))
@ -598,6 +606,7 @@ class account_payment(models.Model):
dst_liquidity_aml_dict.update({
'name': _('Transfer from %s') % self.journal_id.name,
'account_id': self.destination_journal_id.default_credit_account_id.id,
'branch_id': self.destination_journal_id.branch_id.id or False,
'currency_id': self.destination_journal_id.currency_id.id,
'journal_id': self.destination_journal_id.id})
aml_obj.create(dst_liquidity_aml_dict)
@ -606,6 +615,7 @@ class account_payment(models.Model):
transfer_debit_aml_dict.update({
'name': self.name,
'account_id': self.company_id.transfer_account_id.id,
'branch_id': self.journal_id.branch_id.id or False,
'journal_id': self.destination_journal_id.id})
if self.currency_id != self.company_id.currency_id:
transfer_debit_aml_dict.update({
@ -667,9 +677,14 @@ class account_payment(models.Model):
if inv.move_id:
name += inv.number + ', '
name = name[:len(name)-2]
if len(invoice) == 1:
branch_id = invoice.branch_id.id or False
else:
branch_id = self.branch_id.id or False
return {
'name': name,
'account_id': self.destination_account_id.id,
'branch_id': branch_id,
'journal_id': self.journal_id.id,
'currency_id': self.currency_id != self.company_id.currency_id and self.currency_id.id or False,
}
@ -693,5 +708,5 @@ class account_payment(models.Model):
'amount_currency': amount_currency,
'currency_id': self.journal_id.currency_id.id,
})
vals['branch_id'] = self.journal_id.branch_id.id or False
return vals

View File

@ -7,15 +7,26 @@ class TestPaymentsBranch(test_account_branch.TestAccountBranch):
def test_payment_branch(self):
self.invoice_id = self.model_account_invoice.sudo(self.user_id.id).create(
self.invoice_values(self.branch_2.id))
self.invoice_values(self.branch_1.id))
self.invoice_id.sudo(self.user_id.id).action_invoice_open()
self.journal_model = self.env['account.journal']
self.account_model = self.env['account.account']
self.company = self.env.ref('base.main_company')
user_type = self.env.ref('account.data_account_type_liquidity')
self.cash1_account_id = self.account_model.create(
{'name': 'Cash 1 - Test', 'code': 'test_cash_1',
'user_type_id': user_type.id, 'company_id': self.company.id, })
self.cash_journal_1 = self.journal_model.create(
{'name': 'Cash Journal 1 - Test', 'code': 'test_cash_1',
'type': 'cash', 'company_id': self.company.id,
'default_debit_account_id': self.cash1_account_id.id,
'default_credit_account_id': self.cash1_account_id.id,
'branch_id': self.branch_1.id})
context = {'active_ids': [self.invoice_id.id], 'active_model': 'account.invoice'}
create_payments = self.env['account.register.payments'].sudo(self.user_id.id).with_context(context).create({
'payment_method_id': self.env.ref("account.account_payment_method_manual_in").id,
'journal_id': self.cash_journal.id,
'journal_id': self.cash_journal_1.id,
'payment_date': time.strftime('%Y') + '-12-17',
})
create_payments.create_payments()
payment = self.env['account.payment'].sudo(self.user_2.id).search([('branch_id', '=', self.branch_2.id)])

View File

@ -10,6 +10,7 @@
<field name="payment_date"/>
<field name="name"/>
<field name="journal_id"/>
<field name="branch_id" groups="base_branch_company.group_multi_branch"/>
<field name="payment_method_id"/>
<field name="partner_id" string="Customer"/>
<field name="amount" sum="Amount"/>
@ -29,6 +30,7 @@
<field name="payment_date"/>
<field name="name"/>
<field name="journal_id"/>
<field name="branch_id" groups="base_branch_company.group_multi_branch"/>
<field name="payment_method_id"/>
<field name="partner_id" string="Vendor"/>
<field name="amount" sum="Amount"/>
@ -152,6 +154,7 @@
<field name="currency_id" options="{'no_create': True, 'no_open': True}" groups="base.group_multi_currency" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
</div>
<field name="journal_id" widget="selection" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="branch_id" groups="base_branch_company.group_multi_branch"/>
<field name="destination_journal_id" widget="selection" attrs="{'required': [('payment_type', '=', 'transfer')], 'invisible': [('payment_type', '!=', 'transfer')], 'readonly': [('state', '!=', 'draft')]}"/>
<field name="hide_payment_method" invisible="1"/>
<field name="payment_method_id" string=" " widget="radio" attrs="{'invisible': [('hide_payment_method', '=', True)], 'readonly': [('state', '!=', 'draft')]}"/>

View File

@ -284,6 +284,9 @@
</group>
<group>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="branch_id" options="{'no_create': True}"
groups="base_branch_company.group_multi_branch"
attrs="{'invisible':[('type','not in', ['bank', 'cash'])]}"/>
</group>
</group>
<notebook>

View File

@ -2,3 +2,4 @@
# Part of flectra. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizard

View File

@ -24,9 +24,11 @@ Main Features
'depends': ['base'],
'data': [
'demo/branch_data.xml',
'wizard/branch_config_view.xml',
'security/branch_security.xml',
'security/ir.model.access.csv',
'views/res_branch_view.xml',
'views/res_branch_config_view.xml',
],
'demo': [
'demo/branch_demo.xml',

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.base.setup</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="100"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block">
<h2>Multi-Branch</h2>
<div class="row mt16 o_settings_container" id="emails">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label string="Branches"/>
<div class="text-muted">
Configure your Branch
</div>
<div class="content-group">
<div class="mt16">
<button name="%(action_view_branch_config)d" string="Branch Configuration" type="action" class="oe_link" groups="base.group_no_one" icon="fa-arrow-right"/>
</div>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
from . import branch_config

View File

@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, models, fields
class BarnchConfiguration(models.TransientModel):
_name = 'branch.config'
name = fields.Char(string='Name', required=True)
code = fields.Char(string='Code', required=True)
branch_id = fields.Many2one('res.branch', 'Branch')
company_id = fields.Many2one('res.company', string="Company",
default=lambda self: self.env.user.company_id, required=True)
partner_id = fields.Many2one('res.partner', string='Partner')
street = fields.Char()
street2 = fields.Char()
zip = fields.Char(change_default=True)
city = fields.Char()
state_id = fields.Many2one("res.country.state", string='State',
ondelete='restrict')
country_id = fields.Many2one('res.country', string='Country',
ondelete='restrict')
email = fields.Char()
phone = fields.Char()
mobile = fields.Char()
state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirm')],
default='draft')
user_ids = fields.Many2many('res.users', 'res_users_branch_rel',
'user_id', 'branch_id', 'Allowed Branch for users',
domain="[('company_id','=',company_id)]")
default_user_ids = fields.Many2many('res.users', 'res_users_branch_default_rel',
'user_id', 'branch_id', 'Default Branch for users',
domain="[('company_id','=',company_id)]")
@api.multi
def branch_config(self):
s_ids = self.search_read([('id', '=', self.id)], [])[0]
branch = self.env['res.branch'].create({
'name': s_ids['name'],
'code': s_ids['code'],
'street': s_ids['street'],
'street2': s_ids['street2'],
'zip': s_ids['zip'],
'city': s_ids['city'],
'state_id': s_ids['state_id'] and s_ids['state_id'][0],
'country_id': s_ids['country_id'] and s_ids['country_id'][0],
'email': s_ids['email'],
'phone': s_ids['phone'],
'company_id': s_ids['company_id'] and s_ids['company_id'][0],
'mobile': s_ids['mobile'],
})
self.write({'state': 'confirm',
'partner_id': branch.partner_id.id,
'branch_id': branch.id})
view_id = self.env.ref(
'base_branch_company.view_branch_config')
context = dict(self._context)
return {'views': [(view_id.id, 'form')], 'view_id': view_id.id,
'type': 'ir.actions.act_window', 'view_type': 'form',
'view_mode': 'form', 'res_model': 'branch.config',
'target': 'new', 'res_id': self.id, 'context': context, }
@api.multi
def finish_branch_config(self):
for user_id in self.user_ids:
user_id.write({'branch_ids': [(4, self.branch_id.id)]})
for user_id in self.user_ids:
user_id.write({'default_branch_id': self.branch_id.id})

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_branch_config" model="ir.ui.view">
<field name="name">Branch Configuration</field>
<field name="model">branch.config</field>
<field name="arch" type="xml">
<form string="Branch Configuration">
<group col="4" attrs="{'invisible': [('state', '!=', 'draft')]}">
<field name="name"/>
<field name="code"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state" invisible="1"/>
</group>
<group attrs="{'invisible': [('state', '=', 'draft')]}">
<field name="branch_id" readonly="1"/>
<!--<field name="partner_id" invisible="1"/>-->
</group>
<group col="4" attrs="{'invisible': [('state', '=', 'draft')]}">
<field name="user_ids" widget="many2many_tags"/>
<field name="default_user_ids" widget="many2many_tags"/>
</group>
<group attrs="{'invisible': [('state', '!=', 'draft')]}">
<group>
<label for="street" string="Address"/>
<div class="o_address_format">
<field name="street" placeholder="Street..." class="o_address_street"/>
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
<field name="city" placeholder="City" class="o_address_city"/>
<field name="state_id" class="o_address_state" placeholder="State" options='{"no_open": True}'
context="{'country_id': country_id, 'zip': zip}"/>
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
</div>
</group>
<group>
<field name="phone" widget="phone"/>
<field name="mobile" widget="phone"/>
<field name="email" widget="email" context="{'gravatar_image': True}"/>
</group>
</group>
<footer>
<button string='Next' name="branch_config" attrs="{'invisible': [('state', '!=', 'draft')]}" type="object" class="btn-primary"/>
<button string='Finish' name="finish_branch_config" attrs="{'invisible': [('state', '=', 'draft')]}" type="object" class="btn-primary"/>
<button string="Cancel" class="btn-default" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_view_branch_config" model="ir.actions.act_window">
<field name="name">Branch Configuration</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">branch.config</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</flectra>

View File

@ -63,6 +63,7 @@
<field name="team_type" groups="base.group_no_one"/>
<field name="user_id" domain="[('share', '=', False)]"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="branch_id" options="{'no_create': True}" groups="base_branch_company.group_multi_branch"/>
</group>
<group name="right">
</group>