Compare commits

..

2 Commits

Author SHA1 Message Date
David Beal
0ba12b8812 tmp 2016-12-20 16:31:55 +01:00
David Beal
c867b1d76f ADD module web_sheet_width_custom 2016-12-02 09:00:53 +01:00
187 changed files with 329 additions and 4929 deletions

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import account_analytic_analysis

View File

@@ -1,29 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Account Analytic Analysis Usability',
'version': '8.0.1.0.0',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'summary': 'Usability improvements on Account Analytic Analysis',
'description': """
Account Analytic Analysis Usability
===================================
Usability improvements include:
* add next invoice date in tree view of contrats (and add a group by)
This module has been written by Alexis de Lattre from Akretion
<alexis.delattre@akretion.com>.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['account_analytic_analysis'],
'data': [
'analytic_view.xml',
],
'installable': True,
}

View File

@@ -1,14 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields
class AccountAnalyticAccount(models.Model):
_inherit = "account.analytic.account"
recurring_next_date = fields.Date(track_visibility='onchange')
recurring_rule_type = fields.Selection(track_visibility='onchange')
recurring_interval = fields.Integer(track_visibility='onchange')
recurring_invoices = fields.Boolean(track_visibility='onchange')

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_account_analytic_account_tree_c2c_3" model="ir.ui.view">
<field name="name">usability.analytic_analysis.account.analytic.account.tree.contract</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id" ref="account_analytic_analysis.view_account_analytic_account_tree_c2c_3"/>
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/>
<field name="arch" type="xml">
<field name="date" position="after">
<field name="recurring_rule_type"/>
<field name="recurring_next_date"/>
</field>
</field>
</record>
<record id="view_account_analytic_account_overdue_search" model="ir.ui.view">
<field name="name">usability.analytic_analysis.account.analytic.account.search</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id" ref="account_analytic_analysis.view_account_analytic_account_overdue_search"/>
<field name="arch" type="xml">
<filter context="{'group_by' : 'pricelist_id'}" position="after">
<filter name="recurring_rule_type_groupby" string="Invoicing Frequency" context="{'group_by': 'recurring_rule_type'}"/>
<filter name="recurring_next_date_groupby" string="Next Invoice Date" context="{'group_by': 'recurring_next_date'}"/>
</filter>
<filter name="cancelled" position="after">
<separator/>
<filter name="recurring_invoices" string="Recurring Invoicing" domain="[('recurring_invoices', '=', True)]"/>
</filter>
</field>
</record>
</data>
</openerp>

View File

@@ -1,32 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_bank_statement_import_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-06 10:15+0000\n"
"PO-Revision-Date: 2017-11-06 10:15+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_bank_statement_import_usability
#: model:ir.model,name:account_bank_statement_import_usability.model_account_bank_statement
msgid "Bank Statement"
msgstr ""
#. module: account_bank_statement_import_usability
#: model:ir.model,name:account_bank_statement_import_usability.model_account_bank_statement_import
msgid "Import Bank Statement"
msgstr ""
#. module: account_bank_statement_import_usability
#: view:account.bank.statement:account_bank_statement_import_usability.view_bank_statement_tree
msgid "blue:state=='draft';black:state=='confirm'"
msgstr ""

View File

@@ -1,32 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_bank_statement_import_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-06 10:15+0000\n"
"PO-Revision-Date: 2017-11-06 10:15+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_bank_statement_import_usability
#: model:ir.model,name:account_bank_statement_import_usability.model_account_bank_statement
msgid "Bank Statement"
msgstr "Relevé Bancaire"
#. module: account_bank_statement_import_usability
#: model:ir.model,name:account_bank_statement_import_usability.model_account_bank_statement_import
msgid "Import Bank Statement"
msgstr "Importer Relevé Bancaire"
#. module: account_bank_statement_import_usability
#: view:account.bank.statement:account_bank_statement_import_usability.view_bank_statement_tree
msgid "blue:state=='draft';black:state=='confirm'"
msgstr "blue:state=='draft';black:state=='confirm'"

View File

@@ -28,10 +28,6 @@ class AccountInvoice(models.Model):
@api.multi @api.multi
def invoice_filename_to_match(self): def invoice_filename_to_match(self):
# I cannot use
# safe_eval(report.attachment, {'object': obj, 'time': time})
# Because, when this code is executed, the obj.state is not 'open'
# nor 'paid', so we can't get the filename that way
return 'INV%.pdf' return 'INV%.pdf'
@api.multi @api.multi

View File

@@ -34,6 +34,9 @@ Account Invoice Picking Label
Adds a function field named *picking_ids_label* on invoices. This field contains the list of pickings related to the invoice as a string. This field is designed to be displayed in the invoice report.""", Adds a function field named *picking_ids_label* on invoices. This field contains the list of pickings related to the invoice as a string. This field is designed to be displayed in the invoice report.""",
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com/', 'website': 'http://www.akretion.com/',
'depends': ['stock_picking_invoice_link'], 'depends': ['stock_account'],
'data': [],
'installable': True, 'installable': True,
'active': False,
} }

View File

@@ -36,10 +36,13 @@ class account_invoice(orm.Model):
pickings = self.pool['stock.picking'].read( pickings = self.pool['stock.picking'].read(
cr, uid, invoice['picking_ids'], ['name'], cr, uid, invoice['picking_ids'], ['name'],
context=context) context=context)
pick_names = [] first = True
for picking in pickings: for picking in pickings:
pick_names.append(picking['name']) if first:
label = ','.join(pick_names) label += picking['name']
first = False
else:
label += ', %s' % picking['name']
res[invoice['id']] = label res[invoice['id']] = label
return res return res

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import wizard

View File

@@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Account Invoice Update Wizard',
'version': '8.0.1.0.0',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
'description': """
Account Invoice Update Wizard
=============================
This module adds a button *Update Invoice* on Customer and Supplier invoices in Open or Paid state. This button starts a wizard which allows the user to update non-legal fields of the invoice:
* Source Document
* Reference/Description
* Payment terms (update allowed only to a payment term with same number of terms of the same amount and on invoices without any payment)
* Bank Account
* Salesman
* Notes
* Description of invoice lines
""",
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['account'],
'data': [
'wizard/account_invoice_update_view.xml',
'views/account_invoice.xml',
],
'installable': True,
}

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="invoice_supplier_form" model="ir.ui.view">
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml">
<button name="invoice_cancel" position="before">
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
</button>
</field>
</record>
<record id="invoice_form" model="ir.ui.view">
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<button name="invoice_cancel" position="before">
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
</button>
</field>
</record>
</data>
</openerp>

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import account_invoice_update

View File

@@ -1,206 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api, _
from openerp.exceptions import Warning as UserError
import openerp.addons.decimal_precision as dp
class AccountInvoiceUpdate(models.TransientModel):
_name = 'account.invoice.update'
_description = 'Wizard to update non-legal fields of invoice'
invoice_id = fields.Many2one(
'account.invoice', string='Invoice', required=True,
readonly=True)
type = fields.Selection(related='invoice_id.type', readonly=True)
company_id = fields.Many2one(
related='invoice_id.company_id', readonly=True)
commercial_partner_id = fields.Many2one(
related='invoice_id.commercial_partner_id', readonly=True)
user_id = fields.Many2one('res.users', string='Salesperson')
# I use the same field name as the original invoice field name
# even if it the name is "bad"
# Updating payment_term will not work if you use
# the OCA module account_constraints (you will just get an error)
payment_term = fields.Many2one(
'account.payment.term', string='Payment Terms')
reference = fields.Char(string='Invoice Reference')
name = fields.Char(string='Reference/Description')
origin = fields.Char(string='Source Document')
comment = fields.Text('Additional Information')
partner_bank_id = fields.Many2one(
'res.partner.bank', string='Bank Account')
line_ids = fields.One2many(
'account.invoice.line.update', 'parent_id', string='Invoice Lines')
@api.model
def _simple_fields2update(self):
'''List boolean, date, datetime, char, text fields'''
return ['reference', 'name', 'origin', 'comment']
@api.model
def _m2o_fields2update(self):
return ['payment_term', 'user_id', 'partner_bank_id']
@api.model
def _prepare_default_get(self, invoice):
res = {'invoice_id': invoice.id, 'line_ids': []}
for sfield in self._simple_fields2update():
res[sfield] = invoice[sfield]
for m2ofield in self._m2o_fields2update():
res[m2ofield] = invoice[m2ofield].id or False
for line in invoice.invoice_line:
res['line_ids'].append({
'invoice_line_id': line.id,
'name': line.name,
'quantity': line.quantity,
'price_subtotal': line.price_subtotal,
})
return res
@api.model
def default_get(self, fields_list):
res = super(AccountInvoiceUpdate, self).default_get(fields_list)
assert self._context.get('active_model') == 'account.invoice',\
'active_model should be account.invoice'
inv = self.env['account.invoice'].browse(self._context['active_id'])
res = self._prepare_default_get(inv)
return res
@api.onchange('type')
def type_on_change(self):
res = {'domain': {}}
if self.type in ('out_invoice', 'out_refund'):
res['domain']['partner_bank_id'] =\
"[('partner_id.ref_companies', 'in', [company_id])]"
else:
res['domain']['partner_bank_id'] =\
"[('partner_id', '=', commercial_partner_id)]"
return res
@api.multi
def _prepare_invoice(self):
vals = {}
inv = self.invoice_id
for sfield in self._simple_fields2update():
if self[sfield] != inv[sfield]:
vals[sfield] = self[sfield]
for m2ofield in self._m2o_fields2update():
if self[m2ofield] != inv[m2ofield]:
vals[m2ofield] = self[m2ofield].id or False
if 'payment_term' in vals:
pterm_list = self.payment_term.compute(
value=1, date_ref=inv.date_invoice)[0]
if pterm_list:
vals['date_due'] = max(line[0] for line in pterm_list)
return vals
@api.model
def _prepare_invoice_line(self, line):
vals = {}
if line.name != line.invoice_line_id.name:
vals['name'] = line.name
return vals
@api.multi
def _prepare_move(self):
mvals = {}
inv = self.invoice_id
ini_ref = inv.move_id.ref
ref = inv.reference or inv.name
if ini_ref != ref:
mvals['ref'] = ref
return mvals
@api.multi
def _update_payment_term_move(self):
self.ensure_one()
inv = self.invoice_id
if (
self.payment_term and
self.payment_term != inv.payment_term and
inv.move_id and
inv.move_id.period_id.state == 'draft'):
# I don't update pay term when the invoice is partially (or fully)
# paid because if you have a payment term with several lines
# of the same amount, you would also have to take into account
# the reconcile marks to put the new maturity date on the right
# lines
if inv.payment_ids:
raise UserError(_(
"This wizard doesn't support the update of payment "
"terms on an invoice which is partially or fully "
"paid."))
prec = self.env['decimal.precision'].precision_get('Account')
term_res = self.payment_term.compute(
inv.amount_total, inv.date_invoice)[0]
new_pterm = {} # key = int(amount * 100), value = [date1, date2]
for entry in term_res:
amount = int(entry[1] * 10 * prec)
if amount in new_pterm:
new_pterm[amount].append(entry[0])
else:
new_pterm[amount] = [entry[0]]
mlines = {} # key = int(amount * 100), value : [line1, line2]
for line in inv.move_id.line_id:
if line.account_id == inv.account_id:
amount = int(abs(line.credit - line.debit) * 10 * prec)
if amount in mlines:
mlines[amount].append(line)
else:
mlines[amount] = [line]
for iamount, lines in mlines.iteritems():
if len(lines) != len(new_pterm.get(iamount, [])):
raise UserError(_(
"The original payment term '%s' doesn't have the "
"same terms (number of terms and/or amount) as the "
"new payment term '%s'. You can only switch to a "
"payment term that has the same number of terms "
"with the same amount.") % (
inv.payment_term.name, self.payment_term.name))
for line in lines:
line.date_maturity = new_pterm[iamount].pop()
@api.multi
def run(self):
self.ensure_one()
inv = self.invoice_id
updated = False
# re-write date_maturity on move line
self._update_payment_term_move()
ivals = self._prepare_invoice()
if ivals:
updated = True
inv.write(ivals)
for line in self.line_ids:
ilvals = self._prepare_invoice_line(line)
if ilvals:
updated = True
line.invoice_line_id.write(ilvals)
if inv.move_id and inv.move_id.period_id.state == 'draft':
mvals = self._prepare_move()
if mvals:
inv.move_id.write(mvals)
if updated:
inv.message_post(_(
'Non-legal fields of invoice updated via the Invoice Update '
'wizard.'))
return True
class AccountInvoiceLineUpdate(models.TransientModel):
_name = 'account.invoice.line.update'
_description = 'Update non-legal fields of invoice lines'
parent_id = fields.Many2one(
'account.invoice.update', string='Wizard', ondelete='cascade')
invoice_line_id = fields.Many2one(
'account.invoice.line', string='Invoice Line', readonly=True)
name = fields.Text(string='Description', required=True)
quantity = fields.Float(
string='Quantity', digits=dp.get_precision('Product Unit of Measure'),
readonly=True)
price_subtotal = fields.Float(
string='Amount', readonly=True, digits=dp.get_precision('Account'))

View File

@@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="account_invoice_update_form" model="ir.ui.view">
<field name="model">account.invoice.update</field>
<field name="arch" type="xml">
<form string="Update Invoice Wizard">
<group name="main">
<field name="invoice_id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="commercial_partner_id" invisible="1"/>
<field name="reference" attrs="{'invisible': [('type', 'not in', ('in_invoice', 'in_refund'))]}"/>
<field name="origin"/>
<field name="name"/>
<field name="payment_term" widget="selection"/>
<field name="partner_bank_id"/>
<field name="user_id"/>
<field name="comment"/>
</group>
<group name="lines">
<field name="line_ids" nolabel="1">
<tree editable="bottom">
<field name="invoice_line_id" invisible="1"/>
<field name="name"/>
<field name="quantity"/>
<field name="price_subtotal"/>
</tree>
</field>
</group>
<footer>
<button name="run" type="object" class="oe_highlight" string="Update"/>
or
<button special="cancel" string="Cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<record id="account_invoice_update_action" model="ir.actions.act_window">
<field name="name">Invoice Update Wizard</field>
<field name="res_model">account.invoice.update</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -23,7 +23,7 @@
{ {
'name': 'Account Move Line Filter Wizard', 'name': 'Account Move Line Filter Wizard',
'version': '8.0.1.0.1', 'version': '0.1',
'category': 'Accounting & Finance', 'category': 'Accounting & Finance',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Easy and fast access to the details of an account', 'summary': 'Easy and fast access to the details of an account',
@@ -31,7 +31,7 @@
Account Move Line Filter Wizard Account Move Line Filter Wizard
=============================== ===============================
This module adds a wizard in *Accounting > Adviser > Journal Items of Account*. This module adds a wizard in Accounting > ... >
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>. This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
""", """,

View File

@@ -1,103 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_move_line_filter_wizard
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-13 22:53+0000\n"
"PO-Revision-Date: 2017-12-13 22:53+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,account_id:0
msgid "Account"
msgstr ""
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Account Move Lines"
msgstr ""
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Cancel"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,create_uid:0
msgid "Created by"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,create_date:0
msgid "Created on"
msgstr ""
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Filters"
msgstr ""
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Fully Reconciled"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,id:0
msgid "ID"
msgstr ""
#. module: account_move_line_filter_wizard
#: model:ir.actions.act_window,name:account_move_line_filter_wizard.account_move_line_filter_wizard_action
#: model:ir.ui.menu,name:account_move_line_filter_wizard.account_move_line_filter_wizard_menu
msgid "Journal Items of Account"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Partially Reconciled"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,partner_id:0
msgid "Partner"
msgstr ""
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,reconcile:0
msgid "Reconciliation Filter"
msgstr ""
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Show"
msgstr ""
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Unreconciled"
msgstr ""
#. module: account_move_line_filter_wizard
#: model:ir.model,name:account_move_line_filter_wizard.model_account_move_line_filter_wizard
msgid "Wizard for easy and fast access to account move lines"
msgstr ""

View File

@@ -1,103 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_move_line_filter_wizard
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-13 22:53+0000\n"
"PO-Revision-Date: 2017-12-13 22:53+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,account_id:0
msgid "Account"
msgstr "Compte"
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Account Move Lines"
msgstr "Lignes comptables"
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Cancel"
msgstr "Annuler"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,create_uid:0
msgid "Created by"
msgstr "Created by"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,create_date:0
msgid "Created on"
msgstr "Created on"
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Filters"
msgstr "Filtres"
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Fully Reconciled"
msgstr "Totalement lettré"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,id:0
msgid "ID"
msgstr "ID"
#. module: account_move_line_filter_wizard
#: model:ir.actions.act_window,name:account_move_line_filter_wizard.account_move_line_filter_wizard_action
#: model:ir.ui.menu,name:account_move_line_filter_wizard.account_move_line_filter_wizard_menu
msgid "Journal Items of Account"
msgstr "Consulter compte"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,write_uid:0
msgid "Last Updated by"
msgstr "Last Updated by"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,write_date:0
msgid "Last Updated on"
msgstr "Last Updated on"
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Partially Reconciled"
msgstr "Partiellement lettré"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,partner_id:0
msgid "Partner"
msgstr "Partenaire"
#. module: account_move_line_filter_wizard
#: field:account.move.line.filter.wizard,reconcile:0
msgid "Reconciliation Filter"
msgstr "Filtre lettrage"
#. module: account_move_line_filter_wizard
#: view:account.move.line.filter.wizard:account_move_line_filter_wizard.account_move_line_filter_wizard_form
msgid "Show"
msgstr "Consulter"
#. module: account_move_line_filter_wizard
#: selection:account.move.line.filter.wizard,reconcile:0
msgid "Unreconciled"
msgstr "Non lettré"
#. module: account_move_line_filter_wizard
#: model:ir.model,name:account_move_line_filter_wizard.model_account_move_line_filter_wizard
msgid "Wizard for easy and fast access to account move lines"
msgstr "Wizard for easy and fast access to account move lines"

View File

@@ -53,10 +53,7 @@ class AccountMoveLineFilterWizard(models.TransientModel):
self.ensure_one() self.ensure_one()
action = self.env['ir.actions.act_window'].for_xml_id( action = self.env['ir.actions.act_window'].for_xml_id(
'account', 'action_account_moves_all_a') 'account', 'action_account_moves_all_a')
action['context'] = { action['context'] = {'search_default_account_id': [self.account_id.id]}
'search_default_account_id': [self.account_id.id],
'journal_show_code_only': True,
}
if self.partner_id: if self.partner_id:
action['context']['search_default_partner_id'] =\ action['context']['search_default_partner_id'] =\
[self.partner_id.id] [self.partner_id.id]

View File

@@ -22,7 +22,7 @@
attrs="{'invisible': [('account_reconcile', '!=', True)]}"/> attrs="{'invisible': [('account_reconcile', '!=', True)]}"/>
</group> </group>
<footer> <footer>
<button type="object" name="go" string="Show" class="oe_highlight"/> <button type="object" name="go" string="Go" class="oe_highlight"/>
<button special="cancel" string="Cancel" class="oe_link"/> <button special="cancel" string="Cancel" class="oe_link"/>
</footer> </footer>
</form> </form>

View File

@@ -21,16 +21,9 @@
############################################################################## ##############################################################################
import xlwt import xlwt
import logging
from openerp import models, api from openerp import models, api
from openerp.addons.report_xls.utils import _render
_logger = logging.getLogger(__name__) from openerp.addons.report_xls.report_xls import report_xls
try:
from openerp.addons.report_xls.utils import _render
from openerp.addons.report_xls.report_xls import report_xls
except (ImportError, IOError) as err:
_logger.debug(err)
class AccountMoveLine(models.Model): class AccountMoveLine(models.Model):

View File

@@ -1,4 +1,3 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
from . import account from . import account
from . import wizard

View File

@@ -49,9 +49,6 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
'website': 'http://www.akretion.com', 'website': 'http://www.akretion.com',
'depends': ['account'], 'depends': ['account'],
'conflicts': ['account_invoice_overdue_filter'], 'conflicts': ['account_invoice_overdue_filter'],
'data': [ 'data': ['account_view.xml'],
'account_view.xml',
'wizard/account_invoice_mark_sent_view.xml',
],
'installable': True, 'installable': True,
} }

View File

@@ -23,13 +23,10 @@
from openerp import models, fields, api, _ from openerp import models, fields, api, _
from openerp.tools import float_compare from openerp.tools import float_compare
from openerp.exceptions import Warning as UserError from openerp.exceptions import Warning as UserError
import logging
logger = logging.getLogger(__name__)
class AccountInvoice(models.Model): class AccountInvoice(models.Model):
_inherit = 'account.invoice' _inherit = 'account.invoice'
_order = "date_invoice desc, number desc, id desc"
origin = fields.Char(track_visibility='onchange') origin = fields.Char(track_visibility='onchange')
supplier_invoice_number = fields.Char(track_visibility='onchange') supplier_invoice_number = fields.Char(track_visibility='onchange')
@@ -44,41 +41,9 @@ class AccountInvoice(models.Model):
journal_id = fields.Many2one(track_visibility='onchange') journal_id = fields.Many2one(track_visibility='onchange')
partner_bank_id = fields.Many2one(track_visibility='onchange') partner_bank_id = fields.Many2one(track_visibility='onchange')
fiscal_position = fields.Many2one(track_visibility='onchange') fiscal_position = fields.Many2one(track_visibility='onchange')
# has_attachment is useful for those who use attachment to archive
# supplier invoices. It allows them to find supplier invoices
# that don't have any attachment
has_attachment = fields.Boolean(
compute='_compute_has_attachment',
search='_search_has_attachment', readonly=True)
@api.multi @api.multi
def _compute_has_attachment(self): def onchange_payment_term_date_invoice(self, payment_term_id, date_invoice):
iao = self.env['ir.attachment']
for inv in self:
if iao.search([
('res_model', '=', 'account.invoice'),
('res_id', '=', inv.id),
('type', '=', 'binary'),
('company_id', '=', inv.company_id.id)], limit=1):
inv.has_attachment = True
else:
inv.has_attachment = False
def _search_has_attachment(self, operator, value):
att_inv_ids = {}
if operator == '=':
search_res = self.env['ir.attachment'].search_read([
('res_model', '=', 'account.invoice'),
('type', '=', 'binary'),
('res_id', '!=', False)], ['res_id'])
for att in search_res:
att_inv_ids[att['res_id']] = True
res = [('id', value and 'in' or 'not in', att_inv_ids.keys())]
return res
@api.multi
def onchange_payment_term_date_invoice(
self, payment_term_id, date_invoice):
res = super(AccountInvoice, self).onchange_payment_term_date_invoice( res = super(AccountInvoice, self).onchange_payment_term_date_invoice(
payment_term_id, date_invoice) payment_term_id, date_invoice)
if res and isinstance(res, dict) and 'value' in res: if res and isinstance(res, dict) and 'value' in res:
@@ -89,8 +54,8 @@ class AccountInvoice(models.Model):
# generated from customer invoices linked to the partners' account because: # generated from customer invoices linked to the partners' account because:
# 1) the label of an account move line is an important field, we can't # 1) the label of an account move line is an important field, we can't
# write a rubbish '/' in it ! # write a rubbish '/' in it !
# 2) the 'name' field of the account.move.line is used in the overdue # 2) the 'name' field of the account.move.line is used in the overdue letter,
# letter and '/' is not meaningful for our customer ! # and '/' is not meaningful for our customer !
@api.multi @api.multi
def action_number(self): def action_number(self):
res = super(AccountInvoice, self).action_number() res = super(AccountInvoice, self).action_number()
@@ -104,28 +69,6 @@ class AccountInvoice(models.Model):
return res return res
class AccountInvoiceLine(models.Model):
_inherit = 'account.invoice.line'
# In the 'account' module, we have related stored field for:
# company_id, partner_id
currency_id = fields.Many2one(
related='invoice_id.currency_id', readonly=True, store=True)
invoice_type = fields.Selection(
related='invoice_id.type', store=True, readonly=True)
date_invoice = fields.Date(
related='invoice_id.date_invoice', store=True, readonly=True)
commercial_partner_id = fields.Many2one(
related='invoice_id.partner_id.commercial_partner_id',
store=True, readonly=True)
state = fields.Selection(
related='invoice_id.state', store=True, readonly=True,
string='Invoice State')
invoice_number = fields.Char(
related='invoice_id.move_id.name', store=True, readonly=True,
string='Invoice Number')
class AccountFiscalYear(models.Model): class AccountFiscalYear(models.Model):
_inherit = 'account.fiscalyear' _inherit = 'account.fiscalyear'
@@ -162,51 +105,10 @@ class AccountAccount(models.Model):
else: else:
return super(AccountAccount, self).name_get() return super(AccountAccount, self).name_get()
def _check_account_type(self, cr, uid, ids, context=None):
'''Disable this native python constraint, because we want to be able
to configure payable/receivable accounts with an account type
with close_method == 'balance' in order to have opening entries with
fewer lines. It is not a problem because we always use
account_financial_report_webkit which doesn't take the detailed
opening entries into account.'''
return True
_constraints = [
# The method name must be exactly the same as the native
# method, in order to override it
(_check_account_type, 'No error message', ['user_type', 'type']),
]
@api.model
def check_account_hierarchy(self):
'''designed to be called by a script'''
accounts = self.env['account.account'].search([])
parent_accounts = self
for account in accounts:
if account.parent_id and account.parent_id not in parent_accounts:
parent_accounts += account.parent_id
err_msg = []
view_user_type = self.env.ref('account.data_account_type_view')
for pacc in parent_accounts:
if pacc.type != 'view':
err_msg.append(_(
'Parent account %s should have type=view '
'(current type=%s)') % (pacc.code, pacc.type))
if pacc.user_type != view_user_type:
err_msg.append(_(
'Parent account %s should have user_type=view (current '
'(user_type=%s)') % (pacc.code, pacc.user_type.name))
if err_msg:
raise UserError('\n'.join(err_msg))
class AccountAnalyticAccount(models.Model): class AccountAnalyticAccount(models.Model):
_inherit = 'account.analytic.account' _inherit = 'account.analytic.account'
invoice_line_ids = fields.One2many(
'account.invoice.line', 'account_analytic_id', 'Invoice Lines',
readonly=True)
@api.multi @api.multi
def name_get(self): def name_get(self):
if self._context.get('analytic_account_show_code_only'): if self._context.get('analytic_account_show_code_only'):
@@ -223,55 +125,11 @@ class AccountAnalyticAccount(models.Model):
class AccountMove(models.Model): class AccountMove(models.Model):
_inherit = 'account.move' _inherit = 'account.move'
# When ref is too long, the PDF general ledger report becomes
# unreadable
ref = fields.Char(size=32)
# If you want to migrate existing data :
# update account_move set ref=left(ref,32) where ref is not null;
# update account_move_line set ref=left(ref,32) where ref is not null;
# Allow to duplicate an account.move that belongs to a closed period
period_id = fields.Many2one(copy=False)
date = fields.Date(copy=False)
@api.onchange('date') @api.onchange('date')
def date_onchange(self): def date_onchange(self):
if self.date: if self.date:
self.period_id = self.env['account.period'].find(self.date) self.period_id = self.env['account.period'].find(self.date)
@api.model
def delete_move_no_lines(self):
'''designed to be called by a script'''
moves_no_lines = self.search([('line_id', '=', False)])
inv_moves_sr = self.env['account.invoice'].search_read(
[('move_id', '!=', False)], ['move_id'])
move2inv = {} # key=move_id, value=invoice_id
invoice_move_no_line = {} # key=ID, value=number
deleted_move_ids = []
for inv_move_sr in inv_moves_sr:
move2inv[inv_move_sr['move_id'][0]] = inv_move_sr['id']
for move in moves_no_lines:
for l in move.line_id:
raise UserError(_('Move %d has a line !') % move.id)
if move.id not in move2inv:
if move.state == 'posted':
move.state = 'draft'
deleted_move_ids.append(move.id)
move.unlink()
else:
invoice_move_no_line[move2inv[move.id]] = move.name
if deleted_move_ids:
logger.info(
'Account move IDs %s have been deleted because they '
'had 0 lines', deleted_move_ids)
else:
logger.info('0 moves without lines found')
if invoice_move_no_line:
for inv_id, inv_number in invoice_move_no_line.iteritems():
logger.info(
'Invoice ID %d number %s has a move with 0 lines',
inv_id, inv_number)
class AccountMoveLine(models.Model): class AccountMoveLine(models.Model):
_inherit = 'account.move.line' _inherit = 'account.move.line'
@@ -305,28 +163,6 @@ class AccountMoveLine(models.Model):
else: else:
self.credit = amount_company_currency self.credit = amount_company_currency
analytic_account_id = fields.Many2one(
domain=[('type', 'not in', ('view', 'template'))])
class AccountBankStatement(models.Model):
_inherit = 'account.bank.statement'
start_date = fields.Date(
compute='_compute_dates', string='Start Date', readonly=True,
store=True)
end_date = fields.Date(
compute='_compute_dates', string='End Date', readonly=True,
store=True)
@api.multi
@api.depends('line_ids.date')
def _compute_dates(self):
for st in self:
dates = [line.date for line in st.line_ids]
st.start_date = dates and min(dates) or False
st.end_date = dates and max(dates) or False
class AccountBankStatementLine(models.Model): class AccountBankStatementLine(models.Model):
_inherit = 'account.bank.statement.line' _inherit = 'account.bank.statement.line'
@@ -374,7 +210,6 @@ class AccountBankStatementLine(models.Model):
raise UserError(_( raise UserError(_(
'No journal entry linked to this bank statement line.')) 'No journal entry linked to this bank statement line.'))
class ResPartner(models.Model): class ResPartner(models.Model):
_inherit = 'res.partner' _inherit = 'res.partner'
@@ -417,8 +252,6 @@ class ResPartner(models.Model):
payable_journal_item_count = fields.Integer( payable_journal_item_count = fields.Integer(
compute='_compute_journal_item_count', compute='_compute_journal_item_count',
string="Payable Journal Items", readonly=True) string="Payable Journal Items", readonly=True)
property_account_position = fields.Many2one(
track_visibility='onchange')
class AccountFiscalPosition(models.Model): class AccountFiscalPosition(models.Model):

View File

@@ -38,11 +38,6 @@
<field name="period_id" position="attributes"> <field name="period_id" position="attributes">
<attribute name="groups"></attribute> <attribute name="groups"></attribute>
</field> </field>
<!-- move sent field and make it visible -->
<field name="sent" position="replace"/>
<field name="move_id" position="after">
<field name="sent"/>
</field>
</field> </field>
</record> </record>
@@ -66,123 +61,6 @@
<filter name="unpaid" position="after"> <filter name="unpaid" position="after">
<filter name="overdue" string="Overdue" <filter name="overdue" string="Overdue"
domain="[('state', '=', 'open'), ('date_due', '&lt;', current_date)]"/> domain="[('state', '=', 'open'), ('date_due', '&lt;', current_date)]"/>
<separator/>
<filter name="to_send" string="To Send" domain="[('sent', '=', False), ('state', 'in', ('open', 'paid'))]"/>
<filter name="sent" string="Sent" domain="[('sent', '=', True)]"/>
<separator/>
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
</filter>
</field>
</record>
<!-- Having a menu entry on invoice lines is often very usefull for odoo user:
they can search in their lines, etc...
So I enhance the generic views and add actions, but I don't add menu entries here ;
the creation of the corresponding menu entry should be done in the customer-specific
module -->
<record id="view_invoice_line_tree" model="ir.ui.view">
<field name="name">account_usability.invoice_line_tree</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_tree"/>
<field name="arch" type="xml">
<field name="name" position="before">
<field name="partner_id" invisible="not context.get('show_invoice_fields')"/>
<field name="date_invoice" invisible="not context.get('show_invoice_fields')"/>
<field name="invoice_number" invisible="not context.get('show_invoice_fields')"/>
</field>
<field name="price_subtotal" position="after">
<field name="currency_id"/>
<field name="state" invisible="not context.get('show_invoice_fields')"/>
<field name="invoice_type" invisible="1"/>
</field>
<xpath expr="/tree" position="attributes">
<attribute name="edit">0</attribute>
<attribute name="create">0</attribute>
</xpath>
</field>
</record>
<record id="account_invoice_line_search" model="ir.ui.view">
<field name="name">account_usability.invoice_line_search</field>
<field name="model">account.invoice.line</field>
<field name="arch" type="xml">
<search string="Search Invoice Lines">
<field name="partner_id"/>
<field name="product_id"/>
<field name="account_id"/>
<field name="invoice_number"/>
<field name="name"/>
<filter name="out_invoice" string="Customer Invoices"
domain="[('invoice_type', '=', 'out_invoice')]"/>
<filter name="out_refund" string="Customer Refunds"
domain="[('invoice_type', '=', 'out_refund')]"/>
<filter name="in_invoice" string="Supplier Invoices"
domain="[('invoice_type', '=', 'in_invoice')]"/>
<filter name="in_refund" string="Supplier Refunds"
domain="[('invoice_type', '=', 'in_refund')]"/>
<separator/>
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]"/>
<filter name="unpaid" string="Not Paid" domain="[('state', '=', 'open')]"/>
<filter name="paid" string="Paid" domain="[('state', '=', 'paid')]"/>
<group string="Group By" name="groupby">
<filter name="partner_groupby" string="Partner"
context="{'group_by': 'partner_id'}"/>
<filter name="commercial_partner_group_by" string="Commercial Partner"
context="{'group_by': 'commercial_partner_id'}"/>
<filter name="date_groupby" string="Invoice Date"
context="{'group_by': 'date_invoice'}"/>
<filter name="product_groupby" string="Product"
context="{'group_by': 'product_id'}"/>
<filter name="account_groupby" string="Account"
context="{'group_by': 'account_id'}"/>
</group>
</search>
</field>
</record>
<record id="out_invoice_line_action" model="ir.actions.act_window">
<field name="name">Customer Invoice Lines</field>
<field name="res_model">account.invoice.line</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('invoice_type', '=', 'out_invoice')]</field>
<field name="context">{'show_invoice_fields': True}</field>
</record>
<record id="out_refund_line_action" model="ir.actions.act_window">
<field name="name">Customer Refund Lines</field>
<field name="res_model">account.invoice.line</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('invoice_type', '=', 'out_refund')]</field>
<field name="context">{'show_invoice_fields': True}</field>
</record>
<record id="in_invoice_line_action" model="ir.actions.act_window">
<field name="name">Supplier Invoice Lines</field>
<field name="res_model">account.invoice.line</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('invoice_type', '=', 'in_invoice')]</field>
<field name="context">{'show_invoice_fields': True}</field>
</record>
<record id="in_refund_line_action" model="ir.actions.act_window">
<field name="name">Supplier Refund Lines</field>
<field name="res_model">account.invoice.line</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('invoice_type', '=', 'in_refund')]</field>
<field name="context">{'show_invoice_fields': True}</field>
</record>
<record id="view_account_invoice_report_search" model="ir.ui.view">
<field name="name">usability.account.invoice.report.search</field>
<field name="model">account.invoice.report</field>
<field name="inherit_id" ref="account.view_account_invoice_report_search"/>
<field name="arch" type="xml">
<field name="categ_id" position="after">
<field name="product_id"/>
</field>
<filter name="category_product" position="after">
<filter string="Product" name="product_group_by" context="{'group_by': 'product_id'}"/>
</filter> </filter>
</field> </field>
</record> </record>
@@ -190,24 +68,10 @@ module -->
<!-- model account.move.line / Journal Items --> <!-- model account.move.line / Journal Items -->
<record id="account.action_account_moves_all_a" model="ir.actions.act_window"> <record id="account.action_account_moves_all_a" model="ir.actions.act_window">
<field name="limit">200</field> <field name="limit">200</field>
<!-- add graph -->
<field name="view_mode">tree_account_move_line_quickadd,form,graph</field>
<!-- Win space, because there are already many columns --> <!-- Win space, because there are already many columns -->
<field name="context">{'journal_show_code_only': True}</field> <field name="context">{'journal_show_code_only': True}</field>
</record> </record>
<record id="account_move_line_graph" model="ir.ui.view">
<field name="name">usability.account.move.line.graph</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.account_move_line_graph"/>
<field name="arch" type="xml">
<graph position="attributes">
<!-- pivot by default instead of bar -->
<attribute name="type">pivot</attribute>
</graph>
</field>
</record>
<!-- model account.move / Journal Entries --> <!-- model account.move / Journal Entries -->
<record id="account.action_move_journal_line" model="ir.actions.act_window"> <record id="account.action_move_journal_line" model="ir.actions.act_window">
<field name="limit">200</field> <field name="limit">200</field>
@@ -237,7 +101,6 @@ module -->
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="partner_id" position="after"> <field name="partner_id" position="after">
<field name="reconcile_ref" /> <field name="reconcile_ref" />
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
</field> </field>
<filter name="unreconciled" position="before"> <filter name="unreconciled" position="before">
<filter name="reconciled" string="Fully Reconciled" domain="[('reconcile_id', '!=', False)]"/> <filter name="reconciled" string="Fully Reconciled" domain="[('reconcile_id', '!=', False)]"/>
@@ -246,9 +109,6 @@ module -->
<field name="name" position="attributes"> <field name="name" position="attributes">
<attribute name="string">Name or Reference</attribute> <attribute name="string">Name or Reference</attribute>
</field> </field>
<field name="account_id" position="after">
<field name="analytic_account_id"/>
</field>
</field> </field>
</record> </record>
@@ -268,7 +128,6 @@ module -->
<field name="name">account_usability.account_move_line_tree</field> <field name="name">account_usability.account_move_line_tree</field>
<field name="model">account.move.line</field> <field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_move_line_tree"/> <field name="inherit_id" ref="account.view_move_line_tree"/>
<field name="priority">1</field> <!-- to be compatible with account_analytic_plans which removes the field analytic_account_id and has a priority of 2 -->
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="analytic_account_id" position="attributes"> <field name="analytic_account_id" position="attributes">
<attribute name="invisible"></attribute> <attribute name="invisible"></attribute>
@@ -320,10 +179,9 @@ module -->
</button> </button>
</button> </button>
<button name="%(account.action_account_moves_all_tree)d" position="attributes"> <button name="%(account.action_account_moves_all_tree)d" position="attributes">
<attribute name="invisible">True</attribute> <attribute name="type">object</attribute>
</button> <attribute name="name">show_receivable_account</attribute>
<button name="%(account.action_account_moves_all_tree)d" position="after"> <attribute name="attrs">{'invisible': [('customer', '=', False)]}</attribute>
<button type="object" class="oe_stat_button" name="show_receivable_account" icon="fa-list" attrs="{'invisible': [('customer', '=', False)]}"/>
</button> </button>
<field name="journal_item_count" position="attributes"> <field name="journal_item_count" position="attributes">
<attribute name="string">Receivable Account</attribute> <attribute name="string">Receivable Account</attribute>
@@ -331,12 +189,6 @@ module -->
</field> </field>
</record> </record>
<!-- When you click on the "Contract" button of partner form view,
the newly created analytic accounts should be of type contract ! -->
<record id="account.action_open_partner_analytic_accounts" model="ir.actions.act_window">
<field name="context">{'search_default_partner_id': [active_id], 'default_partner_id': active_id, 'default_type': 'contract'}</field>
</record>
<record id="view_bank_statement_form" model="ir.ui.view"> <record id="view_bank_statement_form" model="ir.ui.view">
<field name="name">usability.account.bank.statement.form</field> <field name="name">usability.account.bank.statement.form</field>
<field name="model">account.bank.statement</field> <field name="model">account.bank.statement</field>
@@ -348,65 +200,6 @@ the newly created analytic accounts should be of type contract ! -->
string="View Account Move" icon="gtk-redo" string="View Account Move" icon="gtk-redo"
attrs="{'invisible': [('journal_entry_id', '=', False)]}"/> attrs="{'invisible': [('journal_entry_id', '=', False)]}"/>
</xpath> </xpath>
<field name="company_id" position="before">
<field name="start_date"/>
<field name="end_date"/>
</field>
</field>
</record>
<record id="view_bank_statement_tree" model="ir.ui.view">
<field name="name">usability.account.bank.statement.tree</field>
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_tree"/>
<field name="arch" type="xml">
<field name="period_id" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="date" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="journal_id" position="after">
<field name="start_date"/>
<field name="end_date"/>
</field>
</field>
</record>
<record id="view_bank_statement_search" model="ir.ui.view">
<field name="name">usability.account.bank.statement.search</field>
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_search"/>
<field name="arch" type="xml">
<field name="date" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<filter context="{'group_by': 'period_id'}" position="attributes">
<attribute name="invisible">1</attribute>
</filter>
<filter context="{'group_by': 'period_id'}" position="after">
<filter name="start_date_groupby" string="Start Date"
context="{'group_by': 'start_date'}"/>
<filter name="end_date_groupby" string="End Date"
context="{'group_by': 'end_date'}"/>
</filter>
<field name="date" position="after">
<field name="start_date"/>
<field name="end_date"/>
</field>
</field>
</record>
<record id="view_account_analytic_account_form" model="ir.ui.view">
<field name="name">analytic.analytic.account.form</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id" ref="analytic.view_account_analytic_account_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page name="invoice_lines" string="Related Invoice Lines" attrs="{'invisible': [('type', 'not in', ('contract', 'normal'))]}">
<field name="invoice_line_ids" nolabel="1" context="{'show_invoice_fields': 1}"/>
</page>
</notebook>
</field> </field>
</record> </record>

View File

@@ -1,379 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-06 10:16+0000\n"
"PO-Revision-Date: 2017-11-06 10:16+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_usability
#: help:account.invoice.line,state:0
msgid " * The 'Draft' status is used when a user is encoding a new and unconfirmed Invoice.\n"
" * The 'Pro-forma' when invoice is in Pro-forma status,invoice does not have an invoice number.\n"
" * The 'Open' status is used when user create invoice,a invoice number is generated.Its in open status till user does not pay invoice.\n"
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: model:ir.model,name:account_usability.model_account_account
msgid "Account"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_move
msgid "Account Entry"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_analytic_account
msgid "Analytic Account"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_bank_statement
msgid "Bank Statement"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
msgid "Cancel"
msgstr ""
#. module: account_usability
#: field:account.invoice.line,commercial_partner_id:0
msgid "Commercial Entity"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Commercial Partner"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,create_uid:0
msgid "Created by"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,create_date:0
msgid "Created on"
msgstr ""
#. module: account_usability
#: field:account.invoice.line,currency_id:0
msgid "Currency"
msgstr ""
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.out_invoice_line_action
msgid "Customer Invoice Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Customer Invoices"
msgstr ""
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.out_refund_line_action
msgid "Customer Refund Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Customer Refunds"
msgstr ""
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Debit or Credit"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,display_name:0
msgid "Display Name"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Draft"
msgstr ""
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_search
#: field:account.bank.statement,end_date:0
msgid "End Date"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_fiscal_position
msgid "Fiscal Position"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_fiscalyear
msgid "Fiscal Year"
msgstr ""
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Fully Reconciled"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Group By"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,id:0
msgid "ID"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_invoice
msgid "Invoice"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: field:account.invoice.line,date_invoice:0
msgid "Invoice Date"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_invoice_line
msgid "Invoice Line"
msgstr ""
#. module: account_usability
#: field:account.analytic.account,invoice_line_ids:0
msgid "Invoice Lines"
msgstr ""
#. module: account_usability
#: field:account.invoice.line,invoice_number:0
msgid "Invoice Number"
msgstr ""
#. module: account_usability
#: field:account.invoice.line,state:0
msgid "Invoice State"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_journal
msgid "Journal"
msgstr ""
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_move_line
msgid "Journal Items"
msgstr ""
#. module: account_usability
#: help:account.invoice.line,date_invoice:0
msgid "Keep empty to use the current date"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,__last_update:0
msgid "Last Modified on"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: account_usability
#: field:account.invoice.mark.sent,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
#: model:ir.actions.act_window,name:account_usability.account_invoice_mark_sent_action
msgid "Mark as Sent"
msgstr ""
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
msgid "Mark invoices as sent"
msgstr ""
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Missing Attachment"
msgstr ""
#. module: account_usability
#: code:addons/account_usability/account.py:255
#, python-format
msgid "Move %d has a line !"
msgstr ""
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Name or Reference"
msgstr ""
#. module: account_usability
#: constraint:account.account:0
msgid "No error message"
msgstr ""
#. module: account_usability
#: code:addons/account_usability/account.py:374
#, python-format
msgid "No journal entry linked to this bank statement line."
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Not Paid"
msgstr ""
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Overdue"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Paid"
msgstr ""
#. module: account_usability
#: code:addons/account_usability/account.py:192
#, python-format
msgid "Parent account %s should have type=view (current type=%s)"
msgstr ""
#. module: account_usability
#: code:addons/account_usability/account.py:196
#, python-format
msgid "Parent account %s should have user_type=view (current (user_type=%s)"
msgstr ""
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Partially Reconciled"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: model:ir.model,name:account_usability.model_res_partner
msgid "Partner"
msgstr ""
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "Payable Account"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: view:account.invoice.report:account_usability.view_account_invoice_report_search
msgid "Product"
msgstr ""
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "Receivable Account"
msgstr ""
#. module: account_usability
#: view:account.analytic.account:account_usability.view_account_analytic_account_form
msgid "Related Invoice Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Search Invoice Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Sent"
msgstr ""
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_search
#: field:account.bank.statement,start_date:0
msgid "Start Date"
msgstr ""
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.in_invoice_line_action
msgid "Supplier Invoice Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Supplier Invoices"
msgstr ""
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.in_refund_line_action
msgid "Supplier Refund Lines"
msgstr ""
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Supplier Refunds"
msgstr ""
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
msgid "This wizard will mark as sent all the selected invoices."
msgstr ""
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "To Send"
msgstr ""
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "True"
msgstr ""
#. module: account_usability
#: field:account.invoice.line,invoice_type:0
msgid "Type"
msgstr ""
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_form
msgid "View Account Move"
msgstr ""
#. module: account_usability
#: view:account.move.line:account_usability.account_move_line_graph
msgid "pivot"
msgstr ""
#. module: account_usability
#: view:account.invoice:account_usability.invoice_form
#: view:account.invoice:account_usability.invoice_supplier_form
msgid "selection"
msgstr ""

View File

@@ -1,383 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-06 10:16+0000\n"
"PO-Revision-Date: 2017-11-06 10:16+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_usability
#: help:account.invoice.line,state:0
msgid " * The 'Draft' status is used when a user is encoding a new and unconfirmed Invoice.\n"
" * The 'Pro-forma' when invoice is in Pro-forma status,invoice does not have an invoice number.\n"
" * The 'Open' status is used when user create invoice,a invoice number is generated.Its in open status till user does not pay invoice.\n"
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr " * The 'Draft' status is used when a user is encoding a new and unconfirmed Invoice.\n"
" * The 'Pro-forma' when invoice is in Pro-forma status,invoice does not have an invoice number.\n"
" * The 'Open' status is used when user create invoice,a invoice number is generated.Its in open status till user does not pay invoice.\n"
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: model:ir.model,name:account_usability.model_account_account
msgid "Account"
msgstr "Compte"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_move
msgid "Account Entry"
msgstr "Pièce comptable"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_analytic_account
msgid "Analytic Account"
msgstr "Compte analytique"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_bank_statement
msgid "Bank Statement"
msgstr "Relevé Bancaire"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr "Ligne de Relevé Bancaire"
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
msgid "Cancel"
msgstr "Annuler"
#. module: account_usability
#: field:account.invoice.line,commercial_partner_id:0
msgid "Commercial Entity"
msgstr "Entité Commercial"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Commercial Partner"
msgstr "Partenaire Commercial"
#. module: account_usability
#: field:account.invoice.mark.sent,create_uid:0
msgid "Created by"
msgstr "Créé par"
#. module: account_usability
#: field:account.invoice.mark.sent,create_date:0
msgid "Created on"
msgstr "Créé le"
#. module: account_usability
#: field:account.invoice.line,currency_id:0
msgid "Currency"
msgstr "Monnaie"
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.out_invoice_line_action
msgid "Customer Invoice Lines"
msgstr "Lignes de facture client"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Customer Invoices"
msgstr "Factures Client"
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.out_refund_line_action
msgid "Customer Refund Lines"
msgstr "Lignes d'avoir client"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Customer Refunds"
msgstr "Avoir CLient"
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Debit or Credit"
msgstr "Debit ou Credit"
#. module: account_usability
#: field:account.invoice.mark.sent,display_name:0
msgid "Display Name"
msgstr "Display Name"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Draft"
msgstr "Brouillon"
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_search
#: field:account.bank.statement,end_date:0
msgid "End Date"
msgstr "Date de Fin"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_fiscal_position
msgid "Fiscal Position"
msgstr "Position fiscale"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_fiscalyear
msgid "Fiscal Year"
msgstr "Exercice"
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Fully Reconciled"
msgstr "Complétement Réconcillié"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Group By"
msgstr "Groupé par"
#. module: account_usability
#: field:account.invoice.mark.sent,id:0
msgid "ID"
msgstr "ID"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_invoice
msgid "Invoice"
msgstr "Facture"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: field:account.invoice.line,date_invoice:0
msgid "Invoice Date"
msgstr "Date de Facture"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_invoice_line
msgid "Invoice Line"
msgstr "Lignes de facture"
#. module: account_usability
#: field:account.analytic.account,invoice_line_ids:0
msgid "Invoice Lines"
msgstr "Lignes de Facture"
#. module: account_usability
#: field:account.invoice.line,invoice_number:0
msgid "Invoice Number"
msgstr "N° de Facture"
#. module: account_usability
#: field:account.invoice.line,state:0
msgid "Invoice State"
msgstr "Etat de la facture"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_journal
msgid "Journal"
msgstr "Journal"
#. module: account_usability
#: model:ir.model,name:account_usability.model_account_move_line
msgid "Journal Items"
msgstr "Écritures comptables"
#. module: account_usability
#: help:account.invoice.line,date_invoice:0
msgid "Keep empty to use the current date"
msgstr "Laisser vide pour utiliser la date courante"
#. module: account_usability
#: field:account.invoice.mark.sent,__last_update:0
msgid "Last Modified on"
msgstr "Modifié le"
#. module: account_usability
#: field:account.invoice.mark.sent,write_uid:0
msgid "Last Updated by"
msgstr "Modifié par"
#. module: account_usability
#: field:account.invoice.mark.sent,write_date:0
msgid "Last Updated on"
msgstr "Modifié le"
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
#: model:ir.actions.act_window,name:account_usability.account_invoice_mark_sent_action
msgid "Mark as Sent"
msgstr "Marquer comme envoyé"
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
msgid "Mark invoices as sent"
msgstr "Marquer les factures comme envoyé"
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Missing Attachment"
msgstr "Pièce jointe manquante"
#. module: account_usability
#: code:addons/account_usability/account.py:255
#, python-format
msgid "Move %d has a line !"
msgstr "Le mouvement %d a une ligne !"
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Name or Reference"
msgstr "Nom ou Réference"
#. module: account_usability
#: constraint:account.account:0
msgid "No error message"
msgstr "No error message"
#. module: account_usability
#: code:addons/account_usability/account.py:374
#, python-format
msgid "No journal entry linked to this bank statement line."
msgstr "Aucune entrée de journal n'est liée à ce relevé bancaire."
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Not Paid"
msgstr "Non Payé"
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Overdue"
msgstr "En retard"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Paid"
msgstr "Payé"
#. module: account_usability
#: code:addons/account_usability/account.py:192
#, python-format
msgid "Parent account %s should have type=view (current type=%s)"
msgstr "Parent account %s should have type=view (current type=%s)"
#. module: account_usability
#: code:addons/account_usability/account.py:196
#, python-format
msgid "Parent account %s should have user_type=view (current (user_type=%s)"
msgstr "Parent account %s should have user_type=view (current (user_type=%s)"
#. module: account_usability
#: view:account.move.line:account_usability.view_account_move_line_filter
msgid "Partially Reconciled"
msgstr "Partiellement Réconcillié"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: model:ir.model,name:account_usability.model_res_partner
msgid "Partner"
msgstr "Partenaire"
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "Payable Account"
msgstr "Compte Créditeur"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
#: view:account.invoice.report:account_usability.view_account_invoice_report_search
msgid "Product"
msgstr "Produit"
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "Receivable Account"
msgstr "Compte Débiteur"
#. module: account_usability
#: view:account.analytic.account:account_usability.view_account_analytic_account_form
msgid "Related Invoice Lines"
msgstr "Lignes de facture associées"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Search Invoice Lines"
msgstr "Rechercher les lignes de facture"
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "Sent"
msgstr "Envoyé"
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_search
#: field:account.bank.statement,start_date:0
msgid "Start Date"
msgstr "Date de Début"
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.in_invoice_line_action
msgid "Supplier Invoice Lines"
msgstr "Lignes de Facture Fournisseur"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Supplier Invoices"
msgstr "Facture Fournisseur"
#. module: account_usability
#: model:ir.actions.act_window,name:account_usability.in_refund_line_action
msgid "Supplier Refund Lines"
msgstr "Lignes d'avoir fournisseur"
#. module: account_usability
#: view:account.invoice.line:account_usability.account_invoice_line_search
msgid "Supplier Refunds"
msgstr "Avoirs Fournisseur"
#. module: account_usability
#: view:account.invoice.mark.sent:account_usability.account_invoice_mark_sent_form
msgid "This wizard will mark as sent all the selected invoices."
msgstr "Cet assistant marquera comme envoyé toutes les factures sélectionnées."
#. module: account_usability
#: view:account.invoice:account_usability.view_account_invoice_filter
msgid "To Send"
msgstr "A Envoyer"
#. module: account_usability
#: view:res.partner:account_usability.partner_view_button_journal_item_count
msgid "True"
msgstr "Vrai"
#. module: account_usability
#: field:account.invoice.line,invoice_type:0
msgid "Type"
msgstr "Type"
#. module: account_usability
#: view:account.bank.statement:account_usability.view_bank_statement_form
msgid "View Account Move"
msgstr "Voir les mouvements comptables"
#. module: account_usability
#: view:account.move.line:account_usability.account_move_line_graph
msgid "pivot"
msgstr "pivot"
#. module: account_usability
#: view:account.invoice:account_usability.invoice_form
#: view:account.invoice:account_usability.invoice_supplier_form
msgid "selection"
msgstr "selection"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -1,3 +0,0 @@
# -*- encoding: utf-8 -*-
from . import account_invoice_mark_sent

View File

@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, api
import logging
logger = logging.getLogger(__name__)
class AccountInvoiceMarkSent(models.TransientModel):
_name = 'account.invoice.mark.sent'
_description = 'Mark invoices as sent'
@api.multi
def run(self):
assert self.env.context.get('active_model') == 'account.invoice',\
'Source model must be invoices'
assert self.env.context.get('active_ids'), 'No invoices selected'
invoices = self.env['account.invoice'].browse(
self.env.context.get('active_ids'))
invoices.write({'sent': True})
logger.info('Marking invoices with ID %s as sent', invoices.ids)
return

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="account_invoice_mark_sent_form" model="ir.ui.view">
<field name="name">account.invoice.mark.sent.form</field>
<field name="model">account.invoice.mark.sent</field>
<field name="arch" type="xml">
<form string="Mark invoices as sent">
<p>
This wizard will mark as sent all the selected invoices.
</p>
<footer>
<button type="object" name="run" string="Mark as Sent" class="oe_highlight"/>
<button special="cancel" string="Cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<act_window id="account_invoice_mark_sent_action"
multi="True"
key2="client_action_multi"
name="Mark as Sent"
res_model="account.invoice.mark.sent"
src_model="account.invoice"
view_mode="form"
target="new" />
</data>
</openerp>

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import ir_mail_server

View File

@@ -1,22 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Mail Sender Bcc',
'version': '8.0.1.0.0',
'category': 'Mail',
'license': 'AGPL-3',
'summary': "Always send a copy of the mail to the sender",
'description': """
Mail Sender Bcc
===============
With this module, when Odoo sends an outgoing email, it adds the sender as Bcc (blind copy) of the email.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['base'],
'installable': True,
}

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models
class IrMailServer(models.Model):
_inherit = 'ir.mail_server'
def build_email(
self, email_from, email_to, subject, body, email_cc=None,
email_bcc=None, reply_to=False, attachments=None,
message_id=None, references=None, object_id=False,
subtype='plain', headers=None,
body_alternative=None, subtype_alternative='plain'):
if email_from:
if email_bcc is None:
email_bcc = [email_from]
elif isinstance(email_bcc, list) and email_from not in email_bcc:
email_bcc.append(email_from)
return super(IrMailServer, self).build_email(
email_from, email_to, subject, body, email_cc=email_cc,
email_bcc=email_bcc, reply_to=reply_to, attachments=attachments,
message_id=message_id, references=references, object_id=object_id,
subtype=subtype, headers=headers,
body_alternative=body_alternative,
subtype_alternative=subtype_alternative)

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -1,27 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2017-2024 Akretion France (https://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Base Partner Reference',
'version': '8.0.1.0.0',
'category': 'Partner',
'license': 'AGPL-3',
'summary': "Improve usage of partner's Internal Reference",
'description': """
Base Partner Reference
======================
* Adds Internal Reference in partner tree view
* Adds Internal Reference in name_get()
* Adds unicity constraint on Internal Reference
""",
'author': 'Akretion',
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['base'],
'data': ['views/res_partner.xml'],
'installable': True,
}

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import res_partner

View File

@@ -1,62 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2017-2024 Akretion France
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api
class ResPartner(models.Model):
_inherit = 'res.partner'
display_name = fields.Char(compute="_compute_display_name", store=True, string="Name")
# copy=False on 'ref' is already in base_usability
_sql_constraints = [(
'ref_unique',
'unique(ref)',
'A partner already exists with this internal reference!'
)]
# inspired by _display_name_compute from base module
@api.multi
@api.depends('parent_id', 'is_company', 'name', 'ref')
def _compute_display_name(self):
for partner in self:
partner.display_name = partner.with_context(show_address=False, show_address_only=False, show_email=False).name_get()[0][1]
def name_get(self, cr, uid, ids, context=None):
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]
res = []
for record in self.browse(cr, uid, ids, context=context):
name = record.name
# START modif of native name_get() method
if record.ref:
name = u"[%s] %s" % (record.ref, name)
# END modif of native name_get() method
if record.parent_id and not record.is_company:
name = "%s, %s" % (record.parent_name, name)
if context.get('show_address_only'):
name = self._display_address(cr, uid, record, without_company=True, context=context)
if context.get('show_address'):
name = name + "\n" + self._display_address(cr, uid, record, without_company=True, context=context)
name = name.replace('\n\n', '\n')
name = name.replace('\n\n', '\n')
if context.get('show_email') and record.email:
name = "%s <%s>" % (name, record.email)
res.append((record.id, name))
return res
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
if args is None:
args = []
if name and operator == 'ilike':
recs = self.search([('ref', '=', name)] + args, limit=limit)
if recs:
rec_childs = self.search([('id', 'child_of', recs.ids)])
return rec_childs.name_get()
return super(ResPartner, self).name_search(name=name, args=args, operator=operator, limit=limit)

View File

@@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2024 Akretion France (https://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">Move ref in partner form to make it more visible</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="website" position="before">
<field name="ref"/>
</field>
<xpath expr="//page[@name='sales_purchases']//field[@name='ref']" position="replace"/>
</field>
</record>
<record id="view_partner_tree" model="ir.ui.view">
<field name="name">Add ref in partner tree view</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_tree"/>
<field name="arch" type="xml">
<!-- show name and ref in separate columns -->
<field name="display_name" position="after">
<field name="ref"/>
<field name="name"/>
</field>
<field name="display_name" position="attributes">
<attribute name="invisible">1</attribute>
</field>
</field>
</record>
<record id="res_partner_kanban_view" model="ir.ui.view">
<field name="name">Add ref in partner kanban view</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.res_partner_kanban_view"/>
<field name="arch" type="xml">
<field name="display_name" position="after">
<field name="ref"/>
</field>
<li t-if="record.email.raw_value" position="after">
<li t-if="record.ref.raw_value">Ref: <field name="ref"/></li>
</li>
</field>
</record>
</data>
</openerp>

View File

@@ -12,9 +12,6 @@
<field name="model">ir.module.module</field> <field name="model">ir.module.module</field>
<field name="inherit_id" ref="base.view_module_filter"/> <field name="inherit_id" ref="base.view_module_filter"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//filter[@name='extra']" position="after">
<filter name="installable" string="Installable" domain="[('state', '!=', 'uninstallable')]"/>
</xpath>
<xpath expr="//filter[@string='Category']" position="after"> <xpath expr="//filter[@string='Category']" position="after">
<filter string="State" domain="[]" context="{'group_by':'state'}"/> <filter string="State" domain="[]" context="{'group_by':'state'}"/>
</xpath> </xpath>
@@ -23,7 +20,7 @@
<record id="base.open_module_tree" model="ir.actions.act_window"> <record id="base.open_module_tree" model="ir.actions.act_window">
<field name="res_model">ir.module.module</field> <field name="res_model">ir.module.module</field>
<field name="context">{'search_default_installable': 1}</field> <field name="context">{}</field>
</record> </record>
</data> </data>

View File

@@ -28,7 +28,7 @@ class Partner(models.Model):
name = fields.Char(track_visibility='onchange') name = fields.Char(track_visibility='onchange')
parent_id = fields.Many2one(track_visibility='onchange') parent_id = fields.Many2one(track_visibility='onchange')
ref = fields.Char(track_visibility='onchange', copy=False) ref = fields.Char(track_visibility='onchange')
lang = fields.Selection(track_visibility='onchange') lang = fields.Selection(track_visibility='onchange')
user_id = fields.Many2one(track_visibility='onchange') user_id = fields.Many2one(track_visibility='onchange')
vat = fields.Char(track_visibility='onchange') vat = fields.Char(track_visibility='onchange')
@@ -45,7 +45,6 @@ class Partner(models.Model):
is_company = fields.Boolean(track_visibility='onchange') is_company = fields.Boolean(track_visibility='onchange')
use_parent_address = fields.Boolean(track_visibility='onchange') use_parent_address = fields.Boolean(track_visibility='onchange')
active = fields.Boolean(track_visibility='onchange') active = fields.Boolean(track_visibility='onchange')
company_id = fields.Many2one(track_visibility='onchange')
# For reports # For reports
name_title = fields.Char( name_title = fields.Char(
compute='_compute_name_title', string='Name with Title') compute='_compute_name_title', string='Name with Title')
@@ -55,15 +54,9 @@ class Partner(models.Model):
def _compute_name_title(self): def _compute_name_title(self):
name_title = self.name name_title = self.name
if self.title: if self.title:
title = self.title.shortcut or self.title.name title = self.title.shortcut or self.title
if self.is_company: if self.is_company:
name_title = ' '.join([name_title, title]) name_title = ' '.join([name_title, title])
else: else:
name_title = ' '.join([title, name_title]) name_title = ' '.join([title, name_title])
self.name_title = name_title self.name_title = name_title
class ResPartnerCategory(models.Model):
_inherit = 'res.partner.category'
name = fields.Char(translate=False)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -1,37 +0,0 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
========================
User Authentication Logs
========================
This module adds user authentication logs in Odoo. It logs both authentication success and failures.
Usage
=====
The authentication logs can be seen:
* on the users's form view in the *Auth Logs* tab,
* in the menu *Settings > Technical > Security > Authentication Logs*.
Authentication failure logs are displayed in red. Authentication success logs are displayed in black.
To have read access to the logs, you need to be part of the *Access Rights* group.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.
Credits
=======
Contributors
------------
* Alexis de Lattre <alexis.delattre@akretion.com>

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Users authentification logs',
'version': '8.0.1.0.0',
'category': 'Tools',
'license': 'AGPL-3',
'summary': 'Adds users authentication logs',
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
'views/res_users_auth_log.xml',
'views/res_users.xml',
'data/ir_cron.xml',
],
'installable': True,
}

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data noupdate="1"> <!-- noupdate = 1 for the 'active' field -->
<record id="purge_auth_log_cron" model="ir.cron">
<field name="name">Purge old authentication logs</field>
<field name="active" eval="True"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field> <!-- don't limit the number of calls -->
<field name="doall" eval="False"/>
<field name="model" eval="'res.users.auth.log'"/>
<field name="function" eval="'_purge_old_auth_logs'" />
<field name="args" eval="'()'"/>
</record>
</data>
</openerp>

View File

@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from . import res_users_auth_log
from . import res_users

View File

@@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, registry, SUPERUSER_ID
import logging
logger = logging.getLogger(__name__)
class ResUsers(models.Model):
_inherit = 'res.users'
auth_log_ids = fields.One2many(
'res.users.auth.log', 'user_id', string='Authentication Logs')
def _login(self, db, login, password):
user_id = super(ResUsers, self)._login(db, login, password)
with registry(db).cursor() as cr:
if user_id:
result = 'success'
else:
user_id = None # To write a null value, psycopg2 wants None
result = 'failure'
cr.execute(
"SELECT id FROM res_users WHERE login=%s", (login, ))
user_select = cr.fetchall()
if user_select:
user_id = user_select[0][0]
cr.execute("""
INSERT INTO res_users_auth_log (
create_uid,
create_date,
date,
login,
result,
user_id
) VALUES (
%s, NOW() AT TIME ZONE 'UTC', NOW() AT TIME ZONE 'UTC',
%s, %s, %s)""", (SUPERUSER_ID, login, result, user_id))
logger.info('Auth log created for login %s type %s', login, result)
return user_id

View File

@@ -1,44 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api, _
from openerp.exceptions import Warning as UserError
from datetime import datetime, timedelta
import logging
logger = logging.getLogger(__name__)
class ResUsersAuthLog(models.Model):
_name = 'res.users.auth.log'
_description = 'Users Authentication Logs'
_order = 'date desc'
_rec_name = 'date'
user_id = fields.Many2one(
'res.users', string='User', ondelete='cascade', readonly=True)
login = fields.Char(string='Login', readonly=True)
date = fields.Datetime(
string='Authentication Date', required=True, readonly=True)
result = fields.Selection([
('success', 'Success'),
('failure', 'Failure'),
], string='Result', required=True, readonly=True)
@api.model
def create(self, vals):
if not self._context.get('authenticate_create'):
raise UserError(_(
"You cannot manually create an authentication log."))
return super(ResUsersAuthLog, self).create(vals)
@api.multi
def write(self, vals):
raise UserError(_("You cannot modify an authentication log."))
@api.model
def _purge_old_auth_logs(self):
expiry_date = datetime.today() - timedelta(days=365)
self._cr.execute(
"DELETE FROM res_users_auth_log WHERE date <= %s", (expiry_date, ))
logger.info('Auth logs older than %s have been purged', expiry_date)

View File

@@ -1,2 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_res_users_auth_log,Read access to Access rights group,model_res_users_auth_log,base.group_erp_manager,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_res_users_auth_log Read access to Access rights group model_res_users_auth_log base.group_erp_manager 1 0 0 0

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_users_form" model="ir.ui.view">
<field name="name">auth_logs.res.users.form</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Auth Logs" name="auth_logs">
<field name="auth_log_ids" nolabel="1"/>
</page>
</notebook>
</field>
</record>
</data>
</openerp>

View File

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="res_users_auth_log_form" model="ir.ui.view">
<field name="name">res.users.auth.logs.form</field>
<field name="model">res.users.auth.log</field>
<field name="arch" type="xml">
<form string="Authentication Log">
<group name="main">
<field name="date"/>
<field name="user_id"/>
<field name="login"/>
<field name="result"/>
</group>
</form>
</field>
</record>
<record id="res_users_auth_log_tree" model="ir.ui.view">
<field name="name">res.users.auth.logs.tree</field>
<field name="model">res.users.auth.log</field>
<field name="arch" type="xml">
<tree string="Authentication Logs" colors="red:result=='failure'">
<field name="date"/>
<field name="user_id" invisible="not context.get('auth_logs_main_view')"/>
<field name="login" invisible="not context.get('auth_logs_main_view')"/>
<field name="result"/>
</tree>
</field>
</record>
<record id="res_users_auth_log_search" model="ir.ui.view">
<field name="name">res.users.auth.logs.search</field>
<field name="model">res.users.auth.log</field>
<field name="arch" type="xml">
<search string="Search Authentication Logs">
<field name="user_id"/>
<filter name="success" string="Success" domain="[('result', '=', 'success')]"/>
<filter name="failure" string="Failure" domain="[('result', '=', 'failure')]"/>
<group string="Group By" name="groupby">
<filter name="day_groupby" string="Day" context="{'group_by': 'date:day'}"/>
<filter name="week_groupby" string="Week" context="{'group_by': 'date:week'}"/>
<filter name="month_groupby" string="Month" context="{'group_by': 'date:month'}"/>
<filter name="user_groupby" string="User" context="{'group_by': 'user_id'}"/>
<filter name="result_groupby" string="Result" context="{'group_by': 'result'}"/>
</group>
</search>
</field>
</record>
<record id="res_users_auth_log_graph" model="ir.ui.view">
<field name="name">res.users.auth.logs.graph</field>
<field name="model">res.users.auth.log</field>
<field name="arch" type="xml">
<graph string="Analyze Authentication Logs" type="pivot">
<field name="date" type="row" interval="week"/>
<field name="user_id" type="col"/>
</graph>
</field>
</record>
<record id="res_users_auth_log_action" model="ir.actions.act_window">
<field name="name">Authentication Logs</field>
<field name="res_model">res.users.auth.log</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'auth_logs_main_view': True}</field>
</record>
<menuitem id="res_users_auth_log_menu" action="res_users_auth_log_action"
parent="base.menu_security" sequence="100"/>
</data>
</openerp>

View File

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from . import wizard from . import wizard
from . import crm

View File

@@ -5,7 +5,7 @@
{ {
'name': 'CRM Usability', 'name': 'CRM Usability',
'version': '8.0.1.0.1', 'version': '8.0.1.0.0',
'category': 'Customer Relationship Management', 'category': 'Customer Relationship Management',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'CRM usability enhancements', 'summary': 'CRM usability enhancements',
@@ -13,12 +13,10 @@
CRM Usability CRM Usability
============= =============
The usability improvements include : Some enhancements in the *Merge Partners* wizard:
* Adds multi-company record rules on crm.lead. * take into account the unaccent option of the server config file
* Some enhancements in the *Merge Partners* wizard: * add optional group by on 'customer' and 'supplier' (active by default)
* take into account the unaccent option of the server config file
* add optional group by on 'customer' and 'supplier' (active by default)
This module has been written by Alexis de Lattre from Akretion This module has been written by Alexis de Lattre from Akretion
<alexis.delattre@akretion.com>. <alexis.delattre@akretion.com>.
@@ -26,10 +24,6 @@ This module has been written by Alexis de Lattre from Akretion
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com', 'website': 'http://www.akretion.com',
'depends': ['crm'], 'depends': ['crm'],
'data': [ 'data': ['wizard/base_partner_merge_view.xml'],
'crm_view.xml',
'wizard/base_partner_merge_view.xml',
'security/rule.xml',
],
'installable': True, 'installable': True,
} }

View File

@@ -1,12 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# @author Alexis de Lattre <alexis.delattre@akretion.com>
from openerp import models, fields
class CrmCaseCateg(models.Model):
_inherit = 'crm.case.categ'
name = fields.Char(translate=False)

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="crm_case_form_view_oppor" model="ir.ui.view">
<field name="name">usability.crm.opportunity.form</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_form_view_oppor"/>
<field name="arch" type="xml">
<field name="active" position="before">
<field name="company_id" groups="base.group_multi_company"
widget="selection"/>
</field>
</field>
</record>
<record id="crm_case_inbound_phone_tree_view" model="ir.ui.view">
<field name="name">crm_usability.crm.phonecall.tree.inbound</field>
<field name="model">crm.phonecall</field>
<field name="inherit_id" ref="crm.crm_case_inbound_phone_tree_view"/>
<field name="arch" type="xml">
<field name="state" position="attributes">
<attribute name="invisible">0</attribute>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="crm_lead_company_rule" model="ir.rule">
<field name="name">Lead/opportunity multi-company rule</field>
<field name="model_id" ref="crm.model_crm_lead"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
</record>
</data>
</openerp>

View File

@@ -1 +0,0 @@
# -*- coding: utf-8 -*-

View File

@@ -1,30 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Akretion (http://www.akretion.com).
# @author Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Delivery usability",
"summary": "Delivery Usability",
"version": "8.0.1.0.0",
"category": "Warehouse",
"website": "www.akretion.com",
"author": " Akretion",
"license": "AGPL-3",
"application": False,
"installable": True,
"external_dependencies": {
"python": [],
"bin": [],
},
"depends": [
"delivery",
],
"data": [
"views/stock_picking_view.xml",
],
"demo": [
],
"qweb": [
]
}

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_picking_withcarrier_out_form" model="ir.ui.view">
<field name="model">stock.picking</field>
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form"/>
<field name="priority" eval="100"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='carrier_id']/.." position="replace">
</xpath>
<field name="backorder_id" position="after">
<field name="carrier_id"/>
<field name="carrier_tracking_ref"/>
</field>
</field>
</record>
</data>
</openerp>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
from . import company
from . import hr_holidays
from . import hr_employee
from . import lunch_voucher_attribution
from . import wizard

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'HR Holidays Lunch Voucher',
'version': '8.0.1.0.0',
'category': 'Human Resources',
'license': 'AGPL-3',
'summary': 'Manage lunch vouchers in holidays requests',
'description': '',
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['hr_holidays_usability', 'purchase'],
'data': [
'security/ir.model.access.csv',
'security/lunch_voucher_security.xml',
'product_data.xml',
'company_view.xml',
'wizard/lunch_voucher_purchase_view.xml',
'lunch_voucher_attribution_view.xml',
'hr_employee_view.xml',
'hr_holidays_view.xml',
'wizard/hr_holidays_post_view.xml',
],
'installable': True,
}

View File

@@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields
import openerp.addons.decimal_precision as dp
class ResCompany(models.Model):
_inherit = 'res.company'
lunch_voucher_product_id = fields.Many2one(
'product.product', string='Lunch Voucher Product',
ondelete='restrict')
lunch_voucher_employer_price = fields.Float(
'Lunch Voucher Employer Price', digits=dp.get_precision('Account'))
# Add constrain to check that lunch_voucher_employer_price is between
# 50% and 60% of the price of lunch_voucher_product_id for France

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_company_form" model="ir.ui.view">
<field name="name">lunch_voucher.company.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<group name="account_grp" position="after">
<group name="lunch_voucher" string="Lunch Vouchers">
<field name="lunch_voucher_product_id"/>
<!-- <field name="lunch_voucher_po_type"/> -->
<field name="lunch_voucher_employer_price"/>
</group>
</group>
</field>
</record>
</data>
</openerp>

View File

@@ -1,12 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields
class HrEmployee(models.Model):
_inherit = 'hr.employee'
lunch_voucher = fields.Boolean(string="Has Lunch Vouchers", default=True)

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_employee_form_leave_inherit" model="ir.ui.view">
<field name="name">lunch_voucher.hr.employee.form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr_holidays_usability.view_employee_form_leave_inherit"/>
<field name="arch" type="xml">
<group name="holidays" position="inside">
<field name="lunch_voucher"/>
</group>
</field>
</record>
</data>
</openerp>

View File

@@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api
from dateutil.relativedelta import relativedelta
class HrHolidays(models.Model):
_inherit = 'hr.holidays'
lunch_voucher_id = fields.Many2one(
'lunch.voucher.attribution',
string="Related Lunch Voucher Attribution")
lunch_voucher_remove_qty = fields.Integer(
compute='_compute_lunch_voucher_remove_qty', readonly=True,
store=True, string='Lunch Vouchers to Deduct')
@api.depends('employee_id', 'vacation_date_from', 'vacation_date_to')
@api.multi
def _compute_lunch_voucher_remove_qty(self):
hhpo = self.env['hr.holidays.public']
for hol in self:
qty = 0
if (
hol.type == 'remove' and
hol.vacation_date_from and
hol.vacation_date_to):
start_date_dt = fields.Date.from_string(hol.vacation_date_from)
end_date_str = hol.vacation_date_to
date_dt = start_date_dt
# Remove 1 full LV when vacation_time_from == noon
# and also when vacation_time_to == noon
while True:
if (
date_dt.weekday() not in (5, 6) and
not hhpo.is_public_holiday(
date_dt, hol.employee_id.id)):
qty += 1
date_dt += relativedelta(days=1)
date_str = fields.Date.to_string(date_dt)
if date_str > end_date_str:
break
hol.lunch_voucher_remove_qty = qty

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="edit_holiday_new" model="ir.ui.view">
<field name="name">hr_holidays_lunch_voucher.leave_request_form</field>
<field name="model">hr.holidays</field>
<field name="inherit_id" ref="hr_holidays_usability.edit_holiday_new"/>
<field name="arch" type="xml">
<group name="counters" position="after">
<group name="lunch_vouchers" string="Lunch Vouchers" attrs="{'invisible': [('type', '!=', 'remove')]}">
<field name="lunch_voucher_remove_qty"/>
<field name="lunch_voucher_id"/>
</group>
</group>
</field>
</record>
<record id="view_holiday" model="ir.ui.view">
<field name="name">hr_holidays_lunch_voucher.leave_request_tree</field>
<field name="model">hr.holidays</field>
<field name="inherit_id" ref="hr_holidays_usability.view_holiday"/>
<field name="arch" type="xml">
<field name="number_of_days" position="after">
<field name="lunch_voucher_remove_qty" string="Lunch Vouchers -=" sum="Total"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api
class LunchVoucherAttribution(models.Model):
_name = 'lunch.voucher.attribution'
_description = 'Lunch Voucher Attribution'
_order = 'date desc'
employee_id = fields.Many2one(
'hr.employee', string='Employee', ondelete='restrict',
required=True, readonly=True)
company_id = fields.Many2one(
related='employee_id.resource_id.company_id', readonly=True,
store=True)
date = fields.Date('Attribution Date', readonly=True)
purchase_id = fields.Many2one(
'purchase.order', 'Purchase Order',
readonly=True)
month_work_days = fields.Integer(
'Month Work Days',
help="Number of work days of the month (without taking into "
"account the holidays)")
no_lunch_days = fields.Integer(
compute='_compute_qty', string='No Lunch Days',
readonly=True, store=True)
qty = fields.Integer(
compute='_compute_qty', readonly=True, store=True,
string='Lunch Voucher Quantity')
holiday_ids = fields.One2many(
'hr.holidays', 'lunch_voucher_id', readonly=True)
@api.depends('month_work_days', 'holiday_ids.lunch_voucher_remove_qty')
@api.multi
def _compute_qty(self):
for rec in self:
no_lunch_days = 0
for hol in rec.holiday_ids:
no_lunch_days += hol.lunch_voucher_remove_qty
rec.no_lunch_days = no_lunch_days
rec.qty = rec.month_work_days - no_lunch_days

View File

@@ -1,97 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="lunch_voucher_attribution_form" model="ir.ui.view">
<field name="name">lunch.voucher.attribution.form</field>
<field name="model">lunch.voucher.attribution</field>
<field name="arch" type="xml">
<form string="Lunch Vouchers Attribution">
<group name="main">
<field name="employee_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="date"/>
<field name="month_work_days"/>
<field name="no_lunch_days"/>
<field name="qty"/>
<field name="purchase_id"/>
</group>
<group name="holidays" string="Related Holidays">
<field name="holiday_ids" nolabel="1" context="{'tree_view_ref': 'hr_holidays_lunch_voucher.view_holiday', 'form_view_ref': 'hr_holidays_lunch_voucher.edit_holiday_new'}"/>
</group>
</form>
</field>
</record>
<record id="lunch_voucher_attribution_tree" model="ir.ui.view">
<field name="name">lunch.voucher.attribution.tree</field>
<field name="model">lunch.voucher.attribution</field>
<field name="arch" type="xml">
<tree string="Lunch Vouchers Attribution">
<field name="date"/>
<field name="employee_id"/>
<field name="month_work_days"/>
<field name="no_lunch_days" sum="Total"/>
<field name="qty" sum="Total"/>
<field name="purchase_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record id="lunch_voucher_attribution_search" model="ir.ui.view">
<field name="name">lunch.voucher.attribution.search</field>
<field name="model">lunch.voucher.attribution</field>
<field name="arch" type="xml">
<search string="Search Lunch Vouchers Attribution">
<field name="date"/>
<field name="employee_id"/>
<filter name="purchased" string="Purchased" domain="[('purchase_id', '!=', False)]"/>
<filter name="to_purchase" string="To Purchase" domain="[('purchase_id', '=', False)]"/>
<group string="Group By" name="groupby">
<filter name="employee_groupby" string="Employee" context="{'group_by': 'employee_id'}"/>
<filter name="purchase_order_groupby" string="Purchase Order" context="{'group_by': 'purchase_id'}"/>
</group>
</search>
</field>
</record>
<record id="lunch_voucher_attribution_graph" model="ir.ui.view">
<field name="name">lunch.voucher.attribution.graph</field>
<field name="model">lunch.voucher.attribution</field>
<field name="arch" type="xml">
<graph string="Lunch Vouchers Attribution" type="pivot">
<field name="date" type="row" interval="month"/>
<field name="qty" type="measure"/>
</graph>
</field>
</record>
<record id="lunch_voucher_attribution_action" model="ir.actions.act_window">
<field name="name">Lunch Voucher Attribution</field>
<field name="res_model">lunch.voucher.attribution</field>
<field name="view_mode">tree,form,graph</field>
</record>
<menuitem id="lunch_voucher_attribution_menu"
action="lunch_voucher_attribution_action"
parent="hr_holidays.menu_open_ask_holidays" sequence="200"/>
<act_window id="lunch_voucher_attribution_action_create_po"
multi="True"
key2="client_action_multi"
name="Create Purchase Order"
res_model="lunch.voucher.purchase"
src_model="lunch.voucher.attribution"
view_mode="form"
target="new" />
</data>
</openerp>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="lunch_voucher_product" model="product.product">
<field name="name">Lunch Vouchers</field>
<field name="categ_id" ref="product.product_category_all"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="True"/>
<field name="list_price">0</field>
<field name="standard_price">8</field>
<field name="type">service</field> <!-- For those who want to manage stock of lunch vouchers, they can switch type to product manually -->
<field name="uom_id" ref="product.product_uom_unit"/>
<field name="uom_po_id" ref="product.product_uom_unit"/>
<field name="supplier_taxes_id" eval="False"/>
<field name="taxes_id" eval="False"/>
</record>
<record id="base.main_company" model="res.company">
<field name="lunch_voucher_product_id" ref="lunch_voucher_product"/>
</record>
</data>
</openerp>

View File

@@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_lunch_voucher_attribution_full,Full access on lunch_voucher_attribution,model_lunch_voucher_attribution,base.group_hr_manager,1,1,1,1
access_lunch_voucher_attribution_read,Read access on lunch_voucher_attribution,model_lunch_voucher_attribution,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_lunch_voucher_attribution_full Full access on lunch_voucher_attribution model_lunch_voucher_attribution base.group_hr_manager 1 1 1 1
3 access_lunch_voucher_attribution_read Read access on lunch_voucher_attribution model_lunch_voucher_attribution base.group_user 1 0 0 0

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="lunch_voucher_attribution_employee" model="ir.rule">
<field name="name">Personal Lunch Voucher Attributions</field>
<field name="model_id" ref="hr_holidays_lunch_voucher.model_lunch_voucher_attribution"/>
<field name="domain_force">[('employee_id.user_id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="lunch_voucher_attribution_officer" model="ir.rule">
<field name="name">HR Officer sees all Lunch Voucher Attributions</field>
<field name="model_id" ref="hr_holidays_lunch_voucher.model_lunch_voucher_attribution"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_hr_manager'))]"/>
</record>
<record id="lunch_voucher_attribution_multicompany_rule" model="ir.rule">
<field name="name">Lunch Voucher Attribution multi-company</field>
<field name="model_id" ref="hr_holidays_lunch_voucher.model_lunch_voucher_attribution"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
</record>
</data>
</openerp>

View File

@@ -1,4 +0,0 @@
# -*- encoding: utf-8 -*-
from . import hr_holidays_post
from . import lunch_voucher_purchase

View File

@@ -1,74 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api
from dateutil.relativedelta import relativedelta
import logging
logger = logging.getLogger(__name__)
class HrHolidaysPost(models.TransientModel):
_inherit = 'hr.holidays.post'
lunch_voucher_po = fields.Boolean(
string='Generate Lunch Voucher Purchase Order')
work_days = fields.Integer(string='Work Days')
@api.model
def default_get(self, fields_list):
res = super(HrHolidaysPost, self).default_get(fields_list)
hhpo = self.env['hr.holidays.public']
company = self.env.user.company_id
if company.lunch_voucher_product_id:
res['lunch_voucher_po'] = True
today = fields.Date.context_today(self)
today_dt = fields.Date.from_string(today)
cur_month = today_dt.month
# last day of month
date_dt = today_dt + relativedelta(day=31)
work_days = date_dt.day
logger.info('Number of days in the month: %d', work_days)
# from last day of month to the first
while date_dt.month == cur_month:
if hhpo.is_public_holiday(date_dt):
work_days -= 1
logger.info(
"%s is a bank holiday, don't count", date_dt)
# if it's a saturday/sunday
elif date_dt.weekday() in (5, 6):
work_days -= 1
logger.info(
"%s is a saturday/sunday, don't count", date_dt)
date_dt += relativedelta(days=-1)
logger.info('Number of work days in the month: %d', work_days)
res['work_days'] = work_days
return res
@api.multi
def run(self):
self.ensure_one()
lvao = self.env['lunch.voucher.attribution']
today = fields.Date.context_today(self)
employees = self.env['hr.employee'].search([
('lunch_voucher', '=', True),
('company_id', '=', self.env.user.company_id.id),
])
lv_dict = {}
for employee in employees:
lv_dict[employee.id] = []
for hol in self.holidays_to_post_ids:
if not hol.lunch_voucher_id and hol.employee_id.id in lv_dict:
lv_dict[hol.employee_id.id].append(hol.id)
for employee_id, hol_ids in lv_dict.iteritems():
vals = {
'employee_id': employee_id,
'date': today,
'month_work_days': self.work_days,
}
if hol_ids:
vals['holiday_ids'] = [(6, 0, hol_ids)]
lvao.create(vals)
return super(HrHolidaysPost, self).run()

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="hr_holidays_post_form" model="ir.ui.view">
<field name="name">hr_holidays_post_form</field>
<field name="model">hr.holidays.post</field>
<field name="inherit_id" ref="hr_holidays_usability.hr_holidays_post_form"/>
<field name="arch" type="xml">
<field name="holidays_to_post_ids" position="before">
<field name="lunch_voucher_po" states="done"/>
<field name="work_days"
attrs="{'invisible': ['|', ('state', '!=', 'done'), ('lunch_voucher_po', '=', False)]}"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -1,77 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, api, _
from openerp.exceptions import Warning as UserError
class LunchVoucherPurchase(models.TransientModel):
_name = 'lunch.voucher.purchase'
_description = 'Purchase Lunch Vouchers Wizard'
@api.multi
def run(self):
self.ensure_one()
company = self.env.user.company_id
if not company.lunch_voucher_product_id:
raise UserError(_(
"Lunch Voucher Product not configured on company %s")
% company.name)
if not company.lunch_voucher_product_id.seller_id:
raise UserError(_(
"Missing supplier on Product '%s'.")
% company.lunch_voucher_product_id.name)
poo = self.env['purchase.order']
polo = self.env['purchase.order.line']
lvao = self.env['lunch.voucher.attribution']
assert self._context.get('active_model') ==\
'lunch.voucher.attribution', 'wrong source model'
assert self._context.get('active_ids'), 'missing active_ids in ctx'
lvouchers = lvao.browse(self._context['active_ids'])
total_qty = 0
for lvoucher in lvouchers:
if lvoucher.purchase_id:
raise UserError(_(
"One of the Lunch Voucher Attributions you selected "
"related to employee '%s' is already linked to a "
"purchase order.") % lvoucher.employee_id.name)
if lvoucher.qty < 0:
raise UserError(_(
"One of the Lunch Voucher Attributions you selected "
"related to employee '%s' has a negative quantity.")
% lvoucher.employee_id.name)
total_qty += lvoucher.qty
supplier = company.lunch_voucher_product_id.seller_id
pick_type_id = poo.default_get(['picking_type_id'])['picking_type_id']
onchange_ptype_vals = poo.browse(False).onchange_picking_type_id(
pick_type_id)
vals = onchange_ptype_vals['value']
onchange_vals = poo.browse(False).onchange_partner_id(supplier.id)
vals.update(onchange_vals['value'])
vals['partner_id'] = supplier.id
product = company.lunch_voucher_product_id
onchange_product_vals = polo.browse(False).onchange_product_id(
vals.get('pricelist_id'), product.id, total_qty, False,
supplier.id, fiscal_position_id=vals.get('fiscal_position_id'))
lvals = onchange_product_vals['value']
lvals['product_id'] = product.id
lvals['product_qty'] = total_qty
if lvals['taxes_id']:
lvals['taxes_id'] = [(6, 0, lvals['taxes_id'])]
vals['order_line'] = [(0, 0, lvals)]
po = poo.create(vals)
lvouchers.write({'purchase_id': po.id})
action = self.env['ir.actions.act_window'].for_xml_id(
'purchase', 'purchase_rfq')
action.update({
'res_id': po.id,
'view_mode': 'form,tree',
'views': False,
})
return action

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="lunch_voucher_purchase_form" model="ir.ui.view">
<field name="name">lunch_voucher_purchase_form</field>
<field name="model">lunch.voucher.purchase</field>
<field name="arch" type="xml">
<form string="Create Purchase Order of Lunch Vouchers">
<group name="main">
<label string="Click on the button below to create the purchase order for the selected lunch vouchers attributions." colspan="2"/>
</group>
<footer>
<button name="run" type="object" string="Create"
class="oe_highlight"/>
<button special="cancel" string="Cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<record id="lunch_voucher_purchase_action" model="ir.actions.act_window">
<field name="name">Create PO for Lunch Vouchers</field>
<field name="res_model">lunch.voucher.purchase</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from . import company
from . import wizard

View File

@@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'HR Holidays Lunch Voucher Natixis',
'version': '8.0.1.0.0',
'category': 'Human Resources',
'license': 'AGPL-3',
'summary': 'Generate order file for Natixis lunch vouchers',
'description': '',
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['hr_holidays_lunch_voucher'],
'data': [
'company_view.xml',
],
'installable': True,
}

View File

@@ -1,15 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields
class ResCompany(models.Model):
_inherit = 'res.company'
lunch_voucher_natixis_customer_code = fields.Char(
string='Natixis Customer Ref', size=7)
lunch_voucher_natixis_delivery_code = fields.Char(
string='Natixis Delivery Code', size=7)

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_company_form" model="ir.ui.view">
<field name="name">natixis.lunch_voucher.company.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="hr_holidays_lunch_voucher.view_company_form"/>
<field name="arch" type="xml">
<group name="lunch_voucher" position="inside">
<field name="lunch_voucher_natixis_customer_code"/>
<field name="lunch_voucher_natixis_delivery_code"/>
</group>
</field>
</record>
</data>
</openerp>

View File

@@ -1,3 +0,0 @@
# -*- encoding: utf-8 -*-
from . import lunch_voucher_purchase

View File

@@ -1,92 +0,0 @@
# -*- coding: utf-8 -*-
# © 2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, fields, api, _
from openerp.exceptions import Warning as UserError
from openerp.tools import float_is_zero
class LunchVoucherPurchase(models.TransientModel):
_inherit = 'lunch.voucher.purchase'
@api.multi
def run(self):
self.ensure_one()
action = super(LunchVoucherPurchase, self).run()
company = self.env.user.company_id
# force_company to read standard_price properly
company = company.with_context(force_company=company.id)
lvao = self.env['lunch.voucher.attribution']
assert self._context.get('active_model')\
== 'lunch.voucher.attribution', 'wrong source model'
assert self._context.get('active_ids'), 'missing active_ids in ctx'
if not company.lunch_voucher_natixis_customer_code:
raise UserError(_(
"Missing Natixis Customer Ref on company '%s'.")
% company.name)
if not company.lunch_voucher_natixis_delivery_code:
raise UserError(_(
"Missing Natixis Delivery Code on company '%s'.")
% company.name)
if len(company.lunch_voucher_natixis_customer_code) != 7:
raise UserError(_(
"Natixis Customer Ref '%s' on company '%s' should "
"have 7 characters/digits.")
% (company.lunch_voucher_natixis_customer_code, company.name))
if len(company.lunch_voucher_natixis_delivery_code) != 7:
raise UserError(_(
"Natixis Delivery Code on company '%s' should "
"have 7 characters/digits.")
% (company.lunch_voucher_natixis_delivery_code, company.name))
if float_is_zero(
company.lunch_voucher_employer_price,
precision_digits=2):
raise UserError(_(
"Lunch Voucher Employer Price not set on company '%s'.")
% company.name)
if float_is_zero(
company.lunch_voucher_product_id.standard_price,
precision_digits=2):
raise UserError(_(
"Lunch Voucher Standard Price is not set on product '%s'.")
% company.lunch_voucher_product_id.display_name)
lvouchers = lvao.browse(self._context['active_ids'])
of = u''
tmp = {}
for lvoucher in lvouchers:
if lvoucher.qty > 0:
if lvoucher.qty not in tmp:
tmp[lvoucher.qty] = 1
else:
tmp[lvoucher.qty] += 1
for vouchers_per_pack, pack_qty in tmp.iteritems():
if vouchers_per_pack > 99:
raise UserError(_(
"Cannot order more than 99 vouchers per pack"))
line = u'%s%s%s%s%s%s%s%s\n' % (
company.lunch_voucher_natixis_delivery_code,
company.lunch_voucher_natixis_customer_code,
unicode(pack_qty).zfill(3),
unicode(vouchers_per_pack).zfill(2),
unicode(pack_qty * vouchers_per_pack).zfill(5),
'{:05.2f}'.format(
company.lunch_voucher_product_id.standard_price),
'{:05.2f}'.format(company.lunch_voucher_employer_price),
' ' * 64)
of += line
today_dt = fields.Date.from_string(
fields.Date.context_today(self))
filename = 'E%s_%s.txt' % (
company.lunch_voucher_natixis_customer_code,
today_dt.strftime('%d%m%Y'))
self.env['ir.attachment'].create({
'name': filename,
'res_id': action['res_id'],
'res_model': 'purchase.order',
'datas': of.encode('base64'),
'datas_fname': filename,
'type': 'binary',
})
return action

View File

@@ -241,10 +241,6 @@ class HrHolidays(models.Model):
string='Public Title', string='Public Title',
help="Warning: this title is shown publicly in the " help="Warning: this title is shown publicly in the "
"calendar. Don't write private/personnal information in this field.") "calendar. Don't write private/personnal information in this field.")
# by default, there is no company_id field on hr.holidays !
company_id = fields.Many2one(
related='employee_id.resource_id.company_id', store=True,
readonly=True)
@api.one @api.one
@api.constrains( @api.constrains(

View File

@@ -61,7 +61,6 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
</group> </group>
</field> </field>
<field name="department_id" position="after"> <field name="department_id" position="after">
<field name="company_id" groups="base.group_multi_company"/>
<field name="posted_date" groups="base.group_hr_manager"/> <field name="posted_date" groups="base.group_hr_manager"/>
</field> </field>
</field> </field>
@@ -91,7 +90,6 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
</field> </field>
<field name="holiday_status_id" position="after"> <field name="holiday_status_id" position="after">
<field name="posted_date" groups="base.group_hr_manager"/> <field name="posted_date" groups="base.group_hr_manager"/>
<field name="company_id" groups="base.group_multi_company"/>
</field> </field>
</field> </field>
</record> </record>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<openerp> <openerp>
<data noupdate="1"> <data noupdate="0">
<!-- <!--
Employee : only see his holidays Employee : only see his holidays
@@ -41,12 +41,5 @@ Manager = person that administrates the holidays process : can see everything, d
<field name="groups" eval="[(4, ref('base.group_hr_manager'))]"/> <field name="groups" eval="[(4, ref('base.group_hr_manager'))]"/>
</record> </record>
<record id="hr_holidays_multicompany_rule" model="ir.rule">
<field name="name">Holidays multi-company</field>
<field name="model_id" ref="hr_holidays.model_hr_holidays"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@@ -31,9 +31,7 @@ class HrHolidaysMassAllocation(models.TransientModel):
@api.model @api.model
def _default_employees(self): def _default_employees(self):
return self.env['hr.employee'].search([ return self.env['hr.employee'].search([
('holiday_exclude_mass_allocation', '=', False), ('holiday_exclude_mass_allocation', '=', False)])
('company_id', '=', self.env.user.company_id.id),
])
@api.model @api.model
def _get_default_holiday_status(self): def _get_default_holiday_status(self):

View File

@@ -56,7 +56,6 @@ class HrHolidaysPost(models.TransientModel):
('state', '=', 'validate'), ('state', '=', 'validate'),
('posted_date', '=', False), ('posted_date', '=', False),
('vacation_date_to', '<=', self.before_date), ('vacation_date_to', '<=', self.before_date),
('company_id', '=', self.env.user.company_id.id),
]) ])
self.write({ self.write({
'state': 'done', 'state': 'done',
@@ -74,11 +73,9 @@ class HrHolidaysPost(models.TransientModel):
# because, after the write, it doesn't have a value any more !!! # because, after the write, it doesn't have a value any more !!!
holidays_to_post = self.holidays_to_post_ids holidays_to_post = self.holidays_to_post_ids
today = fields.Date.context_today(self) today = fields.Date.context_today(self)
# Disable the raise below to make the module "hr_holidays_lunch_voucher" if not self.holidays_to_post_ids:
# work even when nobody took holidays on the current month raise Warning(
# if not self.holidays_to_post_ids: _('No leave request to post.'))
# raise Warning(
# _('No leave request to post.'))
self.holidays_to_post_ids.write({'posted_date': today}) self.holidays_to_post_ids.write({'posted_date': today})
view_id = self.env.ref('hr_holidays_usability.hr_holiday_graph').id view_id = self.env.ref('hr_holidays_usability.hr_holiday_graph').id
action = { action = {

View File

@@ -12,13 +12,13 @@
<field name="name">hr_holidays_post_form</field> <field name="name">hr_holidays_post_form</field>
<field name="model">hr.holidays.post</field> <field name="model">hr.holidays.post</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Post Leaves"> <form string="Post Leaves" version="7.0">
<group name="main" string="Leave Requests to Post"> <group name="main" string="Leave Requests to Post">
<field name="state" invisible="1"/> <field name="state" invisible="1"/>
<field name="before_date" states="draft"/> <field name="before_date" states="draft"/>
<field name="holidays_to_post_ids" nolabel="1" <field name="holidays_to_post_ids" nolabel="1"
context="{'tree_view_ref': 'hr_holidays.view_holiday'}" context="{'tree_view_ref': 'hr_holidays.view_holiday'}"
states="done" colspan="2"/> states="done"/>
</group> </group>
<footer> <footer>
<button name="select_date" type="object" string="Get Holiday Requests" <button name="select_date" type="object" string="Get Holiday Requests"

View File

@@ -23,7 +23,7 @@
{ {
'name': 'Mail Usability', 'name': 'Mail Usability',
'version': '8.0.1.0.0', 'version': '0.1',
'category': 'Base', 'category': 'Base',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Usability improvements on mails', 'summary': 'Usability improvements on mails',
@@ -37,11 +37,10 @@ Small usability improvements on mails:
* remove 'sent by' in notification footer * remove 'sent by' in notification footer
* add a new entry *All Messages Except Notifications* to the field *Receive Inbox Notifications by Email* of partners (becomes the default value)
""", """,
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com', 'website': 'http://www.akretion.com',
'depends': ['mail'], 'depends': ['mail'],
'data': ['views/mail.xml'], 'data': [],
'installable': True, 'installable': True,
} }

View File

@@ -20,16 +20,7 @@
# #
############################################################################## ##############################################################################
from openerp import models, fields, api from openerp import models, api
class ResPartner(models.Model):
_inherit = 'res.partner'
notify_email = fields.Selection(
selection_add=[
('all_except_notification', 'All Messages Except Notifications')],
default='all_except_notification')
class MailMail(models.Model): class MailMail(models.Model):
@@ -56,19 +47,6 @@ class MailNotification(models.Model):
footer = super(MailNotification, self).get_signature_footer( footer = super(MailNotification, self).get_signature_footer(
cr, uid, user_id, res_model=res_model, res_id=res_id, cr, uid, user_id, res_model=res_model, res_id=res_id,
context=context, user_signature=user_signature) context=context, user_signature=user_signature)
footer = footer[:footer.find('\n<br /><small>Sent by ')] footer = footer[:footer.find('\n\n<br /><small>Sent by ')]
footer = footer[:footer.find(u'\n<br /><small>Envoyé par ')] footer = footer[:footer.find(u'\n\n<br /><small>Envoyé par ')]
return footer return footer
@api.multi
def get_partners_to_email(self, message):
notify_pids = super(MailNotification, self).get_partners_to_email(
message)
for notif in self:
if (
notif.partner_id.id in notify_pids and
message.type == 'notification' and
notif.partner_id.notify_email ==
'all_except_notification'):
notify_pids.remove(notif.partner_id.id)
return notify_pids

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -1,92 +0,0 @@
openerp_FieldMany2ManyTagsEmail = function(instance) {
var _t = instance.web._t;
/**
* Extend of FieldMany2ManyTags widget method.
* When the user add a partner and the partner don't have an email, open a popup to purpose to add an email.
* The user can choose to add an email or cancel and close the popup.
*/
instance.web.form.FieldMany2ManyTagsEmail = instance.web.form.FieldMany2ManyTags.extend({
start: function() {
this.mutex = new openerp.Mutex();
// This widget will indirectly trigger a change:value to it's parent widget
// when setting the value of valid partners. For this reason we have to keep an
// internal state of the last value in order to compute the effective value changes.
this.last_processed_value = [];
this.on("change:value", this, this.on_change_value_check);
// Restore pop-up when trying to send to a partner without email
this.on_change_value_check();
this._super.apply(this, arguments);
},
on_change_value_check : function () {
var self = this;
var values = this.get('value').slice(0); // Clone the array
// We only validate partners emails in case the value is not empty
// and is different from the last processed value
var effective_change = _.difference(values, self.last_processed_value).length;
if (values.length && effective_change) {
this.mutex.exec(function() {
return self._check_email_popup(values);
});
}
},
_check_email_popup: function (ids) {
var self = this;
var valid_partners;
new instance.web.Model('res.partner').call("search", [[
["id", "in", ids],
["email", "=", false],
["notify_email", "in", ['always', 'all_except_notification']]]],
{context: this.build_context()})
.then(function (record_ids) {
var popups_deferreds = [];
self.valid_partners = _.difference(ids, record_ids);
// Propose the user to correct invalid partners
_.each(record_ids, function (id) {
var popup_def = $.Deferred();
popups_deferreds.push(popup_def);
var pop = new instance.web.form.FormOpenPopup(self);
pop.show_element(
'res.partner',
id,
self.build_context(),
{
title: _t("Please complete partner's informations and Email"),
}
);
pop.on('write_completed', self, function () {
self.valid_partners.push(id);
});
pop.on('closed', self, function () {
popup_def.resolve();
});
});
return $.when.apply($, popups_deferreds).then(function() {
// All popups have been processed for the given ids
// It is now time to set the final value with valid partners ids.
var filtered_value = _.uniq(self.valid_partners);
self.last_processed_value = filtered_value;
self.set({'value': filtered_value});
});
});
},
});
/**
* Registry of form fields
*/
instance.web.form.widgets = instance.web.form.widgets.extend({
'many2many_tags_email' : 'instance.web.form.FieldMany2ManyTagsEmail',
});
};

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="assets_backend" name="mail usability assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/mail_usability/static/src/js/many2many_tags_email.js"></script>
</xpath>
</template>
</data>
</openerp>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -40,27 +40,31 @@ class ResPartner(models.Model):
def open_aged_open_invoices_report(self): def open_aged_open_invoices_report(self):
aoiwo = self.env['aged.open.invoices.webkit'] aoiwo = self.env['aged.open.invoices.webkit']
afo = self.env['account.fiscalyear'] afo = self.env['account.fiscalyear']
# Filter by period (and not by date) to get # Force 'date_from' to the first day of the company's life
# the report à nouveau # in order to get the full picture of the partner's account
# (we could also do that via a filter by period, but, in this case,
# account_financial_report_webkit doesn't accept "until_date = today" ;
# until_date has to be the end date of the last period
fy_years = afo.search([], order='date_start') fy_years = afo.search([], order='date_start')
date_from = fy_years[0].date_start date_from = fy_years[0].date_start
fy_id = aoiwo._get_fiscalyear() fy_id = aoiwo._get_fiscalyear()
filter_change = aoiwo.onchange_filter( filter_change = aoiwo.onchange_filter(
filter='filter_period', fiscalyear_id=fy_id) filter='filter_date', fiscalyear_id=fy_id)
vals = { vals = {
'fiscalyear_id': fy_id, 'fiscalyear_id': fy_id,
'filter': 'filter_period', 'filter': 'filter_date',
'partner_ids': [(6, 0, [self.commercial_partner_id.id])], 'partner_ids': [(6, 0, [self.commercial_partner_id.id])],
'target_move': 'all', 'target_move': 'all',
} }
vals.update(filter_change['value']) vals.update(filter_change['value'])
vals['date_from'] = date_from
wizard = aoiwo.create(vals) wizard = aoiwo.create(vals)
data = {'form': { data = {'form': {
'chart_account_id': wizard.chart_account_id.id, 'chart_account_id': wizard.chart_account_id.id,
'filter': vals['filter'], 'filter': vals['filter'],
'period_from': vals['period_from'], 'date_from': vals['date_from'],
'period_to': vals['period_to'], 'date_to': vals['date_to'],
'date_to': False, 'period_to': False,
'fiscalyear_id': vals['fiscalyear_id'], 'fiscalyear_id': vals['fiscalyear_id'],
'partner_ids': vals['partner_ids'][0][2], 'partner_ids': vals['partner_ids'][0][2],
'target_move': vals['target_move'], 'target_move': vals['target_move'],

Some files were not shown because too many files have changed in this diff Show More