first commit

This commit is contained in:
root
2026-03-14 09:42:12 +00:00
commit 0adbd20c2c
10991 changed files with 1646955 additions and 0 deletions

View 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.

View 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

View 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)

View 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 ""

View 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 "%"

View 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 ""

View 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 "%"

View 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 "%"

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 "%"

View 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 ""

View 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 "%"

View 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 "%"

View 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 ""

View 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 ""

View 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 "%"

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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>

View 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)}

View 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>

View 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.

View File

@@ -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()

View File

@@ -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']

View File

@@ -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()

View File

@@ -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()

View 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

View 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)

View 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))

View 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>

View 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

View 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>

View 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>

View 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>

View 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>

View 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>