[MERGE]sync with trunk

bzr revid: sgo@tinyerp.com-20130312051713-cph3m3pjozii3jwn
bzr revid: sgo@tinyerp.com-20130314130046-3bi97qv1628co8i3
This commit is contained in:
sgo@tinyerp.com 2013-03-14 18:30:46 +05:30
commit 32cb2a3509
34 changed files with 1464 additions and 122 deletions

View File

@ -922,7 +922,7 @@
</group> </group>
<group string="Invoices"> <group string="Invoices">
<field name="account_collected_id" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/> <field name="account_collected_id" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="account_analytic_collected_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', company_id), ('parent_id', '&lt;&gt;', False)]" groups="analytic.group_analytic_accounting"/> <field name="account_analytic_collected_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="base_code_id"/> <field name="base_code_id"/>
<field name="base_sign"/> <field name="base_sign"/>
@ -932,7 +932,7 @@
</group> </group>
<group string="Refunds"> <group string="Refunds">
<field name="account_paid_id" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/> <field name="account_paid_id" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="account_analytic_paid_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', company_id), ('parent_id', '&lt;&gt;', False)]" groups="analytic.group_analytic_accounting"/> <field name="account_analytic_paid_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="ref_base_code_id"/> <field name="ref_base_code_id"/>
<field name="ref_base_sign"/> <field name="ref_base_sign"/>
@ -1039,7 +1039,7 @@
<field name="blocked"/> <field name="blocked"/>
</group> </group>
<group groups="analytic.group_analytic_accounting" string="Analytic"> <group groups="analytic.group_analytic_accounting" string="Analytic">
<field name="analytic_account_id" domain="[('parent_id','!=',False)]"/> <field name="analytic_account_id" domain="[('type','in',('normal','contract'))]"/>
</group> </group>
</group> </group>
<field name="narration" colspan="4" nolabel="1" placeholder="Add an internal note..."/> <field name="narration" colspan="4" nolabel="1" placeholder="Add an internal note..."/>
@ -1084,7 +1084,7 @@
<field name="blocked"/> <field name="blocked"/>
<newline/> <newline/>
<field name="account_tax_id" domain="[('parent_id','=',False)]"/> <field name="account_tax_id" domain="[('parent_id','=',False)]"/>
<field name="analytic_account_id" domain="[('parent_id','!=',False)]" groups="analytic.group_analytic_accounting"/> <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<separator colspan="4" string="Status"/> <separator colspan="4" string="Status"/>
<newline/> <newline/>
<field name="reconcile_id"/> <field name="reconcile_id"/>
@ -1336,7 +1336,7 @@
</group> </group>
<group groups="analytic.group_analytic_accounting" string="Analytic"> <group groups="analytic.group_analytic_accounting" string="Analytic">
<field name="analytic_account_id" domain="[('parent_id','!=',False)]"/> <field name="analytic_account_id"/>
</group> </group>
</group> </group>
<separator string="Internal Note"/> <separator string="Internal Note"/>
@ -1355,7 +1355,7 @@
<field name="date_maturity"/> <field name="date_maturity"/>
<field name="debit" sum="Total Debit"/> <field name="debit" sum="Total Debit"/>
<field name="credit" sum="Total Credit"/> <field name="credit" sum="Total Credit"/>
<field name="analytic_account_id" domain="[('parent_id','!=',False)]" groups="analytic.group_analytic_accounting"/> <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="amount_currency"/> <field name="amount_currency"/>
<field name="currency_id" groups="base.group_multi_currency"/> <field name="currency_id" groups="base.group_multi_currency"/>
<field name="tax_code_id"/> <field name="tax_code_id"/>

View File

@ -11,8 +11,8 @@
<field name="complete_name"/> <field name="complete_name"/>
<field name="partner_id"/> <field name="partner_id"/>
<field name="code"/> <field name="code"/>
<field name="date"/>
<field name="date_start"/> <field name="date_start"/>
<field name="date"/>
<field name="user_id" invisible="1"/> <field name="user_id" invisible="1"/>
<field name="manager_id"/> <field name="manager_id"/>
<field name="parent_id" invisible="1"/> <field name="parent_id" invisible="1"/>

View File

@ -0,0 +1,23 @@
# Spanish (Colombia) translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-03-11 19:01+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish (Colombia) <es_CO@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-03-12 04:47+0000\n"
"X-Generator: Launchpad (build 16524)\n"
#. module: account_accountant
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
msgid "Open Accounting Menu"
msgstr "Abrir Menú de Contabilidad"

View File

@ -45,6 +45,7 @@ Adds menu to show relevant information to each manager.You can also view the rep
'static/src/css/analytic.css' 'static/src/css/analytic.css'
], ],
'demo': ['analytic_account_demo.xml'], 'demo': ['analytic_account_demo.xml'],
'test': ['test/account_analytic_analysis.yml'],
'installable': True, 'installable': True,
'auto_install': False, 'auto_install': False,
} }

View File

@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################## ##############################################################################
from dateutil.relativedelta import relativedelta
import datetime import datetime
import logging import logging
import time import time
@ -31,6 +32,58 @@ from openerp.addons.decimal_precision import decimal_precision as dp
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class account_analytic_invoice_line(osv.osv):
_name = "account.analytic.invoice.line"
def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict, context=None):
res = {}
for line in self.browse(cr, uid, ids, context=context):
res[line.id] = line.quantity * line.price_unit
if line.analytic_account_id.pricelist_id:
cur = line.analytic_account_id.pricelist_id.currency_id
res[line.id] = self.pool.get('res.currency').round(cr, uid, cur, res[line.id])
return res
_columns = {
'product_id': fields.many2one('product.product','Product',required=True),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'name': fields.text('Description', required=True),
'quantity': fields.float('Quantity', required=True),
'uom_id': fields.many2one('product.uom', 'Unit of Measure',required=True),
'price_unit': fields.float('Unit Price', required=True),
'price_subtotal': fields.function(_amount_line, string='Sub Total', type="float",digits_compute= dp.get_precision('Account')),
}
_defaults = {
'quantity' : 1,
}
def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name='', partner_id=False, price_unit=False, pricelist_id=False, company_id=None, context=None):
context = context or {}
uom_obj = self.pool.get('product.uom')
company_id = company_id or False
context.update({'company_id': company_id, 'force_company': company_id, 'pricelist_id': pricelist_id})
if not product:
return {'value': {'price_unit': 0.0}, 'domain':{'product_uom':[]}}
if partner_id:
part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
if part.lang:
context.update({'lang': part.lang})
result = {}
res = self.pool.get('product.product').browse(cr, uid, product, context=context)
result.update({'name':res.partner_ref or False,'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0})
if res.description:
result['name'] += '\n'+res.description
res_final = {'value':result}
if result['uom_id'] != res.uom_id.id:
selected_uom = uom_obj.browse(cr, uid, result['uom_id'], context=context)
new_price = uom_obj._compute_price(cr, uid, res.uom_id.id, res_final['value']['price_unit'], result['uom_id'])
res_final['value']['price_unit'] = new_price
return res_final
class account_analytic_account(osv.osv): class account_analytic_account(osv.osv):
_name = "account.analytic.account" _name = "account.analytic.account"
_inherit = "account.analytic.account" _inherit = "account.analytic.account"
@ -215,6 +268,8 @@ class account_analytic_account(osv.osv):
GROUP BY account_analytic_line.account_id", (child_ids,)) GROUP BY account_analytic_line.account_id", (child_ids,))
for account_id, sum in cr.fetchall(): for account_id, sum in cr.fetchall():
res[account_id] = round(sum,2) res[account_id] = round(sum,2)
for acc in self.browse(cr, uid, res.keys(), context=context):
res[acc.id] = res[acc.id] - (acc.timesheet_ca_invoiced or 0.0)
res_final = res res_final = res
return res_final return res_final
@ -295,7 +350,7 @@ class account_analytic_account(osv.osv):
res = {} res = {}
for account in self.browse(cr, uid, ids, context=context): for account in self.browse(cr, uid, ids, context=context):
res[account.id] = 0.0 res[account.id] = 0.0
sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('partner_id', '=', account.partner_id.id)], context=context) sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('state', '=', 'manual')], context=context)
for sale in sale_obj.browse(cr, uid, sale_ids, context=context): for sale in sale_obj.browse(cr, uid, sale_ids, context=context):
if not sale.invoiced: if not sale.invoiced:
res[account.id] += sale.amount_untaxed res[account.id] += sale.amount_untaxed
@ -456,6 +511,22 @@ class account_analytic_account(osv.osv):
'invoiced_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Invoiced"), 'invoiced_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Invoiced"),
'remaining_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Remaining", help="Expectation of remaining income for this contract. Computed as the sum of remaining subtotals which, in turn, are computed as the maximum between '(Estimation - Invoiced)' and 'To Invoice' amounts"), 'remaining_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Remaining", help="Expectation of remaining income for this contract. Computed as the sum of remaining subtotals which, in turn, are computed as the maximum between '(Estimation - Invoiced)' and 'To Invoice' amounts"),
'toinvoice_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total to Invoice", help=" Sum of everything that could be invoiced for this contract."), 'toinvoice_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total to Invoice", help=" Sum of everything that could be invoiced for this contract."),
'recurring_invoice_line_ids': fields.one2many('account.analytic.invoice.line', 'analytic_account_id', 'Invoice Lines'),
'recurring_invoices' : fields.boolean('Generate recurring invoices automatically'),
'recurring_rule_type': fields.selection([
('daily', 'Day(s)'),
('weekly', 'Week(s)'),
('monthly', 'Month(s)'),
('yearly', 'Year(s)'),
], 'Recurrency', help="Invoice automatically repeat at specified interval"),
'recurring_interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"),
'recurring_next_date': fields.date('Date of Next Invoice'),
}
_defaults = {
'recurring_interval': 1,
'recurring_next_date': lambda *a: time.strftime('%Y-%m-%d'),
'recurring_rule_type':'monthly'
} }
def open_sale_order_lines(self,cr,uid,ids,context=None): def open_sale_order_lines(self,cr,uid,ids,context=None):
@ -478,17 +549,38 @@ class account_analytic_account(osv.osv):
def on_change_template(self, cr, uid, ids, template_id, context=None): def on_change_template(self, cr, uid, ids, template_id, context=None):
if not template_id: if not template_id:
return {} return {}
obj_analytic_line = self.pool.get('account.analytic.invoice.line')
res = super(account_analytic_account, self).on_change_template(cr, uid, ids, template_id, context=context) res = super(account_analytic_account, self).on_change_template(cr, uid, ids, template_id, context=context)
if template_id and 'value' in res:
template = self.browse(cr, uid, template_id, context=context) template = self.browse(cr, uid, template_id, context=context)
res['value']['fix_price_invoices'] = template.fix_price_invoices invoice_line_ids = []
res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets for x in template.recurring_invoice_line_ids:
res['value']['hours_qtt_est'] = template.hours_qtt_est invoice_line_ids.append((0, 0, {
res['value']['amount_max'] = template.amount_max 'product_id': x.product_id.id,
res['value']['to_invoice'] = template.to_invoice.id 'uom_id': x.uom_id.id,
res['value']['pricelist_id'] = template.pricelist_id.id 'name': x.name,
'quantity': x.quantity,
'price_unit': x.price_unit,
'analytic_account_id': x.analytic_account_id and x.analytic_account_id.id or False,
}))
res['value']['fix_price_invoices'] = template.fix_price_invoices
res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets
res['value']['hours_qtt_est'] = template.hours_qtt_est
res['value']['amount_max'] = template.amount_max
res['value']['to_invoice'] = template.to_invoice.id
res['value']['pricelist_id'] = template.pricelist_id.id
res['value']['recurring_invoices'] = template.recurring_invoices
res['value']['recurring_interval'] = template.recurring_interval
res['value']['recurring_rule_type'] = template.recurring_rule_type
res['value']['recurring_invoice_line_ids'] = invoice_line_ids
return res return res
def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None):
value = {}
if date_start and recurring_invoices:
value = {'value': {'recurring_next_date': date_start}}
return value
def cron_account_analytic_account(self, cr, uid, context=None): def cron_account_analytic_account(self, cr, uid, context=None):
if context is None: if context is None:
context = {} context = {}
@ -527,10 +619,101 @@ class account_analytic_account(osv.osv):
for user_id, data in remind.items(): for user_id, data in remind.items():
context["data"] = data context["data"] = data
_logger.debug("Sending reminder to uid %s", user_id) _logger.debug("Sending reminder to uid %s", user_id)
self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, context=context) self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, force_send=True, context=context)
return True return True
def onchange_invoice_on_timesheets(self, cr, uid, ids, invoice_on_timesheets, context=None):
if not invoice_on_timesheets:
return {}
result = {'value': {'use_timesheets': True}}
try:
to_invoice = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr_timesheet_invoice', 'timesheet_invoice_factor1')
result['value']['to_invoice'] = to_invoice[1]
except ValueError:
pass
return result
def _prepare_invoice(self, cr, uid, contract, context=None):
context = context or {}
inv_obj = self.pool.get('account.invoice')
journal_obj = self.pool.get('account.journal')
fpos_obj = self.pool.get('account.fiscal.position')
if not contract.partner_id:
raise osv.except_osv(_('No Customer Defined !'),_("You must first select a Customer for Contract %s!") % contract.name )
fpos = contract.partner_id.property_account_position.id or False
journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1)
if not journal_ids:
raise osv.except_osv(_('Error!'),
_('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', ))
partner_payment_term = contract.partner_id.property_payment_term and contract.partner_id.property_payment_term.id or False
inv_data = {
'reference': contract.code or False,
'account_id': contract.partner_id.property_account_receivable.id,
'type': 'out_invoice',
'partner_id': contract.partner_id.id,
'currency_id': contract.partner_id.property_product_pricelist.id or False,
'journal_id': len(journal_ids) and journal_ids[0] or False,
'date_invoice': contract.recurring_next_date,
'origin': contract.name,
'fiscal_position': fpos,
'payment_term': partner_payment_term,
'company_id': contract.company_id.id or False,
}
invoice_id = inv_obj.create(cr, uid, inv_data, context=context)
for line in contract.recurring_invoice_line_ids:
res = line.product_id
account_id = res.property_account_income.id
if not account_id:
account_id = res.categ_id.property_account_income_categ.id
account_id = fpos_obj.map_account(cr, uid, fpos, account_id)
taxes = res.taxes_id and res.taxes_id or False
tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes)
invoice_line_vals = {
'name': line.name,
'account_id': account_id,
'account_analytic_id': contract.id,
'price_unit': line.price_unit or 0.0,
'quantity': line.quantity,
'uos_id': line.uom_id.id or False,
'product_id': line.product_id.id or False,
'invoice_id' : invoice_id,
'invoice_line_tax_id': [(6, 0, tax_id)],
}
self.pool.get('account.invoice.line').create(cr, uid, invoice_line_vals, context=context)
inv_obj.button_compute(cr, uid, [invoice_id], context=context)
return invoice_id
def recurring_create_invoice(self, cr, uid, automatic=False, context=None):
context = context or {}
current_date = time.strftime('%Y-%m-%d')
contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)])
for contract in self.browse(cr, uid, contract_ids, context=context):
invoice_id = self._prepare_invoice(cr, uid, contract, context=context)
next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d")
interval = contract.recurring_interval
if contract.recurring_rule_type == 'daily':
new_date = next_date+relativedelta(days=+interval)
elif contract.recurring_rule_type == 'weekly':
new_date = next_date+relativedelta(weeks=+interval)
else:
new_date = next_date+relativedelta(months=+interval)
self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context)
return True
class account_analytic_account_summary_user(osv.osv): class account_analytic_account_summary_user(osv.osv):
_name = "account_analytic_analysis.summary.user" _name = "account_analytic_analysis.summary.user"
_description = "Hours Summary by User" _description = "Hours Summary by User"

View File

@ -73,5 +73,16 @@ Hello ${object.name},
<field name="function" eval="'cron_account_analytic_account'"/> <field name="function" eval="'cron_account_analytic_account'"/>
<field name="args" eval="'()'" /> <field name="args" eval="'()'" />
</record> </record>
<record model="ir.cron" id="account_analytic_cron_for_invoice">
<field name="name">Generate Recurring Invoices from Contracts</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="model" eval="'account.analytic.account'"/>
<field name="function" eval="'recurring_create_invoice'"/>
<field name="args" eval="'()'"/>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -5,6 +5,15 @@
<field name="name">Sales Orders</field> <field name="name">Sales Orders</field>
<field name="res_model">sale.order</field> <field name="res_model">sale.order</field>
<field name="src_model">account.analytic.account</field> <field name="src_model">account.analytic.account</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a quotation that can be converted into a sales
order.
</p><p>
Use sale orders to track everything that should be invoiced
at a fix price on a contract.
</p>
</field>
</record> </record>
<!-- Inherited Analytic Account form for contracts --> <!-- Inherited Analytic Account form for contracts -->
@ -26,6 +35,9 @@
</div> </div>
</div> </div>
</xpath> </xpath>
<field name="partner_id" position="attributes">
<attribute name="attrs">{'required': [('type','=','contract'),'|','|',('fix_price_invoices','=',True), ('invoice_on_timesheets', '=', True), ('recurring_invoices', '=', True)]}</attribute>
</field>
<xpath expr='//group[@name="invoice_on_timesheets"]' position="replace"> <xpath expr='//group[@name="invoice_on_timesheets"]' position="replace">
</xpath> </xpath>
<xpath expr='//separator[@name="description"]' position='before'> <xpath expr='//separator[@name="description"]' position='before'>
@ -62,20 +74,20 @@
or view or view
</span> </span>
<span attrs="{'invisible': ['|',('fix_price_to_invoice','&lt;&gt;',0.0 ),('partner_id','=',False)]}" class="oe_grey"> <span attrs="{'invisible': [('fix_price_to_invoice','&lt;&gt;',0.0 )]}" class="oe_grey">
No order to invoice, create No order to invoice, create
</span> </span>
<button name="%(action_sales_order)d" string="Sale Orders" <button name="%(action_sales_order)d" string="Sales Orders"
type="action" type="action"
class="oe_link" class="oe_link"
context="{'default_partner_id': [partner_id], 'search_default_partner_id': [partner_id],'search_default_project_id': [active_id],'default_project_id': [active_id]}" context="{'default_partner_id': [partner_id], 'search_default_project_id': [active_id],'default_project_id': [active_id]}"
/> />
</td> </td>
</tr><tr> </tr><tr>
<td class="oe_timesheet_grey"> <td class="oe_timesheet_grey">
<label for="invoice_on_timesheets"/> <label for="invoice_on_timesheets"/>
</td><td class="oe_timesheet_grey"> </td><td class="oe_timesheet_grey">
<field name="invoice_on_timesheets"/> <field name="invoice_on_timesheets" on_change="onchange_invoice_on_timesheets(invoice_on_timesheets)"/>
</td><td> </td><td>
<field class="oe_inline" name="hours_qtt_est" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/> <field class="oe_inline" name="hours_qtt_est" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
</td><td> </td><td>
@ -84,7 +96,7 @@
<field class="oe_inline" name="remaining_hours_to_invoice" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/> <field class="oe_inline" name="remaining_hours_to_invoice" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
</td><td> </td><td>
<field class="oe_inline" name="ca_to_invoice" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/> <field class="oe_inline" name="ca_to_invoice" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
</td><td class="oe_timesheet_action" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"> </td><td class="oe_timesheet_action" attrs="{'invisible': ['|',('invoice_on_timesheets','=',False),('type','=','template')]}">
<span attrs="{'invisible': [('ca_to_invoice','=',0.0)]}" class="oe_grey"> <span attrs="{'invisible': [('ca_to_invoice','=',0.0)]}" class="oe_grey">
<button name="%(hr_timesheet_invoice.action_hr_timesheet_invoice_create_final)d" <button name="%(hr_timesheet_invoice.action_hr_timesheet_invoice_create_final)d"
type="action" type="action"
@ -117,8 +129,8 @@
</td> </td>
</tr> </tr>
</table> </table>
<group name='invoice_on_timesheets' attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"> <group name='invoice_on_timesheets'>
<p class="oe_grey oe_edit_only" colspan="2"> <p class="oe_grey oe_edit_only" colspan="2" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}">
When invoicing on timesheet, OpenERP uses the When invoicing on timesheet, OpenERP uses the
pricelist of the contract which uses the price pricelist of the contract which uses the price
defined on the product related to each employee to defined on the product related to each employee to
@ -131,9 +143,36 @@
<field name="to_invoice" <field name="to_invoice"
class="oe_inline" class="oe_inline"
widget="selection" widget="selection"
attrs="{'required': [('invoice_on_timesheets', '=', True)]}"/> attrs="{'required': [('invoice_on_timesheets', '=', True)], 'invisible': [('invoice_on_timesheets','=',False)]}"/>
</group> </group>
</group> </group>
<separator string="Recurring Invoices" attrs="{'invisible': [('recurring_invoices','!=',True)]}"/>
<div>
<field name="recurring_invoices" on_change="onchange_recurring_invoices(recurring_invoices, date_start)" class="oe_inline"/>
<label for="recurring_invoices" />
<button class="oe_link" name="recurring_create_invoice" attrs="{'invisible': [('recurring_invoices','!=',True)]}" string="⇒ create invoices" type="object" groups="base.group_no_one"/>
</div>
<group attrs="{'invisible': [('recurring_invoices','!=',True)]}">
<label for="recurring_interval"/>
<div>
<field name="recurring_interval" class="oe_inline" attrs="{'required': [('recurring_invoices', '=', True)]}"/>
<field name="recurring_rule_type" class="oe_inline" attrs="{'required': [('recurring_invoices', '=', True)]}"/>
</div>
<field name="recurring_next_date"/>
</group>
<label for="recurring_invoice_line_ids" attrs="{'invisible': [('recurring_invoices','=',False)]}"/>
<div attrs="{'invisible': [('recurring_invoices','=',False)]}">
<field name="recurring_invoice_line_ids">
<tree string="Account Analytic Lines" editable="bottom">
<field name="product_id" on_change="product_id_change(product_id, uom_id, quantity, name, parent.partner_id, price_unit, parent.pricelist_id, parent.company_id)"/>
<field name="name"/>
<field name="quantity"/>
<field name="uom_id"/>
<field name="price_unit"/>
<field name="price_subtotal"/>
</tree>
</field>
</div>
</xpath> </xpath>
</field> </field>
</record> </record>
@ -157,7 +196,7 @@
<field name="model">account.analytic.account</field> <field name="model">account.analytic.account</field>
<field name="inherit_id" ref="account.view_account_analytic_account_list"/> <field name="inherit_id" ref="account.view_account_analytic_account_list"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="date" position="before"> <field name="date_start" position="before">
<field name="last_invoice_date"/> <field name="last_invoice_date"/>
<field name="toinvoice_total"/> <field name="toinvoice_total"/>
<field name="remaining_hours"/> <field name="remaining_hours"/>

View File

@ -33,9 +33,11 @@
<record id="sale.sale_order_6" model="sale.order"> <record id="sale.sale_order_6" model="sale.order">
<field name="project_id" ref="account.analytic_super_product_trainings"/> <field name="project_id" ref="account.analytic_super_product_trainings"/>
<field name="partner_id" ref="base.res_partner_1"/>
</record> </record>
<record id="account.analytic_support_internal" model="account.analytic.account"> <record id="account.analytic_support_internal" model="account.analytic.account">
<field name="partner_id" ref="base.res_partner_1"/>
<field name="use_timesheets">True</field> <field name="use_timesheets">True</field>
<field name="invoice_on_timesheets">True</field> <field name="invoice_on_timesheets">True</field>
<field name="hours_qtt_est">100</field> <field name="hours_qtt_est">100</field>

View File

@ -8,7 +8,7 @@
<record id="group_template_required" model="res.groups"> <record id="group_template_required" model="res.groups">
<field name="name">Mandatory use of templates in contracts</field> <field name="name">Mandatory use of templates in contracts</field>
<field name="category_id" ref="base.module_category_sales_management"/> <field name="category_id" ref="base.module_category_hidden"/>
<field name="comment">the field template of the analytic accounts and contracts will be required.</field> <field name="comment">the field template of the analytic accounts and contracts will be required.</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record> </record>

View File

@ -1,5 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_analytic_analysis_summary_user_sale,account_analytic_analysis.summary.user sale,model_account_analytic_analysis_summary_user,base.group_sale_salesman,1,0,0,0 access_account_analytic_analysis_summary_user_sale,account_analytic_analysis.summary.user sale,model_account_analytic_analysis_summary_user,base.group_sale_salesman,1,0,0,0
access_account_analytic_analysis_summary_month_sale,account_analytic_analysis.summary.month sale,model_account_analytic_analysis_summary_month,base.group_sale_salesman,1,0,0,0 access_account_analytic_analysis_summary_month_sale,account_analytic_analysis.summary.month sale,model_account_analytic_analysis_summary_month,base.group_sale_salesman,1,0,0,0
access_account_analytic_analysis_summary_user,account_analytic_analysis.summary.user,model_account_analytic_analysis_summary_user,account.group_account_manager,1,0,0,0 access_account_analytic_analysis_summary_user,account_analytic_analysis.summary.user,model_account_analytic_analysis_summary_user,account.group_account_manager,1,0,0,0
access_account_analytic_analysis_summary_month,account_analytic_analysis.summary.month,model_account_analytic_analysis_summary_month,account.group_account_manager,1,0,0,0 access_account_analytic_analysis_summary_month,account_analytic_analysis.summary.month,model_account_analytic_analysis_summary_month,account.group_account_manager,1,0,0,0
access_edi_edi,access_edi_edi,edi.model_edi_edi,account.group_account_manager,1,1,1,1
access_account_analytic_invoice_line,account_analytic_invoice_line.user,model_account_analytic_invoice_line,account.group_account_user,1,1,1,1
access_account_analytic_invoice_line,account_analytic_invoice_line.user,model_account_analytic_invoice_line,base.group_sale_salesman,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_analytic_analysis_summary_user_sale account_analytic_analysis.summary.user sale model_account_analytic_analysis_summary_user base.group_sale_salesman 1 0 0 0
3 access_account_analytic_analysis_summary_month_sale account_analytic_analysis.summary.month sale model_account_analytic_analysis_summary_month base.group_sale_salesman 1 0 0 0
4 access_account_analytic_analysis_summary_user account_analytic_analysis.summary.user model_account_analytic_analysis_summary_user account.group_account_manager 1 0 0 0
5 access_account_analytic_analysis_summary_month account_analytic_analysis.summary.month model_account_analytic_analysis_summary_month account.group_account_manager 1 0 0 0
6 access_edi_edi access_edi_edi edi.model_edi_edi account.group_account_manager 1 1 1 1
7 access_account_analytic_invoice_line account_analytic_invoice_line.user model_account_analytic_invoice_line account.group_account_user 1 1 1 1
8 access_account_analytic_invoice_line account_analytic_invoice_line.user model_account_analytic_invoice_line base.group_sale_salesman 1 1 1 1

View File

@ -0,0 +1,44 @@
-
In order to test Contract Recurrent Invoice I create a new Contract Template
-
!record {model: account.analytic.account, id: contract_template}:
name: Maintenance of Servers
company_id: base.main_company
partner_id: base.main_partner
type: template
recurring_invoices : 1
recurring_interval : 1
recurring_invoice_line_ids:
- quantity: 2.0
price_unit: 75.0
name: Database Administration
product_id: product.product_product_consultant
uom_id: product.product_uom_hour
-
I create a contract based on this template
-
!record {model: account.analytic.account, id: contract_main}:
partner_id: base.main_partner
template_id: account_analytic_analysis.contract_template
-
I check that the contract inherited from data of the template
-
!python {model: account.analytic.account}: |
contract = self.browse(cr, uid, ref('account_analytic_analysis.contract_main'))
template = self.browse(cr, uid, ref('account_analytic_analysis.contract_template'))
assert template.recurring_interval == contract.recurring_interval, "The recurring interval of the contract does not match with the contract template"
assert template.recurring_invoices == contract.recurring_invoices, "Invoice method of contract does not match with the contract template"
-
I generate all invoices from contracts having recurring invoicing
-
!python {model: account.analytic.account}: |
self.recurring_create_invoice(cr, uid)
-
I test the generated invoice
-
!python {model: account.invoice}: |
aid = ref('account_analytic_analysis.contract_main')
ids = self.search(cr, uid, [('invoice_line.account_analytic_id','=',aid)], context=context)
assert len(ids)>=1, 'No invoice created for the contract'
for invoice in self.browse(cr, uid, ids,context=context):
assert invoice.amount_untaxed == 150.0, "The invoice total is different than 150!"

View File

@ -7,7 +7,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Analytic Defaults"> <tree string="Analytic Defaults">
<field name="sequence"/> <field name="sequence"/>
<field name="analytic_id" required="0" domain="[('parent_id','!=',False)]" groups="analytic.group_analytic_accounting"/> <field name="analytic_id" required="0" groups="analytic.group_analytic_accounting"/>
<field name="product_id"/> <field name="product_id"/>
<field name="partner_id"/> <field name="partner_id"/>
<field name="user_id"/> <field name="user_id"/>
@ -24,7 +24,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Analytic Defaults" version="7.0"> <form string="Analytic Defaults" version="7.0">
<group col="4"> <group col="4">
<field name="analytic_id" required="1" domain="[('parent_id','!=',False)]" groups="analytic.group_analytic_accounting"/> <field name="analytic_id" required="1" groups="analytic.group_analytic_accounting"/>
<field name="sequence"/> <field name="sequence"/>
<separator string="Conditions" colspan="4"/> <separator string="Conditions" colspan="4"/>
<field name="product_id"/> <field name="product_id"/>

View File

@ -60,7 +60,7 @@
<field name="crossovered_budget_line" widget="one2many_list" mode="tree"> <field name="crossovered_budget_line" widget="one2many_list" mode="tree">
<tree string="Budget Lines" editable="top"> <tree string="Budget Lines" editable="top">
<field name="crossovered_budget_id"/> <field name="crossovered_budget_id"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/> <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="date_from"/> <field name="date_from"/>
<field name="date_to"/> <field name="date_to"/>
<field name="paid_date"/> <field name="paid_date"/>
@ -72,7 +72,7 @@
<form string="Budget Lines" version="7.0"> <form string="Budget Lines" version="7.0">
<group col="4"> <group col="4">
<field name="crossovered_budget_id"/> <field name="crossovered_budget_id"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]" /> <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="date_from"/> <field name="date_from"/>
<field name="date_to"/> <field name="date_to"/>
<field name="paid_date"/> <field name="paid_date"/>

View File

@ -426,6 +426,14 @@ class res_partner(osv.osv):
return [('id','=','0')] return [('id','=','0')]
return [('id','in', [x[0] for x in res])] return [('id','in', [x[0] for x in res])]
def _get_partners(self, cr, uid, ids, context=None):
#this function search for the partners linked to all account.move.line 'ids' that have been changed
partners = set()
for aml in self.browse(cr, uid, ids, context=context):
if aml.partner_id:
partners.add(aml.partner_id.id)
return list(partners)
_inherit = "res.partner" _inherit = "res.partner"
_columns = { _columns = {
'payment_responsible_id':fields.many2one('res.users', ondelete='set null', string='Follow-up Responsible', 'payment_responsible_id':fields.many2one('res.users', ondelete='set null', string='Follow-up Responsible',
@ -447,12 +455,18 @@ class res_partner(osv.osv):
'latest_followup_level_id':fields.function(_get_latest, method=True, 'latest_followup_level_id':fields.function(_get_latest, method=True,
type='many2one', relation='account_followup.followup.line', string="Latest Follow-up Level", type='many2one', relation='account_followup.followup.line', string="Latest Follow-up Level",
help="The maximum follow-up level", help="The maximum follow-up level",
store=False, store={
'res.partner': (lambda self, cr, uid, ids, c: ids,[],10),
'account.move.line': (_get_partners, ['followup_line_id'], 10),
},
multi="latest"), multi="latest"),
'latest_followup_level_id_without_lit':fields.function(_get_latest, method=True, 'latest_followup_level_id_without_lit':fields.function(_get_latest, method=True,
type='many2one', relation='account_followup.followup.line', string="Latest Follow-up Level without litigation", type='many2one', relation='account_followup.followup.line', string="Latest Follow-up Level without litigation",
help="The maximum follow-up level without taking into account the account move lines with litigation", help="The maximum follow-up level without taking into account the account move lines with litigation",
store=False, store={
'res.partner': (lambda self, cr, uid, ids, c: ids,[],10),
'account.move.line': (_get_partners, ['followup_line_id'], 10),
},
multi="latest"), multi="latest"),
'payment_amount_due':fields.function(_get_amounts_and_date, 'payment_amount_due':fields.function(_get_amounts_and_date,
type='float', string="Amount Due", type='float', string="Amount Due",

View File

@ -17,6 +17,7 @@
<field name="parent_id" invisible="1"/> <field name="parent_id" invisible="1"/>
<field name="payment_responsible_id"/> <field name="payment_responsible_id"/>
<field name="payment_earliest_due_date"/> <field name="payment_earliest_due_date"/>
<field name="latest_followup_level_id"/>
<field name="payment_amount_overdue"/> <field name="payment_amount_overdue"/>
<field name="payment_amount_due" /> <field name="payment_amount_due" />
</tree> </tree>
@ -39,6 +40,7 @@
</group> </group>
<group expand="1" string="Group By..."> <group expand="1" string="Group By...">
<filter string="Follow-up Responsible" context="{'group_by':'payment_responsible_id'}"/> <filter string="Follow-up Responsible" context="{'group_by':'payment_responsible_id'}"/>
<filter String="Followup Level" context="{'group_by':'latest_followup_level_id'}"/>
</group> </group>
</search> </search>
</field> </field>

View File

@ -194,7 +194,7 @@ class account_analytic_account(osv.osv):
'user_id': fields.many2one('res.users', 'Project Manager'), 'user_id': fields.many2one('res.users', 'Project Manager'),
'manager_id': fields.many2one('res.users', 'Account Manager'), 'manager_id': fields.many2one('res.users', 'Account Manager'),
'date_start': fields.date('Start Date'), 'date_start': fields.date('Start Date'),
'date': fields.date('Date End', select=True), 'date': fields.date('End Date', select=True),
'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts. 'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'),('pending','To Renew'),('close','Closed'),('cancelled', 'Cancelled')], 'Status', required=True, track_visibility='onchange'), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'),('pending','To Renew'),('close','Closed'),('cancelled', 'Cancelled')], 'Status', required=True, track_visibility='onchange'),
'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company

View File

@ -22,6 +22,8 @@ from openerp.osv import fields, osv
from openerp.osv.orm import intersect from openerp.osv.orm import intersect
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp.addons.decimal_precision import decimal_precision as dp
class account_analytic_account(osv.osv): class account_analytic_account(osv.osv):
_name = "account.analytic.account" _name = "account.analytic.account"
_inherit = "account.analytic.account" _inherit = "account.analytic.account"
@ -91,6 +93,11 @@ class account_analytic_account(osv.osv):
res[account.id] += line.invoice_id.amount_untaxed res[account.id] += line.invoice_id.amount_untaxed
return res return res
def _ca_invoiced_calc(self, cr, uid, ids, name, arg, context=None):
result = super(account_analytic_account, self)._ca_invoiced_calc(cr, uid, ids, name, arg, context=context)
for acc in self.browse(cr, uid, result.keys(), context=context):
result[acc.id] = result[acc.id] - (acc.expense_invoiced or 0.0)
return result
_columns = { _columns = {
'charge_expenses' : fields.boolean('Charge Expenses'), 'charge_expenses' : fields.boolean('Charge Expenses'),
@ -98,6 +105,9 @@ class account_analytic_account(osv.osv):
'expense_to_invoice' : fields.function(_expense_to_invoice_calc, type='float'), 'expense_to_invoice' : fields.function(_expense_to_invoice_calc, type='float'),
'remaining_expense' : fields.function(_remaining_expnse_calc, type="float"), 'remaining_expense' : fields.function(_remaining_expnse_calc, type="float"),
'est_expenses': fields.float('Estimation of Expenses to Invoice'), 'est_expenses': fields.float('Estimation of Expenses to Invoice'),
'ca_invoiced': fields.function(_ca_invoiced_calc, type='float', string='Invoiced Amount',
help="Total customer invoiced amount for this account.",
digits_compute=dp.get_precision('Account')),
} }
def on_change_template(self, cr, uid, id, template_id, context=None): def on_change_template(self, cr, uid, id, template_id, context=None):

View File

@ -42,12 +42,12 @@ class analytic_user_funct_grid(osv.osv):
return {} return {}
value = {} value = {}
if product_id:
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
emp = emp_obj.browse(cr, uid, emp_id[0], context=context) emp = emp_obj.browse(cr, uid, emp_id[0], context=context)
if emp.product_id and not product_id: if emp.product_id and not product_id:
value['product_id'] = emp.product_id.id value['product_id'] = emp.product_id.id
prod = emp.product_id prod = emp.product_id
if product_id:
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
if prod: if prod:
value['price'] = prod.list_price value['price'] = prod.list_price
value['uom_id'] = prod.uom_id.id value['uom_id'] = prod.uom_id.id

View File

@ -11,7 +11,7 @@
<field name="user_id" on_change="onchange_user_product_id(user_id, product_id)"/> <field name="user_id" on_change="onchange_user_product_id(user_id, product_id)"/>
<field name="product_id" on_change="onchange_user_product_id(user_id, product_id)" domain="[('type','=','service')]"/> <field name="product_id" on_change="onchange_user_product_id(user_id, product_id)" domain="[('type','=','service')]"/>
<field name="price"/> <field name="price"/>
<field name="uom_id"/> <field name="uom_id" groups="product.group_uom"/>
</tree> </tree>
</field> </field>
</record> </record>
@ -25,7 +25,7 @@
<field name="user_id" on_change="onchange_user_product_id(user_id, product_id)"/> <field name="user_id" on_change="onchange_user_product_id(user_id, product_id)"/>
<field name="product_id" domain="[('type','=','service')]" on_change="onchange_user_product_id(user_id, product_id)"/> <field name="product_id" domain="[('type','=','service')]" on_change="onchange_user_product_id(user_id, product_id)"/>
<field name="price"/> <field name="price"/>
<field name="uom_id"/> <field name="uom_id" groups="product.group_uom"/>
</group> </group>
</form> </form>
</field> </field>

View File

@ -21,7 +21,7 @@
<!-- add Reset Password button --> <!-- add Reset Password button -->
<xpath expr="//div[@class='oe_right oe_button_box']" position="replace"> <xpath expr="//div[@class='oe_right oe_button_box']" position="replace">
<div class="oe_right oe_button_box"> <div class="oe_right oe_button_box">
<button string="Send reset password instructions by email" <button string="Send Reset Password Instructions"
type="object" name="action_reset_password" /> type="object" name="action_reset_password" />
</div> </div>
</xpath> </xpath>

View File

@ -19,29 +19,36 @@
# #
############################################################################## ##############################################################################
import urllib
import random
try:
import simplejson as json
except ImportError:
import json # noqa
from openerp.osv import osv from openerp.osv import osv
from openerp.osv import fields from openerp.osv import fields
import urllib,re
import random, time
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp import tools from openerp import tools
def geo_find(addr): def geo_find(addr):
addr = addr.encode('utf8') url = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address='
regex = '<coordinates>([+-]?[0-9\.]+),([+-]?[0-9\.]+),([+-]?[0-9\.]+)</coordinates>' url += urllib.quote(addr.encode('utf8'))
url = 'http://maps.google.com/maps/geo?q=' + urllib.quote(addr) + '&output=xml&oe=utf8&sensor=false'
try: try:
xml = urllib.urlopen(url).read() result = json.load(urllib.urlopen(url))
except Exception, e: except Exception, e:
raise osv.except_osv(_('Network error'), raise osv.except_osv(_('Network error'),
_('Cannot contact geolocation servers. Please make sure that your internet connection is up and running (%s).') % e) _('Cannot contact geolocation servers. Please make sure that your internet connection is up and running (%s).') % e)
if result['status'] != 'OK':
return None
if '<error>' in xml: try:
geo = result['results'][0]['geometry']['location']
return float(geo['lat']), float(geo['lng'])
except (KeyError, ValueError):
return None return None
result = re.search(regex, xml, re.M|re.I)
if not result:
return None
return float(result.group(2)),float(result.group(1))
def geo_query_address(street=None, zip=None, city=None, state=None, country=None): def geo_query_address(street=None, zip=None, city=None, state=None, country=None):
if country and ',' in country and (country.endswith(' of') or country.endswith(' of the')): if country and ',' in country and (country.endswith(' of') or country.endswith(' of the')):

View File

@ -10,8 +10,8 @@
- -
!python {model: res.partner}: | !python {model: res.partner}: |
partner = self.browse(cr, uid, ref('base.res_partner_2')) partner = self.browse(cr, uid, ref('base.res_partner_2'))
assert 50 < partner.partner_latitude < 51 , "Latitude is wrong" assert 50 < partner.partner_latitude < 51, "Latitude is wrong: 50 < %s < 51" % partner.partner_latitude
assert 3 < partner.partner_longitude < 5 , "Longitude is wrong" assert 3 < partner.partner_longitude < 5, "Longitude is wrong: 3 < %s < 5" % partner.partner_longitude
- -
I assign nearest partner to opportunity. I assign nearest partner to opportunity.
- -
@ -23,8 +23,8 @@
!python {model: crm.lead}: | !python {model: crm.lead}: |
lead = self.browse(cr, uid, ref('crm.crm_case_19')) lead = self.browse(cr, uid, ref('crm.crm_case_19'))
assert lead.partner_assigned_id.id == ref('base.res_partner_15') , "Opportuniy is not assigned nearest partner" assert lead.partner_assigned_id.id == ref('base.res_partner_15') , "Opportuniy is not assigned nearest partner"
assert 50 < lead.partner_latitude < 55 , "Latitude is wrong" assert 50 < lead.partner_latitude < 55, "Latitude is wrong: 50 < %s < 55" % lead.partner_latitude
assert -5 < lead.partner_longitude < 0, "Longitude is wrong" assert -4 < lead.partner_longitude < -1, "Longitude is wrong: -4 < %s < -1" % lead.partner_longitude
- -
I forward this opportunity to its nearest partner. I forward this opportunity to its nearest partner.
- -

View File

@ -0,0 +1,85 @@
# Hungarian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-03-10 21:58+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-03-11 04:55+0000\n"
"X-Generator: Launchpad (build 16523)\n"
#. module: crm_todo
#: model:ir.model,name:crm_todo.model_project_task
msgid "Task"
msgstr "Feladat"
#. module: crm_todo
#: view:crm.lead:0
msgid "Timebox"
msgstr "Időkorlát"
#. module: crm_todo
#: view:crm.lead:0
msgid "Lead"
msgstr "Érdeklődő"
#. module: crm_todo
#: view:crm.lead:0
msgid "For cancelling the task"
msgstr "A munka visszavonásához"
#. module: crm_todo
#: view:crm.lead:0
msgid "Next"
msgstr "Következő"
#. module: crm_todo
#: model:ir.actions.act_window,name:crm_todo.crm_todo_action
#: model:ir.ui.menu,name:crm_todo.menu_crm_todo
msgid "My Tasks"
msgstr "Feladataim"
#. module: crm_todo
#: view:crm.lead:0
#: field:crm.lead,task_ids:0
msgid "Tasks"
msgstr "Feladatok"
#. module: crm_todo
#: view:crm.lead:0
msgid "Done"
msgstr "Elvégezve"
#. module: crm_todo
#: view:crm.lead:0
msgid "Cancel"
msgstr "Visszavonás"
#. module: crm_todo
#: model:ir.model,name:crm_todo.model_crm_lead
msgid "Lead/Opportunity"
msgstr "Lehetőség/Esély"
#. module: crm_todo
#: field:project.task,lead_id:0
msgid "Lead / Opportunity"
msgstr "Lehetőség/Esély"
#. module: crm_todo
#: view:crm.lead:0
msgid "For changing to done state"
msgstr "Elvégezve szintre váltáshoz"
#. module: crm_todo
#: view:crm.lead:0
msgid "Previous"
msgstr "Előző"

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n" "Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n" "POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2012-12-10 09:05+0000\n" "PO-Revision-Date: 2013-03-12 12:56+0000\n"
"Last-Translator: Fekete Mihai <mihai@erpsystems.ro>\n" "Last-Translator: Simonel Criste <simi@erpsystems.ro>\n"
"Language-Team: Romanian <ro@li.org>\n" "Language-Team: Romanian <ro@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-12-22 05:58+0000\n" "X-Launchpad-Export-Date: 2013-03-13 04:37+0000\n"
"X-Generator: Launchpad (build 16378)\n" "X-Generator: Launchpad (build 16532)\n"
#. module: email_template #. module: email_template
#: field:email.template,email_from:0 #: field:email.template,email_from:0
@ -37,13 +37,13 @@ msgstr "Buton bara laterala pentru a deschide actiunea barei laterale"
#. module: email_template #. module: email_template
#: field:res.partner,opt_out:0 #: field:res.partner,opt_out:0
msgid "Opt-Out" msgid "Opt-Out"
msgstr "" msgstr "Nu participati"
#. module: email_template #. module: email_template
#: field:email.template,email_to:0 #: field:email.template,email_to:0
#: field:email_template.preview,email_to:0 #: field:email_template.preview,email_to:0
msgid "To (Emails)" msgid "To (Emails)"
msgstr "" msgstr "Destinatar (Email-uri)"
#. module: email_template #. module: email_template
#: field:email.template,mail_server_id:0 #: field:email.template,mail_server_id:0
@ -76,7 +76,7 @@ msgstr "Adresa expeditorului (aici pot fi folositi inlocuitori)"
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
msgid "Remove context action" msgid "Remove context action"
msgstr "" msgstr "Sterge actiunea cadru"
#. module: email_template #. module: email_template
#: help:email.template,mail_server_id:0 #: help:email.template,mail_server_id:0
@ -97,7 +97,7 @@ msgstr "Raport nume fisier"
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
msgid "Preview" msgid "Preview"
msgstr "" msgstr "Previzualizare"
#. module: email_template #. module: email_template
#: field:email.template,reply_to:0 #: field:email.template,reply_to:0
@ -187,7 +187,7 @@ msgstr ""
"trimiteti un e-mail. Daca nu este setata, va fi folosita versiunea in limba " "trimiteti un e-mail. Daca nu este setata, va fi folosita versiunea in limba "
"engleza. Aceasta ar trebui de obicei sa fie o expresie inlocuitoare care " "engleza. Aceasta ar trebui de obicei sa fie o expresie inlocuitoare care "
"furnizeaza codul limbii corespunzatoare, de exemplu " "furnizeaza codul limbii corespunzatoare, de exemplu "
"${obiect.partener_id.cod.limba}." "${object.partner_id.lang.code}."
#. module: email_template #. module: email_template
#: field:email_template.preview,res_id:0 #: field:email_template.preview,res_id:0
@ -209,7 +209,7 @@ msgstr ""
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
msgid "Dynamic Value Builder" msgid "Dynamic Value Builder"
msgstr "" msgstr "Creare Valoare Dinamica"
#. module: email_template #. module: email_template
#: model:ir.actions.act_window,name:email_template.wizard_email_template_preview #: model:ir.actions.act_window,name:email_template.wizard_email_template_preview
@ -227,6 +227,8 @@ msgid ""
"Display an option on related documents to open a composition wizard with " "Display an option on related documents to open a composition wizard with "
"this template" "this template"
msgstr "" msgstr ""
"Afiseaza o optiune in documentele asociate pentru a deschide un wizard de "
"compoziite cu acest sablon"
#. module: email_template #. module: email_template
#: help:email.template,email_cc:0 #: help:email.template,email_cc:0
@ -249,7 +251,7 @@ msgstr "Avansat"
#. module: email_template #. module: email_template
#: view:email_template.preview:0 #: view:email_template.preview:0
msgid "Preview of" msgid "Preview of"
msgstr "" msgstr "Previzualizare a"
#. module: email_template #. module: email_template
#: view:email_template.preview:0 #: view:email_template.preview:0
@ -297,7 +299,7 @@ msgstr ""
#: field:email.template,copyvalue:0 #: field:email.template,copyvalue:0
#: field:email_template.preview,copyvalue:0 #: field:email_template.preview,copyvalue:0
msgid "Placeholder Expression" msgid "Placeholder Expression"
msgstr "" msgstr "Expresie Substituenta"
#. module: email_template #. module: email_template
#: field:email.template,sub_object:0 #: field:email.template,sub_object:0
@ -321,7 +323,7 @@ msgstr "Adresa de raspuns preferata (aici pot fi folositi inlocuitori)"
#: field:email.template,ref_ir_value:0 #: field:email.template,ref_ir_value:0
#: field:email_template.preview,ref_ir_value:0 #: field:email_template.preview,ref_ir_value:0
msgid "Sidebar Button" msgid "Sidebar Button"
msgstr "" msgstr "Buton Bara laterala"
#. module: email_template #. module: email_template
#: field:email.template,report_template:0 #: field:email.template,report_template:0
@ -344,24 +346,24 @@ msgstr "Model"
#. module: email_template #. module: email_template
#: model:ir.model,name:email_template.model_mail_compose_message #: model:ir.model,name:email_template.model_mail_compose_message
msgid "Email composition wizard" msgid "Email composition wizard"
msgstr "" msgstr "Wizard de compozitie email-uri"
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
msgid "Add context action" msgid "Add context action"
msgstr "" msgstr "Adauga contextul actiunii"
#. module: email_template #. module: email_template
#: help:email.template,model_id:0 #: help:email.template,model_id:0
#: help:email_template.preview,model_id:0 #: help:email_template.preview,model_id:0
msgid "The kind of document with with this template can be used" msgid "The kind of document with with this template can be used"
msgstr "" msgstr "Tipul de document cu care poate fi utilizat acest sablon"
#. module: email_template #. module: email_template
#: field:email.template,email_recipients:0 #: field:email.template,email_recipients:0
#: field:email_template.preview,email_recipients:0 #: field:email_template.preview,email_recipients:0
msgid "To (Partners)" msgid "To (Partners)"
msgstr "" msgstr "Destinatar (Parteneri)"
#. module: email_template #. module: email_template
#: field:email.template,auto_delete:0 #: field:email.template,auto_delete:0
@ -382,7 +384,7 @@ msgstr ""
#: field:email.template,model:0 #: field:email.template,model:0
#: field:email_template.preview,model:0 #: field:email_template.preview,model:0
msgid "Related Document Model" msgid "Related Document Model"
msgstr "" msgstr "Model Document Asociat"
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
@ -395,6 +397,8 @@ msgstr "Adresare"
msgid "" msgid ""
"Comma-separated ids of recipient partners (placeholders may be used here)" "Comma-separated ids of recipient partners (placeholders may be used here)"
msgstr "" msgstr ""
"Id-uri despartite prin virgule ale partenerilor destinatari (aici pot fi "
"folositi substituenti)"
#. module: email_template #. module: email_template
#: field:email.template,attachment_ids:0 #: field:email.template,attachment_ids:0
@ -418,7 +422,7 @@ msgstr "Cc (copie carbon)"
#: field:email.template,model_id:0 #: field:email.template,model_id:0
#: field:email_template.preview,model_id:0 #: field:email_template.preview,model_id:0
msgid "Applies to" msgid "Applies to"
msgstr "" msgstr "Se aplica pentru"
#. module: email_template #. module: email_template
#: field:email.template,sub_model_object_field:0 #: field:email.template,sub_model_object_field:0
@ -490,7 +494,7 @@ msgstr "Partener"
#: field:email.template,null_value:0 #: field:email.template,null_value:0
#: field:email_template.preview,null_value:0 #: field:email_template.preview,null_value:0
msgid "Default Value" msgid "Default Value"
msgstr "" msgstr "Valoarea Implicita"
#. module: email_template #. module: email_template
#: help:email.template,attachment_ids:0 #: help:email.template,attachment_ids:0
@ -512,7 +516,7 @@ msgstr ""
#. module: email_template #. module: email_template
#: view:email.template:0 #: view:email.template:0
msgid "Contents" msgid "Contents"
msgstr "" msgstr "Cuprins"
#. module: email_template #. module: email_template
#: field:email.template,subject:0 #: field:email.template,subject:0

File diff suppressed because one or more lines are too long

View File

@ -74,9 +74,6 @@ class account_analytic_account(osv.osv):
'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Timesheet Invoicing Ratio', 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Timesheet Invoicing Ratio',
help="You usually invoice 100% of the timesheets. But if you mix fixed price and timesheet invoicing, you may use another ratio. For instance, if you do a 20% advance invoice (fixed price, based on a sales order), you should invoice the rest on timesheet with a 80% ratio."), help="You usually invoice 100% of the timesheets. But if you mix fixed price and timesheet invoicing, you may use another ratio. For instance, if you do a 20% advance invoice (fixed price, based on a sales order), you should invoice the rest on timesheet with a 80% ratio."),
} }
_defaults = {
'pricelist_id': lambda self, cr, uid, ctx: ctx.get('pricelist_id', False),
}
def on_change_partner_id(self, cr, uid, ids, partner_id, name, context=None): def on_change_partner_id(self, cr, uid, ids, partner_id, name, context=None):
res = super(account_analytic_account, self).on_change_partner_id(cr, uid, ids, partner_id, name, context=context) res = super(account_analytic_account, self).on_change_partner_id(cr, uid, ids, partner_id, name, context=context)

896
addons/lunch/i18n/mk.po Normal file
View File

@ -0,0 +1,896 @@
# Macedonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-03-13 07:44+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Macedonian <mk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-03-14 04:48+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: lunch
#: field:lunch.product,category_id:0
#: field:lunch.product.category,name:0
msgid "Category"
msgstr "Категорија"
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_order_by_supplier_form
msgid "Today's Orders by Supplier"
msgstr ""
#. module: lunch
#: view:lunch.order:0
msgid "My Orders"
msgstr ""
#. module: lunch
#: selection:lunch.order,state:0
msgid "Partially Confirmed"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
#: view:lunch.order.line:0
msgid "Group By..."
msgstr "Групирај По..."
#. module: lunch
#: field:lunch.alert,sunday:0
msgid "Sunday"
msgstr "Недела"
#. module: lunch
#: field:lunch.order.line,supplier:0
#: field:lunch.product,supplier:0
msgid "Supplier"
msgstr "Добавувач"
#. module: lunch
#: view:lunch.order.line:0
msgid "Today"
msgstr "Денес"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "March"
msgstr "Март"
#. module: lunch
#: view:lunch.cashmove:0
msgid "By Employee"
msgstr "По Вработен"
#. module: lunch
#: field:lunch.alert,friday:0
msgid "Friday"
msgstr "Петок"
#. module: lunch
#: view:lunch.validation:0
msgid "validate order lines"
msgstr ""
#. module: lunch
#: view:lunch.order.line:0
msgid "Order lines Tree"
msgstr ""
#. module: lunch
#: field:lunch.alert,specific_day:0
#: field:report.lunch.order.line,day:0
msgid "Day"
msgstr "Ден"
#. module: lunch
#: view:lunch.order.line:0
#: selection:lunch.order.line,state:0
msgid "Received"
msgstr "Примено"
#. module: lunch
#: view:lunch.order.line:0
msgid "By Supplier"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_order_tree
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a lunch order. \n"
" </p>\n"
" <p>\n"
" A lunch order is defined by its user, date and order lines.\n"
" Each order line corresponds to a product, an additional note "
"and a price.\n"
" Before selecting your order lines, don't forget to read the "
"warnings displayed in the reddish area.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: view:lunch.order.line:0
msgid "Not Received"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_order_by_supplier_form
#: model:ir.ui.menu,name:lunch.menu_lunch_control_suppliers
msgid "Orders by Supplier"
msgstr ""
#. module: lunch
#: view:lunch.validation:0
msgid "Receive Meals"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
msgid "cashmove form"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_cashmove_form
msgid ""
"<p>\n"
" Here you can see your cash moves.<br/>A cash moves can be "
"either an expense or a payment.\n"
" An expense is automatically created when an order is "
"received while a payment is a reimbursement to the company encoded by the "
"manager.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: field:lunch.cashmove,amount:0
msgid "Amount"
msgstr "Износ"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_products
#: model:ir.ui.menu,name:lunch.menu_lunch_products
#: field:lunch.order,order_line_ids:0
msgid "Products"
msgstr "Производи"
#. module: lunch
#: view:lunch.order.line:0
msgid "By Date"
msgstr "По датум"
#. module: lunch
#: selection:lunch.order,state:0
#: view:lunch.order.line:0
#: selection:lunch.order.line,state:0
msgid "Cancelled"
msgstr "Откажано"
#. module: lunch
#: view:lunch.cashmove:0
msgid "lunch employee payment"
msgstr ""
#. module: lunch
#: view:lunch.alert:0
msgid "alert tree"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_report_lunch_order_line
msgid "Lunch Orders Statistics"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_alert
msgid "Lunch Alert"
msgstr ""
#. module: lunch
#: code:addons/lunch/lunch.py:183
#, python-format
msgid "Select a product and put your order comments on the note."
msgstr ""
#. module: lunch
#: selection:lunch.alert,alter_type:0
msgid "Every Week"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_cashmove
msgid "Register Cash Moves"
msgstr ""
#. module: lunch
#: selection:lunch.order,state:0
msgid "Confirmed"
msgstr "Потврдено"
#. module: lunch
#: view:lunch.order:0
msgid "lunch orders"
msgstr ""
#. module: lunch
#: view:lunch.order.line:0
msgid "Confirm"
msgstr "Потврди"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_cashmove_form
msgid "Your Account"
msgstr ""
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_cashmove_form
msgid "Your Lunch Account"
msgstr ""
#. module: lunch
#: field:lunch.alert,active_from:0
msgid "Between"
msgstr "Помеѓу"
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_order_order
msgid "Wizard to order a meal"
msgstr ""
#. module: lunch
#: selection:lunch.order,state:0
#: selection:lunch.order.line,state:0
msgid "New"
msgstr "Ново"
#. module: lunch
#: code:addons/lunch/lunch.py:180
#, python-format
msgid "This is the first time you order a meal"
msgstr ""
#. module: lunch
#: field:report.lunch.order.line,price_total:0
msgid "Total Price"
msgstr "Вкупна цена"
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_validation
msgid "lunch validation for order"
msgstr ""
#. module: lunch
#: report:lunch.order.line:0
msgid "Name/Date"
msgstr ""
#. module: lunch
#: report:lunch.order.line:0
msgid "Total :"
msgstr "Вкупно :"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "July"
msgstr "Јули"
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_config
msgid "Configuration"
msgstr "Конфигурација"
#. module: lunch
#: field:lunch.order,state:0
#: field:lunch.order.line,state:0
msgid "Status"
msgstr "Статус"
#. module: lunch
#: view:lunch.order.order:0
msgid ""
"Order a meal doesn't mean that we have to pay it.\n"
" A meal should be paid when it is received."
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_control_accounts
#: model:ir.ui.menu,name:lunch.menu_lunch_control_accounts
msgid "Control Accounts"
msgstr ""
#. module: lunch
#: selection:lunch.alert,alter_type:0
msgid "Every Day"
msgstr ""
#. module: lunch
#: field:lunch.order.line,cashmove:0
msgid "Cash Move"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.order_order_lines
msgid "Order meals"
msgstr ""
#. module: lunch
#: view:lunch.alert:0
msgid "Schedule Hour"
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "September"
msgstr "Септември"
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_control_suppliers
msgid ""
"<p>\n"
" Here you can see every orders grouped by suppliers and by "
"date.\n"
" </p>\n"
" <p>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/terp-call-start.png\"/> to announce "
"that the order is ordered <br/>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/gtk-apply.png\"/> to announce that "
"the order is received <br/>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/gtk-cancel.png\"/> red X to announce "
"that the order isn't available\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: field:lunch.alert,tuesday:0
msgid "Tuesday"
msgstr "Вторник"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_order_tree
msgid "Your Orders"
msgstr ""
#. module: lunch
#: field:report.lunch.order.line,month:0
msgid "Month"
msgstr "Месец"
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_products
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a product for lunch. \n"
" </p>\n"
" <p>\n"
" A product is defined by its name, category, price and "
"supplier.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: view:lunch.alert:0
#: field:lunch.alert,message:0
msgid "Message"
msgstr "Порака"
#. module: lunch
#: view:lunch.order.order:0
msgid "Order Meals"
msgstr ""
#. module: lunch
#: view:lunch.cancel:0
#: view:lunch.order.order:0
#: view:lunch.validation:0
msgid "or"
msgstr "или"
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_product_categories
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a lunch category. \n"
" </p>\n"
" <p>\n"
" Here you can find every lunch categories for products.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: view:lunch.order.order:0
msgid "Order meal"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_product_categories
#: model:ir.ui.menu,name:lunch.menu_lunch_product_categories
msgid "Product Categories"
msgstr "Категории на производ"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_control_suppliers
msgid "Control Suppliers"
msgstr ""
#. module: lunch
#: view:lunch.alert:0
msgid "Schedule Date"
msgstr "Планиран датум"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_alert
#: model:ir.ui.menu,name:lunch.menu_lunch_alert
#: field:lunch.order,alerts:0
msgid "Alerts"
msgstr "Известувања"
#. module: lunch
#: field:lunch.order.line,note:0
#: field:report.lunch.order.line,note:0
msgid "Note"
msgstr "Белешка"
#. module: lunch
#: code:addons/lunch/lunch.py:250
#, python-format
msgid "Add"
msgstr "Додади"
#. module: lunch
#: view:lunch.product:0
#: view:lunch.product.category:0
msgid "Products Form"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.cancel_order_lines
msgid "Cancel meals"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_cashmove
#: view:lunch.cashmove:0
msgid "lunch cashmove"
msgstr ""
#. module: lunch
#: view:lunch.cancel:0
msgid "Are you sure you want to cancel these meals?"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
msgid "My Account"
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "August"
msgstr "Август"
#. module: lunch
#: field:lunch.alert,monday:0
msgid "Monday"
msgstr "Понеделник"
#. module: lunch
#: field:lunch.order.line,name:0
msgid "unknown"
msgstr "непознато"
#. module: lunch
#: model:ir.actions.act_window,name:lunch.validate_order_lines
msgid "Receive meals"
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "June"
msgstr "Јуни"
#. module: lunch
#: field:lunch.cashmove,user_id:0
#: field:lunch.order,user_id:0
#: field:report.lunch.order.line,user_id:0
msgid "User Name"
msgstr "Корисничко име"
#. module: lunch
#: model:ir.module.category,name:lunch.module_lunch_category
#: model:ir.ui.menu,name:lunch.menu_lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_title
msgid "Lunch"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_order_line
msgid "lunch order line"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_product
msgid "lunch product"
msgstr ""
#. module: lunch
#: field:lunch.order.line,user_id:0
#: model:res.groups,name:lunch.group_lunch_user
msgid "User"
msgstr "Корисник"
#. module: lunch
#: field:lunch.cashmove,date:0
#: field:lunch.order,date:0
#: field:lunch.order.line,date:0
msgid "Date"
msgstr "Датум"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "November"
msgstr "Ноември"
#. module: lunch
#: view:lunch.order:0
msgid "Orders Tree"
msgstr ""
#. module: lunch
#: view:lunch.order:0
msgid "Orders Form"
msgstr ""
#. module: lunch
#: view:lunch.alert:0
#: view:lunch.order.line:0
msgid "Search"
msgstr "Пребарувај"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "October"
msgstr "Октомври"
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_order_by_supplier_form
msgid ""
"<p>\n"
" Here you can see today's orders grouped by suppliers.\n"
" </p>\n"
" <p>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/terp-call-start.png\"/> to announce "
"that the order is ordered <br/>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/gtk-apply.png\"/> to announce that "
"the order is received <br/>\n"
" - Click on the <img "
"src=\"../../../web/static/src/img/icons/gtk-cancel.png\"/> to announce that "
"the order isn't available\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "January"
msgstr "Јануари"
#. module: lunch
#: selection:lunch.alert,alter_type:0
msgid "Specific Day"
msgstr ""
#. module: lunch
#: field:lunch.alert,wednesday:0
msgid "Wednesday"
msgstr "Среда"
#. module: lunch
#: view:lunch.product.category:0
msgid "Product Category: "
msgstr ""
#. module: lunch
#: field:lunch.alert,active_to:0
msgid "And"
msgstr "И"
#. module: lunch
#: selection:lunch.order.line,state:0
msgid "Ordered"
msgstr ""
#. module: lunch
#: field:report.lunch.order.line,date:0
msgid "Date Order"
msgstr "Датум на налогот"
#. module: lunch
#: view:lunch.cancel:0
msgid "Cancel Orders"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_alert
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a lunch alert. \n"
" </p>\n"
" <p>\n"
" Alerts are used to warn employee from possible issues "
"concerning the lunch orders.\n"
" To create a lunch alert you have to define its recurrency, "
"the time interval during which the alert should be executed and the message "
"to display.\n"
" </p>\n"
" <p>\n"
" Example: <br/>\n"
" - Recurency: Everyday<br/>\n"
" - Time interval: from 00h00 am to 11h59 pm<br/>\n"
" - Message: \"You must order before 10h30 am\"\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: view:lunch.cancel:0
msgid "A cancelled meal should not be paid by employees."
msgstr ""
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_cash
msgid "Administrate Cash Moves"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_cancel
msgid "cancel lunch order"
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "December"
msgstr "Декември"
#. module: lunch
#: view:lunch.cancel:0
#: view:lunch.order.line:0
#: view:lunch.order.order:0
#: view:lunch.validation:0
msgid "Cancel"
msgstr "Откажи"
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_cashmove
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a payment. \n"
" </p>\n"
" <p>\n"
" Here you can see the employees' payment. A payment is a cash "
"move from the employee to the company.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: code:addons/lunch/lunch.py:186
#, python-format
msgid "Your favorite meals will be created based on your last orders."
msgstr ""
#. module: lunch
#: model:ir.module.category,description:lunch.module_lunch_category
msgid ""
"Helps you handle your lunch needs, if you are a manager you will be able to "
"create new products, cashmoves and to confirm or cancel orders."
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,help:lunch.action_lunch_control_accounts
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create a new payment. \n"
" </p>\n"
" <p>\n"
" A cashmove can either be an expense or a payment.<br/>\n"
" An expense is automatically created at the order "
"receipt.<br/>\n"
" A payment represents the employee reimbursement to the "
"company.\n"
" </p>\n"
" "
msgstr ""
#. module: lunch
#: field:lunch.alert,alter_type:0
msgid "Recurrency"
msgstr "Повторливост"
#. module: lunch
#: code:addons/lunch/lunch.py:189
#, python-format
msgid "Don't forget the alerts displayed in the reddish area"
msgstr ""
#. module: lunch
#: field:lunch.alert,thursday:0
msgid "Thursday"
msgstr "Четврток"
#. module: lunch
#: report:lunch.order.line:0
msgid "Unit Price"
msgstr "Единечна цена"
#. module: lunch
#: field:lunch.order.line,product_id:0
#: field:lunch.product,name:0
msgid "Product"
msgstr "Производ"
#. module: lunch
#: field:lunch.cashmove,description:0
#: report:lunch.order.line:0
#: field:lunch.product,description:0
msgid "Description"
msgstr "Опис"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "May"
msgstr "Мај"
#. module: lunch
#: field:lunch.order.line,price:0
#: field:lunch.product,price:0
msgid "Price"
msgstr "Цена"
#. module: lunch
#: field:lunch.cashmove,state:0
msgid "Is an order or a Payment"
msgstr ""
#. module: lunch
#: model:ir.actions.act_window,name:lunch.action_lunch_order_form
#: model:ir.ui.menu,name:lunch.menu_lunch_order_form
msgid "New Order"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
msgid "cashmove tree"
msgstr ""
#. module: lunch
#: view:lunch.cancel:0
msgid "Cancel a meal means that we didn't receive it from the supplier."
msgstr ""
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_cashmove
msgid "Employee Payments"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
#: selection:lunch.cashmove,state:0
msgid "Payment"
msgstr "Плаќање"
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "February"
msgstr "Февруари"
#. module: lunch
#: field:report.lunch.order.line,year:0
msgid "Year"
msgstr "Година"
#. module: lunch
#: view:lunch.order:0
msgid "List"
msgstr "Листа"
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_admin
msgid "Administrate Orders"
msgstr ""
#. module: lunch
#: selection:report.lunch.order.line,month:0
msgid "April"
msgstr "Април"
#. module: lunch
#: view:lunch.order:0
msgid "Select your order"
msgstr ""
#. module: lunch
#: field:lunch.cashmove,order_id:0
#: selection:lunch.cashmove,state:0
#: report:lunch.order.line:0
#: view:lunch.order.line:0
#: field:lunch.order.line,order_id:0
msgid "Order"
msgstr "Нарачка"
#. module: lunch
#: model:ir.actions.report.xml,name:lunch.report_lunch_order
#: model:ir.model,name:lunch.model_lunch_order
#: report:lunch.order.line:0
msgid "Lunch Order"
msgstr ""
#. module: lunch
#: view:lunch.order.order:0
msgid "Are you sure you want to order these meals?"
msgstr ""
#. module: lunch
#: view:lunch.cancel:0
msgid "cancel order lines"
msgstr ""
#. module: lunch
#: model:ir.model,name:lunch.model_lunch_product_category
msgid "lunch product category"
msgstr ""
#. module: lunch
#: field:lunch.alert,saturday:0
msgid "Saturday"
msgstr "Сабота"
#. module: lunch
#: model:res.groups,name:lunch.group_lunch_manager
msgid "Manager"
msgstr "Менаџер"
#. module: lunch
#: view:lunch.validation:0
msgid "Did your received these meals?"
msgstr ""
#. module: lunch
#: view:lunch.validation:0
msgid "Once a meal is received a new cash move is created for the employee."
msgstr ""
#. module: lunch
#: view:lunch.product:0
msgid "Products Tree"
msgstr ""
#. module: lunch
#: view:lunch.cashmove:0
#: view:lunch.order:0
#: field:lunch.order,total:0
#: view:lunch.order.line:0
msgid "Total"
msgstr "Вкупно"
#. module: lunch
#: model:ir.ui.menu,name:lunch.menu_lunch_order_tree
msgid "Previous Orders"
msgstr ""

View File

@ -253,7 +253,11 @@
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_id" ref="view_warehouse_orderpoint_tree"/> <field name="view_id" ref="view_warehouse_orderpoint_tree"/>
<field name="search_view_id" ref="warehouse_orderpoint_search" /> <field name="search_view_id" ref="warehouse_orderpoint_search" />
<field name="help">You can define your minimum stock rules, so that OpenERP will automatically create draft manufacturing orders or purchase quotations according to the stock level. Once the virtual stock of a product (= stock on hand minus all confirmed orders and reservations) is below the minimum quantity, OpenERP will generate a procurement request to increase the stock up to the maximum quantity.</field> <field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a reordering rules.
</p><p>You can define your minimum stock rules, so that OpenERP will automatically create draft manufacturing orders or request for quotations according to the stock level. Once the virtual stock of a product (= stock on hand minus all confirmed orders and reservations) is below the minimum quantity, OpenERP will generate a procurement request to increase the stock up to the maximum quantity.</p>
</field>
</record> </record>
<act_window <act_window

View File

@ -101,7 +101,7 @@
<page string="Description"> <page string="Description">
<field name="description" placeholder="Add an internal note..." groups="base.group_user"/> <field name="description" placeholder="Add an internal note..." groups="base.group_user"/>
</page> </page>
<page string="Extra Info" groups="project.group_project_manager"> <page string="Extra Info" groups="project.group_project_manager,project.group_project_user">
<group string="Statistics"> <group string="Statistics">
<field name="day_open"/> <field name="day_open"/>
<field name="day_close"/> <field name="day_close"/>
@ -156,7 +156,7 @@
<field name="model">project.issue</field> <field name="model">project.issue</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Issue Tracker Search"> <search string="Issue Tracker Search">
<field name="name" string="Issue" filter_domain="['|', '|',('partner_id','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/> <field name="name" string="Issue" filter_domain="['|', '|',('description','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="id"/> <field name="id"/>
<filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/> <separator/>
@ -164,6 +164,7 @@
<filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/> <filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/>
<separator/> <separator/>
<filter string="Unassigned Issues" domain="[('user_id','=',False)]" help="Unassigned Issues" icon="terp-personal-"/> <filter string="Unassigned Issues" domain="[('user_id','=',False)]" help="Unassigned Issues" icon="terp-personal-"/>
<field name="partner_id"/>
<field name="user_id"/> <field name="user_id"/>
<field name="project_id"/> <field name="project_id"/>
<field name="categ_ids"/> <field name="categ_ids"/>
@ -364,5 +365,19 @@
</field> </field>
</record> </record>
<!-- res.partner -->
<record model="ir.ui.view" id="res_partner_issues_button_view">
<field name="name">res.partner.issues.button.view</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button type="action" string="Issues" attrs="{'invisible': [('customer', '=', False)]}"
name="%(act_project_project_2_project_issue_all)d" context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}" groups="project.group_project_user"/>
</xpath>
</field>
</record>
</data> </data>
</openerp> </openerp>

File diff suppressed because one or more lines are too long

View File

@ -209,7 +209,7 @@
<field name="name"/> <field name="name"/>
<field name="date_planned"/> <field name="date_planned"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/> <field name="company_id" groups="base.group_multi_company" widget="selection"/>
<field name="account_analytic_id" groups="purchase.group_analytic_accounting" domain="[('parent_id','!=',False)]"/> <field name="account_analytic_id" groups="purchase.group_analytic_accounting" domain="[('type','in',('normal','contract'))]"/>
<field name="product_qty" on_change="onchange_product_id(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id,parent.date_order,parent.fiscal_position,date_planned,name,price_unit,context)"/> <field name="product_qty" on_change="onchange_product_id(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id,parent.date_order,parent.fiscal_position,date_planned,name,price_unit,context)"/>
<field name="product_uom" groups="product.group_uom" on_change="onchange_product_uom(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,context)"/> <field name="product_uom" groups="product.group_uom" on_change="onchange_product_uom(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,context)"/>
<field name="price_unit"/> <field name="price_unit"/>
@ -395,7 +395,7 @@
<group> <group>
<field name="taxes_id" widget="many2many_tags" domain="[('parent_id','=',False),('type_tax_use','!=','sale')]"/> <field name="taxes_id" widget="many2many_tags" domain="[('parent_id','=',False),('type_tax_use','!=','sale')]"/>
<field name="date_planned" widget="date"/> <field name="date_planned" widget="date"/>
<field name="account_analytic_id" colspan="2" groups="purchase.group_analytic_accounting" domain="[('parent_id','!=',False)]" /> <field name="account_analytic_id" colspan="2" groups="purchase.group_analytic_accounting"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/> <field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group> </group>
</group> </group>
@ -461,7 +461,7 @@
domain="[('parent_id','=',False),('type_tax_use','!=','sale')]"/> domain="[('parent_id','=',False),('type_tax_use','!=','sale')]"/>
<field name="date_planned" widget="date" readonly="1"/> <field name="date_planned" widget="date" readonly="1"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/> <field name="company_id" groups="base.group_multi_company" widget="selection"/>
<field name="account_analytic_id" colspan="4" groups="purchase.group_analytic_accounting" domain="[('parent_id','!=',False)]"/> <field name="account_analytic_id" colspan="4" groups="purchase.group_analytic_accounting"/>
<field name="invoiced"/> <field name="invoiced"/>
</group> </group>
</group> </group>

View File

@ -49,7 +49,7 @@ class sale_configuration(osv.osv_memory):
implied_group='product.group_sale_pricelist', implied_group='product.group_sale_pricelist',
help="""Allows to manage different prices based on rules per category of customers. help="""Allows to manage different prices based on rules per category of customers.
Example: 10% for retailers, promotion of 5 EUR on this product, etc."""), Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
'group_uom':fields.boolean("Allow using different units of measures", 'group_uom':fields.boolean("Allow using different units of measure",
implied_group='product.group_uom', implied_group='product.group_uom',
help="""Allows you to select and maintain different units of measure for products."""), help="""Allows you to select and maintain different units of measure for products."""),
'group_discount_per_so_line': fields.boolean("Allow setting a discount on the sales order lines", 'group_discount_per_so_line': fields.boolean("Allow setting a discount on the sales order lines",

View File

@ -676,7 +676,9 @@ class sale_order_line(osv.osv):
'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True), 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True),
'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True), 'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True),
'invoiced': fields.function(_fnct_line_invoiced, string='Invoiced', type='boolean', 'invoiced': fields.function(_fnct_line_invoiced, string='Invoiced', type='boolean',
store={'account.invoice': (_order_lines_from_invoice, ['state'], 10)}), store={
'account.invoice': (_order_lines_from_invoice, ['state'], 10),
'sale.order.line': (lambda self,cr,uid,ids,ctx=None: ids, ['invoice_lines'], 10)}),
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price'), readonly=True, states={'draft': [('readonly', False)]}), 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price'), readonly=True, states={'draft': [('readonly', False)]}),
'type': fields.selection([('make_to_stock', 'from stock'), ('make_to_order', 'on order')], 'Procurement Method', required=True, readonly=True, states={'draft': [('readonly', False)]}, 'type': fields.selection([('make_to_stock', 'from stock'), ('make_to_order', 'on order')], 'Procurement Method', required=True, readonly=True, states={'draft': [('readonly', False)]},
help="From stock: When needed, the product is taken from the stock or we wait for replenishment.\nOn order: When needed, the product is purchased or produced."), help="From stock: When needed, the product is taken from the stock or we wait for replenishment.\nOn order: When needed, the product is purchased or produced."),
@ -787,7 +789,7 @@ class sale_order_line(osv.osv):
vals = self._prepare_order_line_invoice_line(cr, uid, line, False, context) vals = self._prepare_order_line_invoice_line(cr, uid, line, False, context)
if vals: if vals:
inv_id = self.pool.get('account.invoice.line').create(cr, uid, vals, context=context) inv_id = self.pool.get('account.invoice.line').create(cr, uid, vals, context=context)
cr.execute('insert into sale_order_line_invoice_rel (order_line_id,invoice_id) values (%s,%s)', (line.id, inv_id)) self.write(cr, uid, [line.id], {'invoice_lines': [(4, inv_id)]}, context=context)
sales.add(line.order_id.id) sales.add(line.order_id.id)
create_ids.append(inv_id) create_ids.append(inv_id)
# Trigger workflow events # Trigger workflow events

View File

@ -103,7 +103,7 @@
<field name="partner_id" on_change="onchange_partner_id(partner_id, context)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/> <field name="partner_id" on_change="onchange_partner_id(partner_id, context)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/> <field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/> <field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
<field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name, 'default_type': 'contract'}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/> <field name="project_id" context="{'partner_id':partner_id, 'default_pricelist_id':pricelist_id, 'default_name':name, 'default_type': 'contract'}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
</group> </group>
<group> <group>
<field name="date_order"/> <field name="date_order"/>