first commit
This commit is contained in:
2
modules/project_invoice/__init__.py
Normal file
2
modules/project_invoice/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
BIN
modules/project_invoice/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
modules/project_invoice/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
modules/project_invoice/__pycache__/exceptions.cpython-311.pyc
Normal file
BIN
modules/project_invoice/__pycache__/exceptions.cpython-311.pyc
Normal file
Binary file not shown.
BIN
modules/project_invoice/__pycache__/invoice.cpython-311.pyc
Normal file
BIN
modules/project_invoice/__pycache__/invoice.cpython-311.pyc
Normal file
Binary file not shown.
BIN
modules/project_invoice/__pycache__/project.cpython-311.pyc
Normal file
BIN
modules/project_invoice/__pycache__/project.cpython-311.pyc
Normal file
Binary file not shown.
BIN
modules/project_invoice/__pycache__/timesheet.cpython-311.pyc
Normal file
BIN
modules/project_invoice/__pycache__/timesheet.cpython-311.pyc
Normal file
Binary file not shown.
7
modules/project_invoice/exceptions.py
Normal file
7
modules/project_invoice/exceptions.py
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.exceptions import UserError
|
||||
|
||||
|
||||
class InvoicingError(UserError):
|
||||
pass
|
||||
117
modules/project_invoice/invoice.py
Normal file
117
modules/project_invoice/invoice.py
Normal file
@@ -0,0 +1,117 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
import datetime as dt
|
||||
|
||||
from sql.aggregate import Sum
|
||||
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import fields
|
||||
from trytond.modules.account_invoice.exceptions import (
|
||||
InvoiceLineValidationError)
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.tools import grouped_slice, reduce_ids
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
|
||||
class InvoiceLine(metaclass=PoolMeta):
|
||||
__name__ = 'account.invoice.line'
|
||||
|
||||
project_invoice_works = fields.One2Many(
|
||||
'project.work', 'invoice_line',
|
||||
"Project Invoice Works", readonly=True)
|
||||
project_invoice_progresses = fields.One2Many(
|
||||
'project.work.invoiced_progress', 'invoice_line',
|
||||
"Project Invoice Progresses", readonly=True)
|
||||
project_invoice_timesheet_duration = fields.Function(
|
||||
fields.TimeDelta("Project Invoice Timesheet Duration"),
|
||||
'get_project_invoice_timesheet_duration')
|
||||
|
||||
@classmethod
|
||||
def check_validate_project_invoice_quantity(cls, lines, field_names):
|
||||
pool = Pool()
|
||||
Lang = pool.get('ir.lang')
|
||||
if field_names and not (field_names & {
|
||||
'quantity', 'project_invoice_works'}):
|
||||
return
|
||||
for line in lines:
|
||||
project_invoice_quantity = line.project_invoice_quantity
|
||||
if project_invoice_quantity is None:
|
||||
continue
|
||||
if line.unit:
|
||||
project_invoice_quantity = line.unit.round(
|
||||
project_invoice_quantity)
|
||||
if line.quantity != project_invoice_quantity:
|
||||
lang = Lang.get()
|
||||
if line.unit:
|
||||
quantity = lang.format_number_symbol(
|
||||
project_invoice_quantity, line.unit)
|
||||
else:
|
||||
quantity = lang.format_number(project_invoice_quantity)
|
||||
raise InvoiceLineValidationError(gettext(
|
||||
'project_invoice.msg_project_invoice_line_quantity',
|
||||
invoice_line=line.rec_name,
|
||||
quantity=quantity,
|
||||
))
|
||||
|
||||
@property
|
||||
def project_invoice_quantity(self):
|
||||
quantity = None
|
||||
for work in self.project_invoice_works:
|
||||
if quantity is None:
|
||||
quantity = 0
|
||||
if work.price_list_hour:
|
||||
quantity += work.effort_hours
|
||||
else:
|
||||
quantity += 1
|
||||
for progress in self.project_invoice_progresses:
|
||||
if quantity is None:
|
||||
quantity = 0
|
||||
work = progress.work
|
||||
if work.price_list_hour:
|
||||
quantity += progress.progress * work.effort_hours
|
||||
else:
|
||||
quantity += progress.progress
|
||||
if self.project_invoice_timesheet_duration is not None:
|
||||
if quantity is None:
|
||||
quantity = 0
|
||||
quantity += (
|
||||
self.project_invoice_timesheet_duration.total_seconds()
|
||||
/ 60 / 60)
|
||||
return quantity
|
||||
|
||||
@classmethod
|
||||
def get_project_invoice_timesheet_duration(cls, lines, name):
|
||||
pool = Pool()
|
||||
TimesheetLine = pool.get('timesheet.line')
|
||||
cursor = Transaction().connection.cursor()
|
||||
ts_line = TimesheetLine.__table__()
|
||||
|
||||
durations = dict.fromkeys(map(int, lines))
|
||||
query = ts_line.select(
|
||||
ts_line.invoice_line, Sum(ts_line.duration),
|
||||
group_by=ts_line.invoice_line)
|
||||
for sub_lines in grouped_slice(lines):
|
||||
query.where = reduce_ids(
|
||||
ts_line.invoice_line, map(int, sub_lines))
|
||||
cursor.execute(*query)
|
||||
|
||||
for line_id, duration in cursor:
|
||||
# SQLite uses float for SUM
|
||||
if (duration is not None
|
||||
and not isinstance(duration, dt.timedelta)):
|
||||
duration = dt.timedelta(seconds=duration)
|
||||
durations[line_id] = duration
|
||||
return durations
|
||||
|
||||
@classmethod
|
||||
def validate_fields(cls, lines, field_names):
|
||||
super().validate_fields(lines, field_names)
|
||||
cls.check_validate_project_invoice_quantity(lines, field_names)
|
||||
|
||||
@classmethod
|
||||
def copy(cls, lines, default=None):
|
||||
default = default.copy() if default is not None else {}
|
||||
default.setdefault('project_invoice_works')
|
||||
default.setdefault('project_invoice_progresses')
|
||||
return super().copy(lines, default=default)
|
||||
189
modules/project_invoice/locale/bg.po
Normal file
189
modules/project_invoice/locale/bg.po
Normal file
@@ -0,0 +1,189 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ред от фактура"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Начин на фактуриране"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Начин на фактуриране"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Начин на фактуриране"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Начин на фактуриране"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ред от фактура"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Задача"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ред от фактура"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Редове от график"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Фактури"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Ръчно"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
188
modules/project_invoice/locale/ca.po
Normal file
188
modules/project_invoice/locale/ca.po
Normal file
@@ -0,0 +1,188 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Progressos del treball facturat"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Duració dels fulls de treball facturada"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Treballs de projecte facturats"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Import a facturar"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línia de factura"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Mètode de facturació"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factura fins el"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Import facturat"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progrés facturat"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Mètode de facturació"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factura fins el"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Quantitat a facturar"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línia de factura"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progrés"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Treball"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línia de factura"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Limita les línies del full de treball a facturar a les anteriors a aquesta "
|
||||
"data."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Línies del full de treball"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Factures"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"No es pot eliminar la línia del full de treball \"%(line)s\" perquè s'ha "
|
||||
"facturat."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
"No es pot modificar la duració de la línia del full de treball \"%(line)s\" "
|
||||
"perquè s'ha facturat."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
"No es pot modificar el treball de la línia del full de treball \"%(line)s\" "
|
||||
"perquè s'ha facturat."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "No podeu eliminar el treball \"%(work)s\" perquè s'ha facturat."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
"No es pot modificar l'esforç del treball \"%(work)s\" perquè s'ha facturat."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Per facturar el treball \"%(work)s\" heu de configurar un compte d'ingressos"
|
||||
" per defecte."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "No hi ha cap preu de venda al treball \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "No hi ha cap tercer al treball \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Per facturar el treball \"%(work)s\" heu de definir un compte d'ingressos "
|
||||
"pel producte \"%(product)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
"La quantitat de la línea de factura de projecte \"%(invoice_line)s\" ha de "
|
||||
"ser \"%(quantity)s\"."
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Factura"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Progressos del treball facturat"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Facturació de projectes"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manual"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Per l'esforç estimat"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Segons el progrés"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Per les hores realitzades"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
181
modules/project_invoice/locale/cs.po
Normal file
181
modules/project_invoice/locale/cs.po
Normal file
@@ -0,0 +1,181 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
191
modules/project_invoice/locale/de.po
Normal file
191
modules/project_invoice/locale/de.po
Normal file
@@ -0,0 +1,191 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Nach Fortschritt abgerechnete Projektaufgaben"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Nach Aufwand abgerechnete Projektaufgaben"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Projektaufgaben"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Fakturierbarer Betrag"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Rechnungsposition"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Methode Rechnungsstellung"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Abrechnen bis"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Abgerechneter Betrag"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Fortschritt Fakturierung"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Methode Rechnungsstellung"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Abrechnen bis"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Fakturierbare Menge"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Rechnungsposition"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Fortschritt"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Projektaufgabe"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Rechnungsposition"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Es werden nur Zeiterfassungspositionen vor dem angegebenen Datum "
|
||||
"abgerechnet."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Zeiterfassungspositionen"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Rechnungen"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"Zeiterfassungsposition \"%(line)s\" kann nicht mehr gelöscht werden, weil "
|
||||
"diese bereits in Rechnung gestellt ist."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
"Die Dauer der Zeiterfassungsposition \"%(line)s\" kann nicht mehr geändert "
|
||||
"werden, weil diese bereits in Rechnung gestellt ist."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
"Die Aufgabe von Zeiterfassungsposition \"%(line)s\" kann nicht mehr geändert"
|
||||
" werden, weil diese bereits in Rechnung gestellt ist."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"Die Projektaufgabe \"%(work)s\" kann nicht mehr gelöscht werden, weil diese "
|
||||
"bereits in Rechnung gestellt ist."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
"Der Aufwand von Projektaufgabe \"%(work)s\" kann nicht mehr geändert werden,"
|
||||
" weil diese bereits fakturiert ist."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Damit Projekt \"%(work)s\" fakturiert werden kann, muss ein "
|
||||
"Standardertragskonto konfiguriert werden."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Fehlender Listenpreis für Projektaufgabe \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Fehlende Partei für Projektaufgabe \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Damit Projekt \"%(work)s\" fakturiert werden kann, muss ein Ertragskonto für"
|
||||
" Artikel \"%(product)s\" konfiguriert werden."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
"Die Menge von Projektrechnungsposition \"%(invoice_line)s\" muss "
|
||||
"\"%(quantity)s\" betragen."
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Rechnung erstellen"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Projekt Nach Fortschritt abgerechnete Projektaufgaben"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Projekt Fakturierung"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manuell"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Nach veranschlagtem Aufwand"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Nach Fortschritt"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Nach erfasstem Aufwand"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
189
modules/project_invoice/locale/es.po
Normal file
189
modules/project_invoice/locale/es.po
Normal file
@@ -0,0 +1,189 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Progresos del trabajo facturado"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Duración de los partes de trabajo facturados"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Trabajos de proyectos facturados"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Importe a facturar"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línea de factura"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Método de facturación"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factura hasta"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Importe facturado"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progreso facturado"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Método de facturación"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factura hasta el"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Cantidad a facturar"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línea de factura"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progreso"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Trabajo"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Línea de factura"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Limita las líneas de la hoja de trabajo a facturar a las anteriores a esa "
|
||||
"fecha."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Líneas del parte de trabajo"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Facturas"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"No puedes eliminar la linea del parte de trabajo \"%(line)s\" porque se ha "
|
||||
"facturado."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
"No puedes modificar la duración de la linea del parte de trabajo "
|
||||
"\"%(line)s\" porque se ha facturado."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
"No puedes modificar el trabajo de la linea del parte de trabajo \"%(line)s\""
|
||||
" porque se ha facturado."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "No se puede eliminar el trabajo \"%(work)s\" porque se ha facturado."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
"No se puede modificar el esfuerzo del trabajo \"%(work)s\" porque se ha "
|
||||
"facturado."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Para facturar el trabajo \"%(work)s\" debéis configurar una cuenta de "
|
||||
"ingressos por defecto."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "No hay ningún precio en el trabajo \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "No hay ningún tercero en el trabajo \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Para facturar el trabajo \"%(work)s\" debeis definir una cuenta de ingressos"
|
||||
" para el producto \"%(product)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
"La cantidad de la linea de factura de proyecto \"%(invoice_line)s\" debe ser"
|
||||
" \"%(quantity)s\"."
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Factura"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Progresos del trabajo facturado"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Facturación de proyectos"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manual"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Por el esfuerzo estimado"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Según el progreso"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Por las horas realizadas"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
182
modules/project_invoice/locale/es_419.po
Normal file
182
modules/project_invoice/locale/es_419.po
Normal file
@@ -0,0 +1,182 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Progreso facturado de trabajo"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Progreso facturado de trabajo"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Duración a facturar"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Duración facturada"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progreso facturado de trabajo"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Duración facturada"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Duración a facturar"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progreso facturado de trabajo"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Progreso facturado de trabajo"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
182
modules/project_invoice/locale/et.po
Normal file
182
modules/project_invoice/locale/et.po
Normal file
@@ -0,0 +1,182 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Arveldatud progress"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Arveldatud ajakulu"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Projekti arve"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Ajakulu arvele"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Arve rida"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Arve meetod"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Arve meetod"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Arveldatav summa"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Arveldatud progress"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Arve meetod"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Arve meetod"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Ajakulu arvele"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Arve rida"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progressiga"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Töö"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Arve rida"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Töögraafiku read"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Arved"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "Ei saa kustutada arveldatud rida."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Tööle \"%(work)s\" ei ole määratud hinda."
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Tööle \"%(work)s\" ei ole määratud hinda."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Arve"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Arveldatud progress"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Projekti arve"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Käsitsi"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Püüdlusega"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Progressiga"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Töögraafikus"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
182
modules/project_invoice/locale/fa.po
Normal file
182
modules/project_invoice/locale/fa.po
Normal file
@@ -0,0 +1,182 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "پیشرفت های کار فاکتورشده"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "مدت زمان فاکتور شده"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "صورتحساب پروژه"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "مدت زمان صورتحساب"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "خط صورتحساب"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "سبک صورتحساب"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "سبک صورتحساب"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "مبلغ صورتحساب"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "پیشرفت های فاکتورشده"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "روش صورتحساب"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "سبک صورتحساب"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "مدت زمان صورتحساب"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "خط صورتحساب"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "در حال پیش رفت"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "کار"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "خط صورتحساب"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "خطوط جدول زمانی"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "صورتحساب ها"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "شما نمی توانید سطر صورتحساب را حذف کنید."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "در کار : \"%s\" هیچ لیست قیمتی وجود ندارد."
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "در کار : \"%s\" هیچ نهاد/سازمانی وجود ندارد."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "پیشرفت های کار فاکتورشده"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "صورتحساب پروژه"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "دستی"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "در حال تلاش"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "در حال پیش رفت"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "در جدول زمانی"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
181
modules/project_invoice/locale/fi.po
Normal file
181
modules/project_invoice/locale/fi.po
Normal file
@@ -0,0 +1,181 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
190
modules/project_invoice/locale/fr.po
Normal file
190
modules/project_invoice/locale/fr.po
Normal file
@@ -0,0 +1,190 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Avancement de facturation de projet"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Durée de relevé de temps de facturation de projet"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Travaux de facturation de projet"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Montant à facturer"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ligne de facture"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Méthode de facturation"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Facturer jusqu'à"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Montant facturé"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progression facturée"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Méthode de facturation"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Facturer jusqu'à"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Quantité à facturer"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ligne de facture"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progression"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Travail"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Ligne de facture"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Limite les lignes de relevé de temps facturées à celles antérieures à la "
|
||||
"date."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Lignes de relevé de temps"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Factures"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas supprimer la ligne de relevé de temps « %(line)s » car "
|
||||
"elle a été facturée."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas modifier la durée de la ligne de relevé de temps "
|
||||
"« %(line)s » car elle a été facturée."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas modifier le travail de la ligne de feuille de temps "
|
||||
"« %(line)s » car il a été facturé."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas supprimer le travail « %(work)s » car il a été facturé."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas modifier l'effort de travail « %(work)s » car il a été "
|
||||
"facturé."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Pour facturer le travail « %(work)s », vous devez configurer un compte de "
|
||||
"revenu par défaut."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Il n'y a pas de prix listé sur le travail « %(work)s »."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Il n'y a pas de tiers sur le travail « %(work)s »."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Pour facturer le travail « %(work)s », vous devez définir un compte de "
|
||||
"revenu pour le produit « %(product)s »."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
"La quantité de la ligne de facture de projet « %(invoice_line)s » doit être "
|
||||
"de « %(quantity)s »."
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Facturer"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Avancement des travaux du projet facturé"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Facture projet"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manuel"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Sur l'effort"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Sur progrès"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Sur relevé de temps"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
183
modules/project_invoice/locale/hu.po
Normal file
183
modules/project_invoice/locale/hu.po
Normal file
@@ -0,0 +1,183 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Tevékenység"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Időpozíció"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
175
modules/project_invoice/locale/id.po
Normal file
175
modules/project_invoice/locale/id.po
Normal file
@@ -0,0 +1,175 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Baris Faktur"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Metode Faktur"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Metode Faktur"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Metode Faktur"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Baris Faktur"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Kerja"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Baris Faktur"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Faktur-Faktur"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "Anda tidak dapat menghapus baris yang ditagih."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Faktur"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
183
modules/project_invoice/locale/it.po
Normal file
183
modules/project_invoice/locale/it.po
Normal file
@@ -0,0 +1,183 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Avanzamento del lavoro fatturato"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Fattura progetto"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Fattura progetto"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Importo da fatturare"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Riga fattura"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Metodo di fatturazione"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Fattura fino a"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Importo fatturato"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progresso fatturato"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Metodo di fatturazione"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Fattura fino a"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Quantità da fatturare"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Riga fattura"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Progresso"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Lavoro"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Riga fattura"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Limita quali righe del foglio presenze vengono fatturate solo a quelle prima"
|
||||
" della data."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Fatture"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "Non è possibile eliminare una riga fatturata."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Per fatturare il lavoro \"%(work)s\" è necessario configurare un conto delle"
|
||||
" entrate di default."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Non esiste un prezzo di listino sul lavoro \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "manca la controparte sul lavoro \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Per fatturare il lavoro \"%(work)s\" è necessario definire un conto delle "
|
||||
"entrate per il prodotto \"%(product)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Fattura"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Avanzamento del lavoro fatturato"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Fattura progetto"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manuale"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Sull'impegno stimato"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "In corso"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
187
modules/project_invoice/locale/lo.po
Normal file
187
modules/project_invoice/locale/lo.po
Normal file
@@ -0,0 +1,187 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "ລາຍການ"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "ລາຍການ"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "ເຮັດວຽກ"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "ລາຍການ"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "ແຖວຕາຕະລາງເຮັດວຽກ"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "ໃບເກັບເງິນ"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "ໃສ່ເອົາເອງ"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
180
modules/project_invoice/locale/lt.po
Normal file
180
modules/project_invoice/locale/lt.po
Normal file
@@ -0,0 +1,180 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Sąskaitos faktūros eilutė"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Sąskaita faktūra išrašoma"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Sąskaita faktūra išrašoma"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Sąskaitos faktūros suma"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Sąskaita faktūra išrašoma"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Sąskaita faktūra išrašoma"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Sąskaitos faktūros eilutė"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Sąskaitos faktūros eilutė"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Sąskaitos faktūros"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Sąskaita faktūra"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Projekto sąskaita faktūra"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
190
modules/project_invoice/locale/nl.po
Normal file
190
modules/project_invoice/locale/nl.po
Normal file
@@ -0,0 +1,190 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Factuur vordering projectwerk"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Factuur project tijdsduur urenstaat"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Factuur"
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Factureer baar bedrag"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Factuurregel"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Factuurmethode"
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factureer tot"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Gefactureerd bedrag"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Gefactureerde voortgang"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Factuurmethode"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Factureer tot"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Factureerbare hoeveelheid"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Factuurregel"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Vooruitgang"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Werk"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Factuurregel"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
"Beperkt urenstaatregels die gefactureerd worden tot a die voor deze datum."
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Tijdregistratieregels"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Verkoopfacturen"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"U kunt urenstaatregel \"%(line)s\" niet verwijderen omdat deze is "
|
||||
"gefactureerd."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
"U kunt de duur van urenstaatregel \"%(line)s\" niet wijzigen omdat deze is "
|
||||
"gefactureerd."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
"U kunt de werkzaamheden van urenstaatregel \"%(line)s\" niet wijzigen omdat "
|
||||
"deze is gefactureerd."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
"U kunt werkzaamheden \"%(work)s\" niet verwijderen omdat deze is "
|
||||
"gefactureerd."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
"U kunt de inspanning van de werkzaamheden \"%(work)s\" niet wijzigen omdat "
|
||||
"deze is gefactureerd."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
"Om werk \"%(work)s\" te factureren, moet u een standaard omzetaccount "
|
||||
"configureren."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Er is geen catalogusprijs op werk \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Er is geen relatie op werk \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
"Om werk \"%(work)s\" te factureren, moet u een omzet account definiëren voor"
|
||||
" het product \"%(product)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
"De hoeveelheid van de project factuurregel \"%(invoice_line)s\" moet "
|
||||
"\"%(quantity)s\" zijn."
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Factuur"
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project gefactureerde voortgang werkzaamheden"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Projectfactuur"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Handmatig"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Naar inspanning (in regie?)"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Naar voortgang"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Op urenstaat"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr "%"
|
||||
181
modules/project_invoice/locale/pl.po
Normal file
181
modules/project_invoice/locale/pl.po
Normal file
@@ -0,0 +1,181 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Wiersz faktury"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Wiersz faktury"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Praca"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Wiersz faktury"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
182
modules/project_invoice/locale/pt.po
Normal file
182
modules/project_invoice/locale/pt.po
Normal file
@@ -0,0 +1,182 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Progresso Faturado do Trabalho"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Tempo Faturado"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Fatura do Projeto"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Tempo a Faturar"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Linha da Fatura"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Método de Fatura"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Método de Fatura"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Montante de Fatura"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Progresso Faturado"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Método de Faturamento"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Método de Fatura"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Tempo a Faturar"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Linha de Fatura"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Em Progesso"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Tarefa"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Linha de Fatura"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Linhas da Folha de Ponto"
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Faturas"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "Você não pode apagar uma linha já faturada."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Não há preço para a tarefa \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Não há pessoa na tarefa \"%(work)s\"."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Progresso Faturado do Trabalho"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Fatura do Projeto"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Manual"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Por Esforço"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Sobre o Progresso"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Na Folha de Ponto"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
173
modules/project_invoice/locale/ro.po
Normal file
173
modules/project_invoice/locale/ro.po
Normal file
@@ -0,0 +1,173 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
189
modules/project_invoice/locale/ru.po
Normal file
189
modules/project_invoice/locale/ru.po
Normal file
@@ -0,0 +1,189 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Строка инвойса"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Метод инвойса"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Метод инвойса"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Метод инвойса"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Метод инвойса"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Строка инвойса"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Работа"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Строка инвойса"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Строки табеля"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Инвойсы"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Ручной"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
185
modules/project_invoice/locale/sl.po
Normal file
185
modules/project_invoice/locale/sl.po
Normal file
@@ -0,0 +1,185 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Zaračunana opravljena dela"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Zaračunan porabljen čas"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Čas do zaračunanja"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Postavka računa"
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Način obračuna"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Način obračuna"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr "Zaračunan znesek"
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr "Zaračunano opravljeno delo"
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr "Način obračuna"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Način obračuna"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr "Čas do zaračunanja"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Postavka računa"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr "Po napredku"
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr "Naloga"
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr "Postavka računa"
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr "Obračunane postavke ni možne brisati."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr "Pri nalogi \"%s\" ni cenika."
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr "Pri nalogi \"%s\" ni partnerja."
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Zaračunana opravljena dela"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr "Ročno"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr "Po oceni dela"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr "Po napredku"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr "Po dejanskem delu"
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
181
modules/project_invoice/locale/tr.po
Normal file
181
modules/project_invoice/locale/tr.po
Normal file
@@ -0,0 +1,181 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
173
modules/project_invoice/locale/uk.po
Normal file
173
modules/project_invoice/locale/uk.po
Normal file
@@ -0,0 +1,173 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
181
modules/project_invoice/locale/zh_CN.po
Normal file
181
modules/project_invoice/locale/zh_CN.po
Normal file
@@ -0,0 +1,181 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_progresses:"
|
||||
msgid "Project Invoice Progresses"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_timesheet_duration:"
|
||||
msgid "Project Invoice Timesheet Duration"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:account.invoice.line,project_invoice_works:"
|
||||
msgid "Project Invoice Works"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,amount_to_invoice:"
|
||||
msgid "Amount to Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,invoiced_amount:"
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,invoiced_progress:"
|
||||
msgid "Invoiced Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work,project_invoice_method:"
|
||||
msgid "Invoice Method"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "field:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid "Invoice up to"
|
||||
msgstr "Invoice"
|
||||
|
||||
msgctxt "field:project.work,quantity_to_invoice:"
|
||||
msgid "Quantity to Invoice"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,progress:"
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:project.work.invoiced_progress,work:"
|
||||
msgid "Work"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:timesheet.line,invoice_line:"
|
||||
msgid "Invoice Line"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:project.work,project_invoice_timesheet_up_to:"
|
||||
msgid ""
|
||||
"Limits which timesheet lines get invoiced to only those before the date."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
|
||||
msgid "Timesheet Lines"
|
||||
msgstr "Timesheet Lines"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:ir.action,name:open_invoice"
|
||||
msgid "Invoices"
|
||||
msgstr "Invoices"
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_delete"
|
||||
msgid ""
|
||||
"You cannot delete timesheet line \"%(line)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_duration"
|
||||
msgid ""
|
||||
"You cannot modify the duration of timesheet line \"%(line)s\" because it has"
|
||||
" been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_timesheet_line_modify_work"
|
||||
msgid ""
|
||||
"You cannot modify the work of timesheet line \"%(line)s\" because it has "
|
||||
"been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_delete"
|
||||
msgid "You cannot delete work \"%(work)s\" because it has been invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_invoiced_work_modify_effort"
|
||||
msgid ""
|
||||
"You cannot modify the effort of work \"%(work)s\" because it has been "
|
||||
"invoiced."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_account_revenue"
|
||||
msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_list_price"
|
||||
msgid "There is no list price on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_missing_party"
|
||||
msgid "There is no party on work \"%(work)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
|
||||
msgid ""
|
||||
"To invoice work \"%(work)s\" you must define an account revenue for product "
|
||||
"\"%(product)s\"."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgctxt "model:ir.message,text:msg_project_invoice_line_quantity"
|
||||
msgid ""
|
||||
"The quantity of project invoice line \"%(invoice_line)s\" must be "
|
||||
"\"%(quantity)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.model.button,string:work_invoice_button"
|
||||
msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "model:project.work.invoiced_progress,string:"
|
||||
msgid "Project Work Invoiced Progress"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "model:res.group,name:group_project_invoice"
|
||||
msgid "Project Invoice"
|
||||
msgstr "Project Invoice"
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "Manual"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Effort"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Progress"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:project.work,project_invoice_method:"
|
||||
msgid "On Timesheet"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:project.work.invoiced_progress:"
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
37
modules/project_invoice/message.xml
Normal file
37
modules/project_invoice/message.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data grouped="1">
|
||||
<record model="ir.message" id="msg_invoiced_timesheet_line_modify_duration">
|
||||
<field name="text">You cannot modify the duration of timesheet line "%(line)s" because it has been invoiced.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_invoiced_timesheet_line_modify_work">
|
||||
<field name="text">You cannot modify the work of timesheet line "%(line)s" because it has been invoiced.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_invoiced_timesheet_line_delete">
|
||||
<field name="text">You cannot delete timesheet line "%(line)s" because it has been invoiced.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_missing_account_revenue">
|
||||
<field name="text">To invoice work "%(work)s" you must define an account revenue for product "%(product)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_missing_account_revenue">
|
||||
<field name="text">To invoice work "%(work)s" you must configure a default account revenue.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_missing_list_price">
|
||||
<field name="text">There is no list price on work "%(work)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_missing_party">
|
||||
<field name="text">There is no party on work "%(work)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_invoiced_work_modify_effort">
|
||||
<field name="text">You cannot modify the effort of work "%(work)s" because it has been invoiced.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_invoiced_work_delete">
|
||||
<field name="text">You cannot delete work "%(work)s" because it has been invoiced.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_project_invoice_line_quantity">
|
||||
<field name="text">The quantity of project invoice line "%(invoice_line)s" must be "%(quantity)s".</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
695
modules/project_invoice/project.py
Normal file
695
modules/project_invoice/project.py
Normal file
@@ -0,0 +1,695 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
|
||||
import datetime
|
||||
from collections import defaultdict
|
||||
from decimal import Decimal
|
||||
from itertools import groupby
|
||||
|
||||
from sql import Cast, Null
|
||||
from sql.aggregate import Sum
|
||||
from sql.operators import Concat
|
||||
|
||||
from trytond import backend
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import ModelSQL, ModelView, fields
|
||||
from trytond.model.exceptions import AccessError
|
||||
from trytond.modules.currency.fields import Monetary
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Bool, Eval, Id, If
|
||||
from trytond.tools import grouped_slice, reduce_ids, sqlite_apply_types
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.wizard import StateAction, Wizard
|
||||
|
||||
from .exceptions import InvoicingError
|
||||
|
||||
|
||||
class Effort:
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.project_invoice_method.selection.append(
|
||||
('effort', "On Effort"))
|
||||
|
||||
@classmethod
|
||||
def _get_quantity_to_invoice_effort(cls, works):
|
||||
quantities = {}
|
||||
for work in works:
|
||||
if (work.progress == 1
|
||||
and work.invoice_unit_price
|
||||
and not work.invoice_line):
|
||||
if work.price_list_hour:
|
||||
quantity = work.effort_hours
|
||||
else:
|
||||
quantity = 1
|
||||
if work.unit_to_invoice:
|
||||
quantity = work.unit_to_invoice.round(quantity)
|
||||
quantities[work.id] = quantity
|
||||
return quantities
|
||||
|
||||
@classmethod
|
||||
def _get_invoiced_amount_effort(cls, works):
|
||||
pool = Pool()
|
||||
InvoiceLine = pool.get('account.invoice.line')
|
||||
Currency = pool.get('currency.currency')
|
||||
|
||||
invoice_lines = InvoiceLine.browse([
|
||||
w.invoice_line.id for w in works
|
||||
if w.invoice_line])
|
||||
|
||||
id2invoice_lines = dict((l.id, l) for l in invoice_lines)
|
||||
amounts = {}
|
||||
for work in works:
|
||||
currency = work.company.currency
|
||||
if work.invoice_line:
|
||||
invoice_line = id2invoice_lines[work.invoice_line.id]
|
||||
invoice_currency = (invoice_line.invoice.currency
|
||||
if invoice_line.invoice else invoice_line.currency)
|
||||
if work.price_list_hour:
|
||||
amount = (
|
||||
Decimal(str(work.effort_hours))
|
||||
* invoice_line.unit_price)
|
||||
else:
|
||||
amount = invoice_line.unit_price
|
||||
amounts[work.id] = Currency.compute(
|
||||
invoice_currency, amount, currency)
|
||||
else:
|
||||
amounts[work.id] = Decimal(0)
|
||||
return amounts
|
||||
|
||||
def get_origins_to_invoice(self):
|
||||
try:
|
||||
origins = super().get_origins_to_invoice()
|
||||
except AttributeError:
|
||||
origins = []
|
||||
if self.invoice_method == 'effort':
|
||||
origins.append(self)
|
||||
return origins
|
||||
|
||||
|
||||
class Progress:
|
||||
__slots__ = ()
|
||||
invoiced_progress = fields.One2Many('project.work.invoiced_progress',
|
||||
'work', 'Invoiced Progress', readonly=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.project_invoice_method.selection.append(
|
||||
('progress', 'On Progress'))
|
||||
|
||||
@classmethod
|
||||
def _get_quantity_to_invoice_progress(cls, works):
|
||||
pool = Pool()
|
||||
Progress = pool.get('project.work.invoiced_progress')
|
||||
|
||||
cursor = Transaction().connection.cursor()
|
||||
table = cls.__table__()
|
||||
progress = Progress.__table__()
|
||||
|
||||
invoiced_progress = {}
|
||||
quantities = {}
|
||||
for sub_works in grouped_slice(works):
|
||||
sub_works = list(sub_works)
|
||||
where = reduce_ids(
|
||||
table.id, [x.id for x in sub_works if x.invoice_unit_price])
|
||||
cursor.execute(*table.join(progress,
|
||||
condition=progress.work == table.id
|
||||
).select(table.id, Sum(progress.progress),
|
||||
where=where,
|
||||
group_by=table.id))
|
||||
invoiced_progress.update(dict(cursor))
|
||||
|
||||
for work in sub_works:
|
||||
delta = (
|
||||
(work.progress or 0)
|
||||
- invoiced_progress.get(work.id, 0.0))
|
||||
if work.invoice_unit_price and delta > 0:
|
||||
quantity = delta
|
||||
if work.price_list_hour:
|
||||
quantity *= work.effort_hours
|
||||
if work.unit_to_invoice:
|
||||
quantity = work.unit_to_invoice.round(quantity)
|
||||
quantities[work.id] = quantity
|
||||
return quantities
|
||||
|
||||
@property
|
||||
def progress_to_invoice(self):
|
||||
if self.quantity_to_invoice:
|
||||
if self.price_list_hour:
|
||||
return self.quantity_to_invoice / self.effort_hours
|
||||
else:
|
||||
return self.quantity_to_invoice
|
||||
|
||||
@classmethod
|
||||
def _get_invoiced_amount_progress(cls, works):
|
||||
pool = Pool()
|
||||
Progress = pool.get('project.work.invoiced_progress')
|
||||
InvoiceLine = pool.get('account.invoice.line')
|
||||
Company = pool.get('company.company')
|
||||
Currency = pool.get('currency.currency')
|
||||
|
||||
cursor = Transaction().connection.cursor()
|
||||
table = cls.__table__()
|
||||
progress = Progress.__table__()
|
||||
invoice_line = InvoiceLine.__table__()
|
||||
company = Company.__table__()
|
||||
|
||||
amounts = defaultdict(Decimal)
|
||||
work2currency = {}
|
||||
ids2work = dict((w.id, w) for w in works)
|
||||
for sub_ids in grouped_slice(ids2work.keys()):
|
||||
where = reduce_ids(table.id, sub_ids)
|
||||
query = (table.join(progress,
|
||||
condition=progress.work == table.id
|
||||
).join(invoice_line,
|
||||
condition=progress.invoice_line == invoice_line.id
|
||||
).select(
|
||||
table.id,
|
||||
Sum(Cast(progress.progress, 'NUMERIC')
|
||||
* invoice_line.unit_price).as_('amount'),
|
||||
where=where,
|
||||
group_by=table.id))
|
||||
if backend.name == 'sqlite':
|
||||
sqlite_apply_types(query, [None, 'NUMERIC'])
|
||||
cursor.execute(*query)
|
||||
for work_id, amount in cursor:
|
||||
work = ids2work[work_id]
|
||||
if work.price_list_hour:
|
||||
amount *= Decimal(str(work.effort_hours))
|
||||
amounts[work_id] = amount
|
||||
|
||||
cursor.execute(*table.join(company,
|
||||
condition=table.company == company.id
|
||||
).select(table.id, company.currency,
|
||||
where=where))
|
||||
work2currency.update(cursor)
|
||||
|
||||
currencies = Currency.browse(set(work2currency.values()))
|
||||
id2currency = {c.id: c for c in currencies}
|
||||
|
||||
for work in works:
|
||||
currency = id2currency[work2currency[work.id]]
|
||||
amounts[work.id] = currency.round(amounts[work.id])
|
||||
return amounts
|
||||
|
||||
def get_origins_to_invoice(self):
|
||||
pool = Pool()
|
||||
InvoicedProgress = pool.get('project.work.invoiced_progress')
|
||||
try:
|
||||
origins = super().get_origins_to_invoice()
|
||||
except AttributeError:
|
||||
origins = []
|
||||
if self.invoice_method == 'progress':
|
||||
invoiced_progress = InvoicedProgress(
|
||||
work=self, progress=self.progress_to_invoice)
|
||||
origins.append(invoiced_progress)
|
||||
return origins
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('invoiced_progress', None)
|
||||
return super().copy(records, default=default)
|
||||
|
||||
|
||||
class Timesheet:
|
||||
__slots__ = ()
|
||||
project_invoice_timesheet_up_to = fields.Date(
|
||||
"Invoice up to",
|
||||
states={
|
||||
'invisible': Eval('project_invoice_method') != 'timesheet',
|
||||
},
|
||||
depends=['project_invoice_method'],
|
||||
help="Limits which timesheet lines get invoiced to "
|
||||
"only those before the date.")
|
||||
invoice_timesheet_up_to = fields.Function(fields.Date(
|
||||
"Invoice up to"), 'on_change_with_invoice_timesheet_up_to')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.project_invoice_method.selection.append(
|
||||
('timesheet', 'On Timesheet'))
|
||||
cls.product.domain = [
|
||||
cls.product.domain,
|
||||
If(Eval('invoice_method') == 'timesheet',
|
||||
('default_uom_category', '=', Id('product', 'uom_cat_time')),
|
||||
()),
|
||||
]
|
||||
if 'invoice_method' not in cls.product.depends:
|
||||
cls.product.depends.add('invoice_method')
|
||||
|
||||
@fields.depends('type', 'project_invoice_timesheet_up_to',
|
||||
'parent', '_parent_parent.invoice_timesheet_up_to')
|
||||
def on_change_with_invoice_timesheet_up_to(self, name=None):
|
||||
if self.type == 'project':
|
||||
return self.project_invoice_timesheet_up_to
|
||||
elif self.parent:
|
||||
return self.parent.invoice_timesheet_up_to
|
||||
|
||||
@classmethod
|
||||
def _get_quantity_to_invoice_timesheet(cls, works):
|
||||
pool = Pool()
|
||||
TimesheetLine = pool.get('timesheet.line')
|
||||
cursor = Transaction().connection.cursor()
|
||||
line = TimesheetLine.__table__()
|
||||
|
||||
upto2tworks = defaultdict(list)
|
||||
twork2work = {}
|
||||
for work in works:
|
||||
upto = work.invoice_timesheet_up_to
|
||||
for timesheet_work in work.timesheet_works:
|
||||
twork2work[timesheet_work.id] = work.id
|
||||
upto2tworks[upto].append(timesheet_work.id)
|
||||
|
||||
durations = defaultdict(datetime.timedelta)
|
||||
query = line.select(
|
||||
line.work, Sum(line.duration),
|
||||
group_by=line.work)
|
||||
for upto, tworks in upto2tworks.items():
|
||||
for sub_ids in grouped_slice(tworks):
|
||||
query.where = (reduce_ids(line.work, sub_ids)
|
||||
& (line.invoice_line == Null))
|
||||
if upto:
|
||||
query.where &= (line.date <= upto)
|
||||
cursor.execute(*query)
|
||||
|
||||
for twork_id, duration in cursor:
|
||||
if duration:
|
||||
# SQLite uses float for SUM
|
||||
if not isinstance(duration, datetime.timedelta):
|
||||
duration = datetime.timedelta(seconds=duration)
|
||||
durations[twork2work[twork_id]] += duration
|
||||
|
||||
quantities = {}
|
||||
for work in works:
|
||||
duration = durations[work.id]
|
||||
if work.invoice_unit_price:
|
||||
hours = duration.total_seconds() / 60 / 60
|
||||
if work.unit_to_invoice:
|
||||
hours = work.unit_to_invoice.round(hours)
|
||||
quantities[work.id] = hours
|
||||
return quantities
|
||||
|
||||
@classmethod
|
||||
def _get_invoiced_amount_timesheet(cls, works):
|
||||
pool = Pool()
|
||||
TimesheetWork = pool.get('timesheet.work')
|
||||
TimesheetLine = pool.get('timesheet.line')
|
||||
InvoiceLine = pool.get('account.invoice.line')
|
||||
Company = pool.get('company.company')
|
||||
Currency = pool.get('currency.currency')
|
||||
|
||||
cursor = Transaction().connection.cursor()
|
||||
table = cls.__table__()
|
||||
timesheet_work = TimesheetWork.__table__()
|
||||
timesheet_line = TimesheetLine.__table__()
|
||||
invoice_line = InvoiceLine.__table__()
|
||||
company = Company.__table__()
|
||||
|
||||
amounts = {}
|
||||
work2currency = {}
|
||||
work_ids = [w.id for w in works]
|
||||
for sub_ids in grouped_slice(work_ids):
|
||||
where = reduce_ids(table.id, sub_ids)
|
||||
cursor.execute(*table.join(timesheet_work,
|
||||
condition=(
|
||||
Concat(cls.__name__ + ',', table.id)
|
||||
== timesheet_work.origin)
|
||||
).join(timesheet_line,
|
||||
condition=timesheet_line.work == timesheet_work.id
|
||||
).join(invoice_line,
|
||||
condition=timesheet_line.invoice_line == invoice_line.id
|
||||
).select(table.id,
|
||||
Sum(timesheet_line.duration * invoice_line.unit_price),
|
||||
where=where,
|
||||
group_by=table.id))
|
||||
amounts.update(cursor)
|
||||
|
||||
cursor.execute(*table.join(company,
|
||||
condition=table.company == company.id
|
||||
).select(table.id, company.currency,
|
||||
where=where))
|
||||
work2currency.update(cursor)
|
||||
|
||||
currencies = Currency.browse(set(work2currency.values()))
|
||||
id2currency = {c.id: c for c in currencies}
|
||||
|
||||
for work in works:
|
||||
currency = id2currency[work2currency[work.id]]
|
||||
amount = amounts.get(work.id, 0)
|
||||
if isinstance(amount, datetime.timedelta):
|
||||
amount = amount.total_seconds()
|
||||
amount = amount / 60 / 60
|
||||
amounts[work.id] = currency.round(Decimal(str(amount)))
|
||||
return amounts
|
||||
|
||||
def get_origins_to_invoice(self):
|
||||
try:
|
||||
origins = super().get_origins_to_invoice()
|
||||
except AttributeError:
|
||||
origins = []
|
||||
if self.invoice_method == 'timesheet':
|
||||
up_to = self.invoice_timesheet_up_to or datetime.date.max
|
||||
origins.extend(
|
||||
l for tw in self.timesheet_works
|
||||
for l in tw.timesheet_lines
|
||||
if not l.invoice_line and l.date <= up_to)
|
||||
return origins
|
||||
|
||||
|
||||
class Work(Effort, Progress, Timesheet, metaclass=PoolMeta):
|
||||
__name__ = 'project.work'
|
||||
project_invoice_method = fields.Selection([
|
||||
('manual', "Manual"),
|
||||
], "Invoice Method",
|
||||
states={
|
||||
'readonly': Bool(Eval('invoiced_amount')),
|
||||
'required': Eval('type') == 'project',
|
||||
'invisible': Eval('type') != 'project',
|
||||
},
|
||||
depends=['invoiced_amount', 'type'])
|
||||
invoice_method = fields.Function(fields.Selection(
|
||||
'get_invoice_methods', "Invoice Method"),
|
||||
'on_change_with_invoice_method')
|
||||
quantity_to_invoice = fields.Function(
|
||||
fields.Float("Quantity to Invoice"), '_get_invoice_values')
|
||||
amount_to_invoice = fields.Function(Monetary(
|
||||
"Amount to Invoice", currency='currency', digits='currency',
|
||||
states={
|
||||
'invisible': Eval('invoice_method') == 'manual',
|
||||
},
|
||||
depends=['invoice_method']),
|
||||
'get_total')
|
||||
invoiced_amount = fields.Function(Monetary(
|
||||
"Invoiced Amount", currency='currency', digits='currency',
|
||||
states={
|
||||
'invisible': Eval('invoice_method') == 'manual',
|
||||
},
|
||||
depends=['invoice_method']),
|
||||
'get_total')
|
||||
invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
|
||||
readonly=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._buttons.update({
|
||||
'invoice': {
|
||||
'invisible': ((Eval('type') != 'project')
|
||||
| (Eval('project_invoice_method', 'manual')
|
||||
== 'manual')),
|
||||
'readonly': ~Eval('amount_to_invoice'),
|
||||
'depends': [
|
||||
'type', 'project_invoice_method', 'amount_to_invoice'],
|
||||
},
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def default_project_invoice_method():
|
||||
return 'manual'
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('invoice_line', None)
|
||||
return super().copy(records, default=default)
|
||||
|
||||
@classmethod
|
||||
def check_modification(cls, mode, works, values=None, external=False):
|
||||
super().check_modification(
|
||||
mode, works, values=values, external=external)
|
||||
if mode == 'write':
|
||||
if ('effort_duration' in values
|
||||
and any(w.invoice_line for w in works)):
|
||||
work = next((w for w in works if w.invoice_line))
|
||||
raise AccessError(gettext(
|
||||
'project_invoice.msg_invoiced_work_modify_effort',
|
||||
work=work.rec_name))
|
||||
elif mode == 'delete':
|
||||
if any(w.invoice_line for w in works):
|
||||
work = next((w for w in works if w.invoice_line))
|
||||
raise AccessError(gettext(
|
||||
'project_invoice.msg_invoiced_work_delete',
|
||||
work=work.rec_name))
|
||||
|
||||
@classmethod
|
||||
def get_invoice_methods(cls):
|
||||
field = 'project_invoice_method'
|
||||
return cls.fields_get(field)[field]['selection']
|
||||
|
||||
@fields.depends('type', 'project_invoice_method',
|
||||
'parent', '_parent_parent.invoice_method')
|
||||
def on_change_with_invoice_method(self, name=None):
|
||||
if self.type == 'project':
|
||||
return self.project_invoice_method
|
||||
elif self.parent:
|
||||
return self.parent.invoice_method
|
||||
else:
|
||||
return 'manual'
|
||||
|
||||
@classmethod
|
||||
def default_quantity_to_invoice(cls):
|
||||
return 0
|
||||
|
||||
@classmethod
|
||||
def _get_quantity_to_invoice_manual(cls, works):
|
||||
return {}
|
||||
|
||||
@classmethod
|
||||
def _get_amount_to_invoice(cls, works):
|
||||
amounts = defaultdict(Decimal)
|
||||
for work in works:
|
||||
amounts[work.id] = work.company.currency.round(
|
||||
(work.invoice_unit_price or 0)
|
||||
* Decimal(str(work.quantity_to_invoice)))
|
||||
return amounts
|
||||
|
||||
@classmethod
|
||||
def default_invoiced_amount(cls):
|
||||
return Decimal(0)
|
||||
|
||||
@classmethod
|
||||
def _get_invoiced_amount_manual(cls, works):
|
||||
return {}
|
||||
|
||||
@classmethod
|
||||
def _get_invoice_values(cls, works, name):
|
||||
default = getattr(cls, 'default_%s' % name)
|
||||
amounts = defaultdict(default)
|
||||
method2works = defaultdict(list)
|
||||
for work in works:
|
||||
method2works[work.invoice_method].append(work)
|
||||
for method, m_works in method2works.items():
|
||||
method = getattr(cls, '_get_%s_%s' % (name, method))
|
||||
# Re-browse for cache alignment
|
||||
amounts.update(method(cls.browse(m_works)))
|
||||
return amounts
|
||||
|
||||
@classmethod
|
||||
def _get_invoiced_amount(cls, works):
|
||||
return cls._get_invoice_values(works, 'invoiced_amount')
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def invoice(cls, works):
|
||||
pool = Pool()
|
||||
Invoice = pool.get('account.invoice')
|
||||
|
||||
invoices = []
|
||||
uninvoiced = works[:]
|
||||
while uninvoiced:
|
||||
work = uninvoiced.pop(0)
|
||||
invoice_lines, uninvoiced_children = (
|
||||
work._get_all_lines_to_invoice())
|
||||
uninvoiced.extend(uninvoiced_children)
|
||||
if not invoice_lines:
|
||||
continue
|
||||
invoice = work._get_invoice()
|
||||
invoice.save()
|
||||
invoices.append(invoice)
|
||||
for key, lines in groupby(invoice_lines,
|
||||
key=work._group_lines_to_invoice_key):
|
||||
lines = list(lines)
|
||||
key = dict(key)
|
||||
invoice_line = work._get_invoice_line(key, invoice, lines)
|
||||
invoice_line.invoice = invoice.id
|
||||
invoice_line.save()
|
||||
origins = defaultdict(list)
|
||||
for line in lines:
|
||||
for origin in line['origins']:
|
||||
origins[origin.__class__].append(origin)
|
||||
for klass, records in origins.items():
|
||||
klass.save(records) # Store first new origins
|
||||
klass.write(records, {
|
||||
'invoice_line': invoice_line.id,
|
||||
})
|
||||
Invoice.update_taxes(invoices)
|
||||
|
||||
def _get_invoice(self):
|
||||
"Return invoice for the work"
|
||||
pool = Pool()
|
||||
Invoice = pool.get('account.invoice')
|
||||
Journal = pool.get('account.journal')
|
||||
|
||||
journals = Journal.search([
|
||||
('type', '=', 'revenue'),
|
||||
], limit=1)
|
||||
if journals:
|
||||
journal, = journals
|
||||
else:
|
||||
journal = None
|
||||
|
||||
if not self.party:
|
||||
raise InvoicingError(
|
||||
gettext('project_invoice.msg_missing_party',
|
||||
work=self.rec_name))
|
||||
|
||||
return Invoice(
|
||||
company=self.company,
|
||||
type='out',
|
||||
journal=journal,
|
||||
party=self.party,
|
||||
invoice_address=self.party.address_get(type='invoice'),
|
||||
currency=self.company.currency,
|
||||
account=self.party.account_receivable_used,
|
||||
payment_term=self.party.customer_payment_term,
|
||||
description=self.name,
|
||||
)
|
||||
|
||||
def _group_lines_to_invoice_key(self, line):
|
||||
"The key to group lines"
|
||||
return (('product', line['product']),
|
||||
('unit', line['unit']),
|
||||
('unit_price', line['unit_price']),
|
||||
('description', line['description'] or ''))
|
||||
|
||||
def _get_invoice_line(self, key, invoice, lines):
|
||||
"Return a invoice line for the lines"
|
||||
pool = Pool()
|
||||
InvoiceLine = pool.get('account.invoice.line')
|
||||
|
||||
quantity = sum(l['quantity'] for l in lines)
|
||||
product = key['product']
|
||||
|
||||
invoice_line = InvoiceLine(invoice=invoice)
|
||||
invoice_line.on_change_invoice()
|
||||
invoice_line.type = 'line'
|
||||
invoice_line.description = key['description']
|
||||
invoice_line.unit_price = key['unit_price']
|
||||
invoice_line.quantity = quantity
|
||||
invoice_line.unit = key['unit']
|
||||
invoice_line.product = product
|
||||
invoice_line.on_change_product()
|
||||
if not getattr(invoice_line, 'account', None):
|
||||
if invoice_line.product:
|
||||
raise InvoicingError(
|
||||
gettext(
|
||||
'project_invoice.msg_product_missing_account_revenue',
|
||||
work=self.rec_name,
|
||||
product=invoice_line.product.rec_name))
|
||||
else:
|
||||
raise InvoicingError(
|
||||
gettext('project_invoice.msg_missing_account_revenue',
|
||||
work=self.rec_name))
|
||||
return invoice_line
|
||||
|
||||
def _test_group_invoice(self):
|
||||
return (self.company, self.party)
|
||||
|
||||
def _get_all_lines_to_invoice(self, test=None):
|
||||
"Return lines for work and children"
|
||||
lines = []
|
||||
if test is None:
|
||||
test = self._test_group_invoice()
|
||||
uninvoiced_children = []
|
||||
lines += self._get_lines_to_invoice()
|
||||
for children in self.children:
|
||||
if children.type == 'project':
|
||||
if test != children._test_group_invoice():
|
||||
uninvoiced_children.append(children)
|
||||
continue
|
||||
child_lines, uninvoiced = children._get_all_lines_to_invoice(
|
||||
test=test)
|
||||
lines.extend(child_lines)
|
||||
uninvoiced_children.extend(uninvoiced)
|
||||
return lines, uninvoiced_children
|
||||
|
||||
def _get_lines_to_invoice(self):
|
||||
if self.quantity_to_invoice:
|
||||
if self.invoice_unit_price is None:
|
||||
raise InvoicingError(
|
||||
gettext('project_invoice.msg_missing_list_price',
|
||||
work=self.rec_name))
|
||||
return [{
|
||||
'product': self.product,
|
||||
'quantity': self.quantity_to_invoice,
|
||||
'unit': self.unit_to_invoice,
|
||||
'unit_price': self.invoice_unit_price,
|
||||
'origins': self.get_origins_to_invoice(),
|
||||
'description': self.name,
|
||||
}]
|
||||
return []
|
||||
|
||||
@property
|
||||
def invoice_unit_price(self):
|
||||
return self.list_price
|
||||
|
||||
@property
|
||||
def unit_to_invoice(self):
|
||||
pool = Pool()
|
||||
ModelData = pool.get('ir.model.data')
|
||||
Uom = pool.get('product.uom')
|
||||
if self.price_list_hour:
|
||||
return Uom(ModelData.get_id('product', 'uom_hour'))
|
||||
elif self.product:
|
||||
return self.product.default_uom
|
||||
|
||||
def get_origins_to_invoice(self):
|
||||
return super().get_origins_to_invoice()
|
||||
|
||||
|
||||
class WorkInvoicedProgress(ModelView, ModelSQL):
|
||||
__name__ = 'project.work.invoiced_progress'
|
||||
work = fields.Many2One('project.work', "Work", ondelete='RESTRICT')
|
||||
progress = fields.Float('Progress', required=True,
|
||||
domain=[
|
||||
('progress', '>=', 0),
|
||||
])
|
||||
invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
|
||||
ondelete='CASCADE')
|
||||
|
||||
|
||||
class OpenInvoice(Wizard):
|
||||
__name__ = 'project.open_invoice'
|
||||
start_state = 'open_'
|
||||
_readonly = True
|
||||
open_ = StateAction('account_invoice.act_invoice_form')
|
||||
|
||||
def do_open_(self, action):
|
||||
works = self.model.search([
|
||||
('parent', 'child_of', list(map(int, self.records))),
|
||||
])
|
||||
invoice_ids = set()
|
||||
for work in works:
|
||||
if work.invoice_line and work.invoice_line.invoice:
|
||||
invoice_ids.add(work.invoice_line.invoice.id)
|
||||
for twork in work.timesheet_works:
|
||||
for timesheet_line in twork.timesheet_lines:
|
||||
if (timesheet_line.invoice_line
|
||||
and timesheet_line.invoice_line.invoice):
|
||||
invoice_ids.add(timesheet_line.invoice_line.invoice.id)
|
||||
if work.invoiced_progress:
|
||||
for progress in work.invoiced_progress:
|
||||
invoice_ids.add(progress.invoice_line.invoice.id)
|
||||
return action, {'res_id': list(invoice_ids)}
|
||||
69
modules/project_invoice/project.xml
Normal file
69
modules/project_invoice/project.xml
Normal file
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="res.group" id="group_project_invoice">
|
||||
<field name="name">Project Invoice</field>
|
||||
</record>
|
||||
<record model="res.user-res.group" id="user_admin_group_project_invoice">
|
||||
<field name="user" ref="res.user_admin"/>
|
||||
<field name="group" ref="group_project_invoice"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="work_view_list">
|
||||
<field name="model">project.work</field>
|
||||
<field name="inherit" ref="project.work_view_list"/>
|
||||
<field name="name">work_list</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="work_view_form">
|
||||
<field name="model">project.work</field>
|
||||
<field name="inherit" ref="project.work_view_form"/>
|
||||
<field name="name">work_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.button" id="work_invoice_button">
|
||||
<field name="model">project.work</field>
|
||||
<field name="name">invoice</field>
|
||||
<field name="string">Invoice</field>
|
||||
</record>
|
||||
<record model="ir.model.button-res.group"
|
||||
id="work_invoice_button_group_project_invoice">
|
||||
<field name="button" ref="work_invoice_button"/>
|
||||
<field name="group" ref="group_project_invoice"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="work_invoiced_progress_view_form">
|
||||
<field name="model">project.work.invoiced_progress</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">work_invoiced_progress_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="work_invoiced_progress_view_list">
|
||||
<field name="model">project.work.invoiced_progress</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">work_invoiced_progress_list</field>
|
||||
</record>
|
||||
<record model="ir.model.access" id="access_work_invoiced_progress">
|
||||
<field name="model">project.work.invoiced_progress</field>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.wizard" id="open_invoice">
|
||||
<field name="name">Invoices</field>
|
||||
<field name="wiz_name">project.open_invoice</field>
|
||||
<field name="model">project.work</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="open_invoice_keyword">
|
||||
<field name="keyword">form_relate</field>
|
||||
<field name="model">project.work,-1</field>
|
||||
<field name="action" ref="open_invoice"/>
|
||||
</record>
|
||||
<record model="ir.action-res.group" id="open_invoice-group_invoice">
|
||||
<field name="action" ref="open_invoice"/>
|
||||
<field name="group" ref="account.group_account"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
2
modules/project_invoice/tests/__init__.py
Normal file
2
modules/project_invoice/tests/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,170 @@
|
||||
===============================
|
||||
Project Invoice Effort Scenario
|
||||
===============================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
|
||||
>>> from trytond.modules.account_invoice.tests.tools import create_payment_term
|
||||
>>> from trytond.modules.company.tests.tools import create_company
|
||||
>>> from trytond.tests.tools import activate_modules
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules('project_invoice', create_company, create_chart)
|
||||
|
||||
Get accounts::
|
||||
|
||||
>>> accounts = get_accounts()
|
||||
>>> revenue = accounts['revenue']
|
||||
|
||||
Create payment term::
|
||||
|
||||
>>> payment_term = create_payment_term()
|
||||
>>> payment_term.save()
|
||||
|
||||
Create customer::
|
||||
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> customer = Party(name='Customer')
|
||||
>>> customer.customer_payment_term = payment_term
|
||||
>>> customer.save()
|
||||
|
||||
Create employee::
|
||||
|
||||
>>> Employee = Model.get('company.employee')
|
||||
>>> employee = Employee()
|
||||
>>> party = Party(name='Employee')
|
||||
>>> party.save()
|
||||
>>> employee.party = party
|
||||
>>> employee.save()
|
||||
|
||||
Create account category::
|
||||
|
||||
>>> ProductCategory = Model.get('product.category')
|
||||
>>> account_category = ProductCategory(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_revenue = revenue
|
||||
>>> account_category.save()
|
||||
|
||||
Create products::
|
||||
|
||||
>>> ProductUom = Model.get('product.uom')
|
||||
>>> hour, = ProductUom.find([('name', '=', 'Hour')])
|
||||
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service'
|
||||
>>> template.default_uom = hour
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('20')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service Fixed'
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('50')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product_fixed, = template.products
|
||||
|
||||
Create a Project::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> project = ProjectWork()
|
||||
>>> project.name = 'Test effort'
|
||||
>>> project.type = 'project'
|
||||
>>> project.party = customer
|
||||
>>> project.project_invoice_method = 'effort'
|
||||
>>> project.product = product
|
||||
>>> project.effort_duration = dt.timedelta(hours=1)
|
||||
>>> task = project.children.new()
|
||||
>>> task.name = 'Task 1'
|
||||
>>> task.type = 'task'
|
||||
>>> task.product = product
|
||||
>>> task.effort_duration = dt.timedelta(hours=5)
|
||||
>>> task_no_effort = project.children.new()
|
||||
>>> task_no_effort.name = "Task 2"
|
||||
>>> task_no_effort.type = 'task'
|
||||
>>> task_no_effort.effort_duration = None
|
||||
>>> task_fixed = project.children.new()
|
||||
>>> task_fixed.name = "Task 2"
|
||||
>>> task_fixed.type = 'task'
|
||||
>>> task_fixed.effort_duration = dt.timedelta(hours=2)
|
||||
>>> task_fixed.product = product_fixed
|
||||
>>> project.save()
|
||||
>>> task, task_no_effort, task_fixed = project.children
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
|
||||
Do 1 task::
|
||||
|
||||
>>> task.progress = 1
|
||||
>>> task.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('100.00')
|
||||
|
||||
Invoice project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('100.00')
|
||||
|
||||
Do project::
|
||||
|
||||
>>> task_no_effort.progress = 1
|
||||
>>> task_no_effort.save()
|
||||
>>> task_fixed.progress = 1
|
||||
>>> task_fixed.save()
|
||||
>>> project.progress = 1
|
||||
>>> project.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('70.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('100.00')
|
||||
|
||||
Invoice again project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('170.00')
|
||||
|
||||
Try to change invoice line quantity::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> task = ProjectWork(task.id)
|
||||
>>> task.invoice_line.quantity = 1
|
||||
>>> task.invoice_line.save()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
InvoiceLineValidationError: ...
|
||||
>>> task.invoice_line.quantity = 5
|
||||
>>> task.invoice_line.save()
|
||||
@@ -0,0 +1,113 @@
|
||||
=========================================
|
||||
Project Invoice Multiple Parties Scenario
|
||||
=========================================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
|
||||
>>> from trytond.modules.company.tests.tools import create_company
|
||||
>>> from trytond.tests.tools import activate_modules
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules('project_invoice', create_company, create_chart)
|
||||
|
||||
Get accounts::
|
||||
|
||||
>>> accounts = get_accounts()
|
||||
>>> revenue = accounts['revenue']
|
||||
|
||||
Create two customers::
|
||||
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> customer1 = Party(name='Customer 1')
|
||||
>>> customer1.save()
|
||||
>>> customer2 = Party(name='Customer 2')
|
||||
>>> customer2.save()
|
||||
|
||||
Create account category::
|
||||
|
||||
>>> ProductCategory = Model.get('product.category')
|
||||
>>> account_category = ProductCategory(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_revenue = revenue
|
||||
>>> account_category.save()
|
||||
|
||||
Create product::
|
||||
|
||||
>>> ProductUom = Model.get('product.uom')
|
||||
>>> hour, = ProductUom.find([('name', '=', 'Hour')])
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service'
|
||||
>>> template.default_uom = hour
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('20')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
|
||||
Create a Project with multiple customers::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> project = ProjectWork()
|
||||
>>> project.name = 'Test multiple party'
|
||||
>>> project.type = 'project'
|
||||
>>> project.party = customer1
|
||||
>>> project.project_invoice_method = 'effort'
|
||||
>>> project.product = product
|
||||
>>> project.effort_duration = dt.timedelta(hours=1)
|
||||
|
||||
>>> subproject = project.children.new()
|
||||
>>> subproject.name = 'Subproject'
|
||||
>>> subproject.type = 'project'
|
||||
>>> subproject.party = customer2
|
||||
>>> subproject.project_invoice_method = 'effort'
|
||||
>>> subproject.product = product
|
||||
>>> subproject.effort_duration = dt.timedelta(hours=5)
|
||||
|
||||
>>> project.save()
|
||||
>>> subproject, = project.children
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
|
||||
Do project and subproject::
|
||||
|
||||
>>> subproject.progress = 1
|
||||
>>> subproject.save()
|
||||
>>> project.progress = 1
|
||||
>>> project.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('120.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
|
||||
Invoice project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('120.00')
|
||||
|
||||
>>> Invoice = Model.get('account.invoice')
|
||||
>>> invoices = Invoice.find([])
|
||||
>>> len(invoices)
|
||||
2
|
||||
>>> sorted([i.party.name for i in invoices])
|
||||
['Customer 1', 'Customer 2']
|
||||
@@ -0,0 +1,173 @@
|
||||
=================================
|
||||
Project Invoice Progress Scenario
|
||||
=================================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
|
||||
>>> from trytond.modules.account_invoice.tests.tools import create_payment_term
|
||||
>>> from trytond.modules.company.tests.tools import create_company
|
||||
>>> from trytond.tests.tools import activate_modules
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules('project_invoice', create_company, create_chart)
|
||||
|
||||
Get accounts::
|
||||
|
||||
>>> accounts = get_accounts()
|
||||
>>> revenue = accounts['revenue']
|
||||
|
||||
Create payment term::
|
||||
|
||||
>>> payment_term = create_payment_term()
|
||||
>>> payment_term.save()
|
||||
|
||||
Create customer::
|
||||
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> customer = Party(name='Customer')
|
||||
>>> customer.customer_payment_term = payment_term
|
||||
>>> customer.save()
|
||||
|
||||
Create employee::
|
||||
|
||||
>>> Employee = Model.get('company.employee')
|
||||
>>> employee = Employee()
|
||||
>>> party = Party(name='Employee')
|
||||
>>> party.save()
|
||||
>>> employee.party = party
|
||||
>>> employee.save()
|
||||
|
||||
Create account category::
|
||||
|
||||
>>> ProductCategory = Model.get('product.category')
|
||||
>>> account_category = ProductCategory(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_revenue = revenue
|
||||
>>> account_category.save()
|
||||
|
||||
Create product::
|
||||
|
||||
>>> ProductUom = Model.get('product.uom')
|
||||
>>> hour, = ProductUom.find([('name', '=', 'Hour')])
|
||||
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
||||
>>> unit.rounding = 0.01
|
||||
>>> unit.digits = 2
|
||||
>>> unit.save()
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service'
|
||||
>>> template.default_uom = hour
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('20')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service Fixed'
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('50')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product_fixed, = template.products
|
||||
|
||||
Create a Project::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> TimesheetWork = Model.get('timesheet.work')
|
||||
>>> project = ProjectWork()
|
||||
>>> project.name = 'Test effort'
|
||||
>>> project.type = 'project'
|
||||
>>> project.party = customer
|
||||
>>> project.project_invoice_method = 'progress'
|
||||
>>> project.product = product
|
||||
>>> project.effort_duration = dt.timedelta(hours=1)
|
||||
>>> task = project.children.new()
|
||||
>>> task.name = 'Task 1'
|
||||
>>> task.type = 'task'
|
||||
>>> task.product = product
|
||||
>>> task.effort_duration = dt.timedelta(hours=5)
|
||||
>>> task_fixed = project.children.new()
|
||||
>>> task_fixed.name = 'Task 2'
|
||||
>>> task_fixed.type = 'task'
|
||||
>>> task_fixed.product = product
|
||||
>>> task_fixed.product = product_fixed
|
||||
>>> project.save()
|
||||
>>> task, task_fixed = project.children
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
|
||||
Do 50% of task::
|
||||
|
||||
>>> task.progress = 0.5
|
||||
>>> task.save()
|
||||
>>> task_fixed.progress = 0.5
|
||||
>>> task_fixed.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('75.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
|
||||
Invoice project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('75.00')
|
||||
|
||||
Do 75% and 90% of tasks and 80% of project::
|
||||
|
||||
>>> task.progress = 0.75
|
||||
>>> task.save()
|
||||
>>> task_fixed.progress = 0.9
|
||||
>>> task_fixed.save()
|
||||
>>> project.progress = 0.80
|
||||
>>> project.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('61.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('75.00')
|
||||
|
||||
Invoice again project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('136.00')
|
||||
|
||||
Try to change invoice line quantity::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> task = ProjectWork(task.id)
|
||||
>>> invoice_line = task.invoiced_progress[0].invoice_line
|
||||
>>> invoice_line.quantity = 2.
|
||||
>>> invoice_line.save()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
InvoiceLineValidationError: ...
|
||||
>>> invoice_line.quantity = 2.5
|
||||
>>> invoice_line.save()
|
||||
@@ -0,0 +1,195 @@
|
||||
==================================
|
||||
Project Invoice Timesheet Scenario
|
||||
==================================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import datetime as dt
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
|
||||
>>> from trytond.modules.account_invoice.tests.tools import create_payment_term
|
||||
>>> from trytond.modules.company.tests.tools import create_company
|
||||
>>> from trytond.tests.tools import activate_modules
|
||||
|
||||
>>> today = dt.date.today()
|
||||
>>> yesterday = today - dt.timedelta(days=1)
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules('project_invoice', create_company, create_chart)
|
||||
|
||||
Get accounts::
|
||||
|
||||
>>> accounts = get_accounts()
|
||||
>>> revenue = accounts['revenue']
|
||||
|
||||
Create payment term::
|
||||
|
||||
>>> payment_term = create_payment_term()
|
||||
>>> payment_term.save()
|
||||
|
||||
Create customer::
|
||||
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> customer = Party(name='Customer')
|
||||
>>> customer.customer_payment_term = payment_term
|
||||
>>> customer.save()
|
||||
|
||||
Create employee::
|
||||
|
||||
>>> Employee = Model.get('company.employee')
|
||||
>>> employee = Employee()
|
||||
>>> party = Party(name='Employee')
|
||||
>>> party.save()
|
||||
>>> employee.party = party
|
||||
>>> employee.save()
|
||||
|
||||
Create account category::
|
||||
|
||||
>>> ProductCategory = Model.get('product.category')
|
||||
>>> account_category = ProductCategory(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_revenue = revenue
|
||||
>>> account_category.save()
|
||||
|
||||
Create product::
|
||||
|
||||
>>> ProductUom = Model.get('product.uom')
|
||||
>>> hour, = ProductUom.find([('name', '=', 'Hour')])
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = 'Service'
|
||||
>>> template.default_uom = hour
|
||||
>>> template.type = 'service'
|
||||
>>> template.list_price = Decimal('20')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
|
||||
Create a Project::
|
||||
|
||||
>>> ProjectWork = Model.get('project.work')
|
||||
>>> project = ProjectWork()
|
||||
>>> project.name = 'Test timesheet'
|
||||
>>> project.type = 'project'
|
||||
>>> project.party = customer
|
||||
>>> project.project_invoice_method = 'timesheet'
|
||||
>>> project.product = product
|
||||
>>> project.timesheet_available = True
|
||||
>>> task = ProjectWork()
|
||||
>>> task.name = 'Task 1'
|
||||
>>> task.timesheet_available = True
|
||||
>>> task.type = 'task'
|
||||
>>> task.product = product
|
||||
>>> project.children.append(task)
|
||||
>>> project.save()
|
||||
>>> task, = project.children
|
||||
|
||||
Add a task without timesheet work::
|
||||
|
||||
>>> task2 = project.children.new()
|
||||
>>> task2.name = 'Task 2'
|
||||
>>> task2.type = 'task'
|
||||
>>> project.save()
|
||||
|
||||
Create timesheets::
|
||||
|
||||
>>> TimesheetLine = Model.get('timesheet.line')
|
||||
>>> line = TimesheetLine()
|
||||
>>> line.date = yesterday
|
||||
>>> line.employee = employee
|
||||
>>> line.duration = dt.timedelta(hours=3)
|
||||
>>> line.work, = task.timesheet_works
|
||||
>>> line.save()
|
||||
>>> line = TimesheetLine()
|
||||
>>> line.date = today
|
||||
>>> line.employee = employee
|
||||
>>> line.duration = dt.timedelta(hours=2)
|
||||
>>> line.work, = project.timesheet_works
|
||||
>>> line.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('100.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('0.00')
|
||||
|
||||
Invoice project up to yesterday::
|
||||
|
||||
>>> project.project_invoice_timesheet_up_to = yesterday
|
||||
>>> project.save()
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('60.00')
|
||||
|
||||
>>> project.project_invoice_timesheet_up_to = today
|
||||
>>> project.save()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('40.00')
|
||||
|
||||
>>> Invoice = Model.get('account.invoice')
|
||||
>>> invoice, = Invoice.find([])
|
||||
>>> invoice.total_amount
|
||||
Decimal('60.00')
|
||||
|
||||
Invoice all project::
|
||||
|
||||
>>> project.project_invoice_timesheet_up_to = None
|
||||
>>> project.save()
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('100.00')
|
||||
|
||||
>>> _, invoice = Invoice.find([], order=[('id', 'ASC')])
|
||||
>>> invoice.total_amount
|
||||
Decimal('40.00')
|
||||
|
||||
Create more timesheets::
|
||||
|
||||
>>> TimesheetLine = Model.get('timesheet.line')
|
||||
>>> line = TimesheetLine()
|
||||
>>> line.employee = employee
|
||||
>>> line.duration = dt.timedelta(hours=4)
|
||||
>>> line.work, = task.timesheet_works
|
||||
>>> line.save()
|
||||
|
||||
Check project amounts::
|
||||
|
||||
>>> project.reload()
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('80.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('100.00')
|
||||
|
||||
Invoice again project::
|
||||
|
||||
>>> project.click('invoice')
|
||||
>>> project.amount_to_invoice
|
||||
Decimal('0.00')
|
||||
>>> project.invoiced_amount
|
||||
Decimal('180.00')
|
||||
|
||||
>>> _, _, invoice = Invoice.find([], order=[('id', 'ASC')])
|
||||
>>> invoice.total_amount
|
||||
Decimal('80.00')
|
||||
|
||||
Try to change invoice line quantity::
|
||||
|
||||
>>> TimesheetLine = Model.get('timesheet.line')
|
||||
>>> line = TimesheetLine(line.id)
|
||||
>>> line.invoice_line.quantity = 5
|
||||
>>> line.invoice_line.save()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
InvoiceLineValidationError: ...
|
||||
>>> line.invoice_line.quantity = 4
|
||||
>>> line.invoice_line.save()
|
||||
12
modules/project_invoice/tests/test_module.py
Normal file
12
modules/project_invoice/tests/test_module.py
Normal file
@@ -0,0 +1,12 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.tests.test_tryton import ModuleTestCase
|
||||
|
||||
|
||||
class ProjectInvoiceTestCase(ModuleTestCase):
|
||||
'Test Project Invoice module'
|
||||
module = 'project_invoice'
|
||||
|
||||
|
||||
del ModuleTestCase
|
||||
8
modules/project_invoice/tests/test_scenario.py
Normal file
8
modules/project_invoice/tests/test_scenario.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.tests.test_tryton import load_doc_tests
|
||||
|
||||
|
||||
def load_tests(*args, **kwargs):
|
||||
return load_doc_tests(__name__, __file__, *args, **kwargs)
|
||||
43
modules/project_invoice/timesheet.py
Normal file
43
modules/project_invoice/timesheet.py
Normal file
@@ -0,0 +1,43 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import fields
|
||||
from trytond.model.exceptions import AccessError
|
||||
from trytond.pool import PoolMeta
|
||||
|
||||
|
||||
class Line(metaclass=PoolMeta):
|
||||
__name__ = 'timesheet.line'
|
||||
invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
|
||||
readonly=True)
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('invoice_line', None)
|
||||
return super().copy(records, default=default)
|
||||
|
||||
@classmethod
|
||||
def check_modification(cls, mode, lines, values=None, external=False):
|
||||
super().check_modification(
|
||||
mode, lines, values=values, external=external)
|
||||
if mode == 'write':
|
||||
if (values.keys() & {'duration', 'work'}
|
||||
and any(l.invoice_line for l in lines)):
|
||||
line = next(l for l in lines if l.invoice_line)
|
||||
if 'duration' in values:
|
||||
msg = 'msg_invoiced_timesheet_line_modify_duration'
|
||||
else:
|
||||
msg = 'msg_invoiced_timesheet_line_modify_work'
|
||||
raise AccessError(gettext(
|
||||
f'project_invoice.{msg}',
|
||||
line=line.rec_name))
|
||||
elif mode == 'delete':
|
||||
if any(r.invoice_line for r in lines):
|
||||
line = next((l for l in lines if l.invoice_line))
|
||||
raise AccessError(gettext(
|
||||
'project_invoice.msg_invoiced_timesheet_line_delete',
|
||||
line=line.rec_name))
|
||||
30
modules/project_invoice/timesheet.xml
Normal file
30
modules/project_invoice/timesheet.xml
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="timesheet_line_view_form">
|
||||
<field name="model">timesheet.line</field>
|
||||
<field name="inherit" ref="timesheet.line_view_form"/>
|
||||
<field name="name">timesheet_line_form</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_timesheet_line_form_invoice">
|
||||
<field name="name">Timesheet Lines</field>
|
||||
<field name="res_model">timesheet.line</field>
|
||||
<field name="domain"
|
||||
eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('invoice_line.invoice', '=', Eval('active_id')), ('invoice_line.invoice', 'in', Eval('active_ids')))]"
|
||||
pyson="1"/>
|
||||
</record>
|
||||
<record model="ir.action.keyword"
|
||||
id="act_timesheet_line_form_invoice_keyword1">
|
||||
<field name="keyword">form_relate</field>
|
||||
<field name="model">account.invoice,-1</field>
|
||||
<field name="action" ref="act_timesheet_line_form_invoice"/>
|
||||
</record>
|
||||
<record model="ir.action-res.group"
|
||||
id="act_timesheet_line_form_invoice-group_timesheet_admin">
|
||||
<field name="action" ref="act_timesheet_line_form_invoice"/>
|
||||
<field name="group" ref="timesheet.group_timesheet_admin"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
25
modules/project_invoice/tryton.cfg
Normal file
25
modules/project_invoice/tryton.cfg
Normal file
@@ -0,0 +1,25 @@
|
||||
[tryton]
|
||||
version=7.8.0
|
||||
depends:
|
||||
currency
|
||||
ir
|
||||
project
|
||||
project_revenue
|
||||
timesheet
|
||||
account
|
||||
account_invoice
|
||||
account_product
|
||||
product
|
||||
xml:
|
||||
project.xml
|
||||
timesheet.xml
|
||||
message.xml
|
||||
|
||||
[register]
|
||||
model:
|
||||
project.Work
|
||||
project.WorkInvoicedProgress
|
||||
timesheet.Line
|
||||
invoice.InvoiceLine
|
||||
wizard:
|
||||
project.OpenInvoice
|
||||
10
modules/project_invoice/view/timesheet_line_form.xml
Normal file
10
modules/project_invoice/view/timesheet_line_form.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//field[@name='description']" position="after">
|
||||
<label name="invoice_line"/>
|
||||
<field name="invoice_line"/>
|
||||
<newline/>
|
||||
</xpath>
|
||||
</data>
|
||||
32
modules/project_invoice/view/work_form.xml
Normal file
32
modules/project_invoice/view/work_form.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath
|
||||
expr="/form/notebook/page[@id='general']/group[@id='progress']"
|
||||
position="after">
|
||||
<label name="project_invoice_method"/>
|
||||
<field name="project_invoice_method"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='list_price']" position="after">
|
||||
<label name="project_invoice_timesheet_up_to"/>
|
||||
<field name="project_invoice_timesheet_up_to"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='general']/field[@name='total_effort']" position="after">
|
||||
<label name="amount_to_invoice"/>
|
||||
<field name="amount_to_invoice"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='general']/field[@name='revenue']" position="after">
|
||||
<label name="invoiced_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='general']/group/group[@id='buttons']"
|
||||
position="inside">
|
||||
<button name="invoice"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook" position="inside">
|
||||
<page name="invoiced_progress">
|
||||
<field name="invoiced_progress" colspan="4"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</data>
|
||||
15
modules/project_invoice/view/work_invoiced_progress_form.xml
Normal file
15
modules/project_invoice/view/work_invoiced_progress_form.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="work"/>
|
||||
<field name="work"/>
|
||||
<newline/>
|
||||
<label name="progress"/>
|
||||
<group col="2" id="progress">
|
||||
<field name="progress" factor="100" xexpand="0"/>
|
||||
<label name="progress" string="%" xalign="0.0" xexpand="1"/>
|
||||
</group>
|
||||
<label name="invoice_line"/>
|
||||
<field name="invoice_line"/>
|
||||
</form>
|
||||
10
modules/project_invoice/view/work_invoiced_progress_list.xml
Normal file
10
modules/project_invoice/view/work_invoiced_progress_list.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="work" expand="2"/>
|
||||
<field name="progress" factor="100">
|
||||
<suffix string="%" name="progress"/>
|
||||
</field>
|
||||
<field name="invoice_line" expand="1"/>
|
||||
</tree>
|
||||
10
modules/project_invoice/view/work_list.xml
Normal file
10
modules/project_invoice/view/work_list.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath
|
||||
expr="/tree/field[@name='type']"
|
||||
position="after">
|
||||
<field name="invoice_method"/>
|
||||
</xpath>
|
||||
</data>
|
||||
Reference in New Issue
Block a user