[tryton-debian-vcs] tryton-modules-project-invoice branch debian updated. debian/3.6.1-1-2-ge7f50b1

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Wed Nov 11 11:26:26 UTC 2015


The following commit has been merged in the debian branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-project-invoice.git;a=commitdiff;h=debian/3.6.1-1-2-ge7f50b1

commit e7f50b157ce8c8ed009968d8192ed4885f633b7b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Nov 11 12:11:14 2015 +0100

    Merging upstream version 3.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 61b8263..3f5cb01 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
-Version 3.6.1 - 2015-07-13
+Version 3.8.0 - 2015-11-02
 * Bug fixes (see mercurial logs for details)
+* Add progress invoice method
 
 Version 3.6.0 - 2015-04-20
 * Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index e070cc5..7977984 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_project_invoice
-Version: 3.6.1
+Version: 3.8.0
 Summary: Tryton module to invoice projects
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.6/
+Download-URL: http://downloads.tryton.org/3.8/
 Description: trytond_project_invoice
         =======================
         
@@ -60,6 +60,9 @@ Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Hungarian
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Portuguese (Brazilian)
 Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
diff --git a/__init__.py b/__init__.py
index 67b38a4..267e299 100644
--- a/__init__.py
+++ b/__init__.py
@@ -4,12 +4,15 @@
 from trytond.pool import Pool
 from .work import *
 from .timesheet import *
+from .invoice import *
 
 
 def register():
     Pool.register(
         Work,
+        WorkInvoicedProgress,
         TimesheetLine,
+        InvoiceLine,
         module='project_invoice', type_='model')
     Pool.register(
         OpenInvoice,
diff --git a/doc/index.rst b/doc/index.rst
index 46bc9c5..ea65210 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -7,5 +7,7 @@ The methods are:
 - Manual: Tryton doesn't create any invoice.
 - On Effort: The invoices are created based on the *Effort* hours for all
   children works in state *Done*.
+- On Progress: The invoices are create proportionally to the *Progress* of the
+  *Effort* hours of each children work.
 - On Timesheet: The invoices are created based on the timesheets encoded on all
   children works.
diff --git a/invoice.py b/invoice.py
new file mode 100644
index 0000000..19986c8
--- /dev/null
+++ b/invoice.py
@@ -0,0 +1,29 @@
+# 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.pool import PoolMeta, Pool
+from trytond.transaction import Transaction
+from trytond.tools import grouped_slice
+
+__all__ = ['InvoiceLine']
+
+
+class InvoiceLine:
+    __metaclass__ = PoolMeta
+    __name__ = 'account.invoice.line'
+
+    @classmethod
+    def delete(cls, lines):
+        pool = Pool()
+        WorkInvoicedProgress = pool.get('project.work.invoiced_progress')
+
+        # Delete progress using root to skip access rule
+        progress = []
+        for sub_ids in grouped_slice([l.id for l in lines]):
+            progress += WorkInvoicedProgress.search([
+                    ('invoice_line', 'in', sub_ids),
+                    ])
+        if progress:
+            with Transaction().set_user(0):
+                WorkInvoicedProgress.delete(progress)
+
+        super(InvoiceLine, cls).delete(lines)
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..5f320d4
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,159 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:project.work:"
+msgid "There is no list price on work \"%s\"."
+msgstr ""
+
+msgctxt "error:project.work:"
+msgid "There is no party on work \"%s\"."
+msgstr ""
+
+msgctxt "error:project.work:"
+msgid "There is no product on work \"%s\"."
+msgstr ""
+
+msgctxt "error:timesheet.line:"
+msgid "You can not delete invoiced line."
+msgstr ""
+
+msgctxt "error:timesheet.line:"
+msgid "You can not modify invoiced line."
+msgstr ""
+
+msgctxt "field:project.work,duration_to_invoice:"
+msgid "Duration to Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_duration:"
+msgid "Invoiced Duration"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+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 "Фактури"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:project.work,invoice_method:"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+#, 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 "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Invoice"
+msgstr ""
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index a098c75..9b2bf65 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Temps 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.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Data creació"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Usuari creació"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Temps"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Treball"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Data modificació"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Usuari modificació"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línia de factura"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Factures"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progrés de treballs facturats"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturació de projectes"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Per l'esforç estimat"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Segons el progrés"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Per les hores realitzades"
 
@@ -83,9 +131,21 @@ 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 "Work Invoiced Progress"
+msgstr "Progrés del treball facturat"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progressos del treball facturat"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Factura"
diff --git a/locale/es_CO.po b/locale/cs_CZ.po
similarity index 52%
copy from locale/es_CO.po
copy to locale/cs_CZ.po
index 54959c2..846a933 100644
--- a/locale/es_CO.po
+++ b/locale/cs_CZ.po
@@ -4,88 +4,148 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay lista de precios en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay tercero en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hay producto en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No puede eliminar líneas facturadas."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No puede modificar una línea facurada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Duración de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Lineas de Registro de Tiempo"
+msgstr ""
 
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Facturas"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturación de Proyecto"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 4283736..a6d7d44 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -12,7 +12,7 @@ msgstr "Fehlende Partei für Aufgabe \"%s\"."
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "Fehlender Artikel für Aufgabe \"%s\"."
+msgstr "Fehlende Variante für Aufgabe \"%s\"."
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
@@ -24,7 +24,7 @@ msgstr "Eine abgerechnete Zeile kann nicht geändert werden."
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Fakturierbarer Zeitraum"
+msgstr "Fakturierbare Zeit"
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
@@ -40,12 +40,52 @@ msgstr "Abgerechneter Betrag"
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
-msgstr "Fakturierter Zeitraum"
+msgstr "Fakturierte Zeit"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Fakturierter Forstschritt"
 
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
 msgstr "Methode Rechnungsstellung"
 
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Zeitaufwand"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Tätigkeit"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Rechnungsposition"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Rechnungsausgang"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Nach Forstschritt fakturierte Aufgabe"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Projekt Fakturierung"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Nach veranschlagtem Aufwand"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Nach Fortschritt"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Nach erfasstem Aufwand"
 
@@ -83,9 +131,21 @@ 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 "Work Invoiced Progress"
+msgstr "Nach Forstschritt fakturierte Aufgabe"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Nach Forstschritt fakturierte Aufgaben"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Rechnung erstellen"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index ada2fb7..98ab661 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Duración facturada"
 
+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.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Esfuerzo"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Actividad"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de factura"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Facturas"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso facturado de actividad"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturación de proyectos"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Por el esfuerzo estimado"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Según progreso"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Por las horas realizadas"
 
@@ -83,9 +131,21 @@ msgid "On Effort"
 msgstr "Por el esfuerzo estimado"
 
 msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Según progreso"
+
+msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
 msgstr "Por las horas realizadas"
 
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso facturado de actividad"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progresos facturados de actividad"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Factura"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 54959c2..b13dc79 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de Facturación"
 
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de Factura"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Facturas"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturación de Proyecto"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Por Esfuerzo"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Por Registro de Tiempo"
 
@@ -83,9 +131,21 @@ msgid "On Effort"
 msgstr "Por Esfuerzo"
 
 msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
 msgstr "Por Registro de Tiempo"
 
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Factura"
diff --git a/locale/es_EC.po b/locale/es_EC.po
index 045b42f..98c3108 100644
--- a/locale/es_EC.po
+++ b/locale/es_EC.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay ninguna lista de precios en el trabajo \"%s\"."
+msgstr "No hay ningún precio en el trabajo \"%s\"."
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
@@ -32,23 +32,63 @@ msgstr "Línea de factura"
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr "Método de facturación"
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr "Importe facturado"
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
-msgstr "Duración Facturada"
+msgstr "Duración facturada"
+
+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"
+msgstr "Método de facturación"
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Fecha de creación"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Creado por usuario"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Esfuerzo"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Trabajo"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Fecha de modificación"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Modificado por usuario"
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr "Línea de factura"
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Facturas"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso facturado de trabajo"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturación de Proyectos"
@@ -68,11 +112,15 @@ msgstr "Manual"
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo Estimado"
+msgstr "Por el esfuerzo estimado"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Según el progreso"
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Trabajo Realizado"
+msgstr "Por las horas realizadas"
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
@@ -80,11 +128,23 @@ msgstr "Manual"
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo Estimado"
+msgstr "Por 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 Trabajo Realizado"
+msgstr "Por las horas realizadas"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso facturado de trabajo"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progresos facturados de trabajo"
 
 msgctxt "view:project.work:"
 msgid "Invoice"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index a38f78d..0d26893 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Tiempo 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.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Tiempo"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Trabajo"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de factura"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Facturas"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso de trabajos facturados"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturación de proyectos"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Por el esfuerzo estimado"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Según el progreso"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Por las horas realizadas"
 
@@ -83,9 +131,21 @@ 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 "Work Invoiced Progress"
+msgstr "Progreso del trabajo facturado"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progresos del trabajo facturado"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Factura"
diff --git a/locale/es_ES.po b/locale/es_MX.po
similarity index 62%
copy from locale/es_ES.po
copy to locale/es_MX.po
index a38f78d..95c828b 100644
--- a/locale/es_ES.po
+++ b/locale/es_MX.po
@@ -8,7 +8,7 @@ msgstr "No hay ningún precio en el trabajo \"%s\"."
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay ningún tercero en el trabajo \"%s\"."
+msgstr "No hay ningún entidad en el trabajo \"%s\"."
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Tiempo facturado"
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de facturación"
 
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de factura"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Facturas"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facturación de proyectos"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Por el esfuerzo estimado"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Por las horas realizadas"
 
@@ -83,9 +131,21 @@ msgid "On Effort"
 msgstr "Por el esfuerzo estimado"
 
 msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
 msgstr "Por las horas realizadas"
 
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
+
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index f84995f..33905db 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Durée facturée"
 
+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.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Effort"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Travail"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Ligne de facture"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Factures"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progression facturée de travail"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Facture projet"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Sur l'effort"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Sur progrès"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Sur feuille de présence"
 
@@ -83,9 +131,21 @@ 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 feuille de présence"
 
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr "Progression facturée de travail"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progressions facturées de travail"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Facture"
diff --git a/locale/es_CO.po b/locale/hu_HU.po
similarity index 52%
copy from locale/es_CO.po
copy to locale/hu_HU.po
index 54959c2..846a933 100644
--- a/locale/es_CO.po
+++ b/locale/hu_HU.po
@@ -4,88 +4,148 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay lista de precios en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay tercero en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hay producto en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No puede eliminar líneas facturadas."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No puede modificar una línea facurada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Duración de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Lineas de Registro de Tiempo"
+msgstr ""
 
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Facturas"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturación de Proyecto"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/es_CO.po b/locale/it_IT.po
similarity index 52%
copy from locale/es_CO.po
copy to locale/it_IT.po
index 54959c2..846a933 100644
--- a/locale/es_CO.po
+++ b/locale/it_IT.po
@@ -4,88 +4,148 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay lista de precios en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay tercero en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hay producto en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No puede eliminar líneas facturadas."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No puede modificar una línea facurada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Duración de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Lineas de Registro de Tiempo"
+msgstr ""
 
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Facturas"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturación de Proyecto"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/es_CO.po b/locale/ja_JP.po
similarity index 52%
copy from locale/es_CO.po
copy to locale/ja_JP.po
index 54959c2..846a933 100644
--- a/locale/es_CO.po
+++ b/locale/ja_JP.po
@@ -4,88 +4,148 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay lista de precios en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay tercero en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hay producto en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No puede eliminar líneas facturadas."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No puede modificar una línea facurada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Duración de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Lineas de Registro de Tiempo"
+msgstr ""
 
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Facturas"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturación de Proyecto"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/es_CO.po b/locale/lt_LT.po
similarity index 52%
copy from locale/es_CO.po
copy to locale/lt_LT.po
index 54959c2..846a933 100644
--- a/locale/es_CO.po
+++ b/locale/lt_LT.po
@@ -4,88 +4,148 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hay lista de precios en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hay tercero en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hay producto en la tarea \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No puede eliminar líneas facturadas."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No puede modificar una línea facurada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Duración de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Valor Facturado"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
 
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Lineas de Registro de Tiempo"
+msgstr ""
 
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Facturas"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturación de Proyecto"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Por Esfuerzo"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Por Registro de Tiempo"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/ca_ES.po b/locale/nl_NL.po
similarity index 50%
copy from locale/ca_ES.po
copy to locale/nl_NL.po
index a098c75..05db6aa 100644
--- a/locale/ca_ES.po
+++ b/locale/nl_NL.po
@@ -4,88 +4,156 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "No hi ha cap preu al treball \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "No hi ha cap tercer al treball \"%s\"."
+msgstr ""
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "No hi ha cap producte al treball \"%s\"."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
-msgstr "No podeu eliminar una línia facturada."
+msgstr ""
 
 msgctxt "error:timesheet.line:"
 msgid "You can not modify invoiced line."
-msgstr "No podeu modificar una línia facturada."
+msgstr ""
 
 msgctxt "field:project.work,duration_to_invoice:"
 msgid "Duration to Invoice"
-msgstr "Temps a facturar"
+msgstr ""
 
+#, fuzzy
 msgctxt "field:project.work,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línia de factura"
+msgstr "Factuurregel"
 
+#, fuzzy
 msgctxt "field:project.work,invoice_method:"
 msgid "Invoice Method"
-msgstr "Mètode de facturació"
+msgstr "Factuur afhandeling"
 
 msgctxt "field:project.work,invoiced_amount:"
 msgid "Invoiced Amount"
-msgstr "Import facturat"
+msgstr ""
 
 msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
-msgstr "Temps facturat"
+msgstr ""
 
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+#, fuzzy
 msgctxt "field:project.work,project_invoice_method:"
 msgid "Invoice Method"
-msgstr "Mètode de facturació"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
 
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
+
+#, fuzzy
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línia de factura"
+msgstr "Factuurregel"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
 msgid "Timesheet Lines"
-msgstr "Línies del full de treball"
+msgstr "Tijdregistratieregels"
 
+#, fuzzy
 msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
-msgstr "Factures"
+msgstr "Verkoopfacturen"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
 
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
-msgstr "Facturació de projectes"
+msgstr ""
 
+#, fuzzy
 msgctxt "selection:project.work,invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr "Handmatig"
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Effort"
-msgstr "Per l'esforç estimat"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
-msgstr "Per les hores realitzades"
+msgstr ""
 
+#, fuzzy
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "Manual"
-msgstr "Manual"
+msgstr "Handmatig"
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Effort"
-msgstr "Per l'esforç estimat"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
 
 msgctxt "selection:project.work,project_invoice_method:"
 msgid "On Timesheet"
-msgstr "Per les hores realitzades"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
 
 msgctxt "view:project.work:"
 msgid "Invoice"
-msgstr "Factura"
+msgstr ""
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
new file mode 100644
index 0000000..d72a593
--- /dev/null
+++ b/locale/pt_BR.po
@@ -0,0 +1,151 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:project.work:"
+msgid "There is no list price on work \"%s\"."
+msgstr "Não há preço para a tarefa \"%s\"."
+
+msgctxt "error:project.work:"
+msgid "There is no party on work \"%s\"."
+msgstr "Não há pessoa na tarefa \"%s\"."
+
+msgctxt "error:project.work:"
+msgid "There is no product on work \"%s\"."
+msgstr "Não há produto na tarefa \"%s\"."
+
+msgctxt "error:timesheet.line:"
+msgid "You can not delete invoiced line."
+msgstr "Você não pode apagar uma linha já faturada."
+
+msgctxt "error:timesheet.line:"
+msgid "You can not modify invoiced line."
+msgstr "Você não pode modificar uma linha já faturada."
+
+msgctxt "field:project.work,duration_to_invoice:"
+msgid "Duration 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"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Montante de Fatura"
+
+msgctxt "field:project.work,invoiced_duration:"
+msgid "Invoiced Duration"
+msgstr "Tempo Faturado"
+
+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"
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Data de criação"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Criado por"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Esforço"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha de Fatura"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Tarefa"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Data de edição"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Editado por"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha de Fatura"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Linhas de Horário de Trabalho"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Faturas"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progresso Faturado de Tarefas"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Faturar Projeto"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Effort"
+msgstr "Por esforço estimado"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Em Progesso"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Timesheet"
+msgstr "Pelas Horas Utilizadas"
+
+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 "Sobre o Horário de Trabalho"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progress"
+msgstr "Progresso Faturado do Trabalho"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Progresso Faturado do Trabalho"
+
+msgctxt "view:project.work:"
+msgid "Invoice"
+msgstr "Fatura"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..72a7716
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,159 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:project.work:"
+msgid "There is no list price on work \"%s\"."
+msgstr ""
+
+msgctxt "error:project.work:"
+msgid "There is no party on work \"%s\"."
+msgstr ""
+
+msgctxt "error:project.work:"
+msgid "There is no product on work \"%s\"."
+msgstr ""
+
+msgctxt "error:timesheet.line:"
+msgid "You can not delete invoiced line."
+msgstr ""
+
+msgctxt "error:timesheet.line:"
+msgid "You can not modify invoiced line."
+msgstr ""
+
+msgctxt "field:project.work,duration_to_invoice:"
+msgid "Duration to Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Строка инвойса"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_duration:"
+msgid "Invoiced Duration"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+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 "Инвойсы"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:project.work,invoice_method:"
+msgid "Manual"
+msgstr "Ручной"
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+#, 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 "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Invoice"
+msgstr ""
diff --git a/locale/sl_SI.po b/locale/sl_SI.po
index ffb5092..7eee1bd 100644
--- a/locale/sl_SI.po
+++ b/locale/sl_SI.po
@@ -4,15 +4,15 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:project.work:"
 msgid "There is no list price on work \"%s\"."
-msgstr "Pri dejavnosti \"%s\" ni cenika."
+msgstr "Pri nalogi \"%s\" ni cenika."
 
 msgctxt "error:project.work:"
 msgid "There is no party on work \"%s\"."
-msgstr "Pri dejavnosti \"%s\" ni partnerja."
+msgstr "Pri nalogi \"%s\" ni partnerja."
 
 msgctxt "error:project.work:"
 msgid "There is no product on work \"%s\"."
-msgstr "Pri dejavnosti \"%s\" ni izdelka."
+msgstr "Pri nalogi \"%s\" ni izdelka."
 
 msgctxt "error:timesheet.line:"
 msgid "You can not delete invoiced line."
@@ -42,10 +42,50 @@ msgctxt "field:project.work,invoiced_duration:"
 msgid "Invoiced Duration"
 msgstr "Zaračunan porabljen čas"
 
+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"
 
+msgctxt "field:project.work.invoiced_progress,create_date:"
+msgid "Create Date"
+msgstr "Izdelano"
+
+msgctxt "field:project.work.invoiced_progress,create_uid:"
+msgid "Create User"
+msgstr "Izdelal"
+
+msgctxt "field:project.work.invoiced_progress,effort_duration:"
+msgid "Effort"
+msgstr "Porabljen čas"
+
+msgctxt "field:project.work.invoiced_progress,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Postavka računa"
+
+msgctxt "field:project.work.invoiced_progress,rec_name:"
+msgid "Name"
+msgstr "Ime"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Naloga"
+
+msgctxt "field:project.work.invoiced_progress,write_date:"
+msgid "Write Date"
+msgstr "Zapisano"
+
+msgctxt "field:project.work.invoiced_progress,write_uid:"
+msgid "Write User"
+msgstr "Zapisal"
+
 msgctxt "field:timesheet.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Postavka računa"
@@ -58,6 +98,10 @@ msgctxt "model:ir.action,name:open_invoice"
 msgid "Invoices"
 msgstr "Računi"
 
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Zaračunano opravljeno delo"
+
 msgctxt "model:res.group,name:group_project_invoice"
 msgid "Project Invoice"
 msgstr "Projekt - obračun"
@@ -71,6 +115,10 @@ msgid "On Effort"
 msgstr "Po oceni dela"
 
 msgctxt "selection:project.work,invoice_method:"
+msgid "On Progress"
+msgstr "Po napredku"
+
+msgctxt "selection:project.work,invoice_method:"
 msgid "On Timesheet"
 msgstr "Po dejanskem delu"
 
@@ -83,9 +131,21 @@ 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 "Work Invoiced Progress"
+msgstr "Zaračunano opravljeno delo"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "Work Invoiced Progresses"
+msgstr "Zaračunana opravljena dela"
+
 msgctxt "view:project.work:"
 msgid "Invoice"
 msgstr "Račun"
diff --git a/setup.py b/setup.py
index bcd7b2b..f0e34c0 100644
--- a/setup.py
+++ b/setup.py
@@ -87,6 +87,9 @@ setup(name=name,
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
+        'Natural Language :: Hungarian',
+        'Natural Language :: Italian',
+        'Natural Language :: Portuguese (Brazilian)',
         'Natural Language :: Russian',
         'Natural Language :: Slovenian',
         'Natural Language :: Spanish',
diff --git a/tests/scenario_project_invoice_effort.rst b/tests/scenario_project_invoice_effort.rst
index 46ccbcf..4dd1d22 100644
--- a/tests/scenario_project_invoice_effort.rst
+++ b/tests/scenario_project_invoice_effort.rst
@@ -23,12 +23,12 @@ Create database::
 
 Install project_invoice::
 
-    >>> Module = Model.get('ir.module.module')
+    >>> Module = Model.get('ir.module')
     >>> module, = Module.find([
     ...         ('name', '=', 'project_invoice'),
     ...     ])
     >>> module.click('install')
-    >>> Wizard('ir.module.module.install_upgrade').execute('upgrade')
+    >>> Wizard('ir.module.install_upgrade').execute('upgrade')
 
 Create company::
 
@@ -116,6 +116,7 @@ Create a Project::
     >>> ProjectWork = Model.get('project.work')
     >>> TimesheetWork = Model.get('timesheet.work')
     >>> project = ProjectWork()
+    >>> project.name = 'Test effort'
     >>> work = TimesheetWork()
     >>> work.name = 'Test effort'
     >>> work.save()
@@ -126,6 +127,7 @@ Create a Project::
     >>> project.product = product
     >>> project.effort_duration = datetime.timedelta(hours=1)
     >>> task = ProjectWork()
+    >>> task.name = 'Task 1'
     >>> work = TimesheetWork()
     >>> work.name = 'Task 1'
     >>> work.save()
diff --git a/tests/scenario_project_invoice_effort.rst b/tests/scenario_project_invoice_progress.rst
similarity index 87%
copy from tests/scenario_project_invoice_effort.rst
copy to tests/scenario_project_invoice_progress.rst
index 46ccbcf..30c1c92 100644
--- a/tests/scenario_project_invoice_effort.rst
+++ b/tests/scenario_project_invoice_progress.rst
@@ -1,6 +1,6 @@
-===============================
-Project Invoice Effort Scenario
-===============================
+=================================
+Project Invoice Progress Scenario
+=================================
 
 Imports::
 
@@ -23,12 +23,12 @@ Create database::
 
 Install project_invoice::
 
-    >>> Module = Model.get('ir.module.module')
+    >>> Module = Model.get('ir.module')
     >>> module, = Module.find([
     ...         ('name', '=', 'project_invoice'),
     ...     ])
     >>> module.click('install')
-    >>> Wizard('ir.module.module.install_upgrade').execute('upgrade')
+    >>> Wizard('ir.module.install_upgrade').execute('upgrade')
 
 Create company::
 
@@ -116,16 +116,18 @@ Create a Project::
     >>> ProjectWork = Model.get('project.work')
     >>> TimesheetWork = Model.get('timesheet.work')
     >>> project = ProjectWork()
+    >>> project.name = 'Test effort'
     >>> work = TimesheetWork()
     >>> work.name = 'Test effort'
     >>> work.save()
     >>> project.work = work
     >>> project.type = 'project'
     >>> project.party = customer
-    >>> project.project_invoice_method = 'effort'
+    >>> project.project_invoice_method = 'progress'
     >>> project.product = product
     >>> project.effort_duration = datetime.timedelta(hours=1)
     >>> task = ProjectWork()
+    >>> task.name = 'Task 1'
     >>> work = TimesheetWork()
     >>> work.name = 'Task 1'
     >>> work.save()
@@ -145,11 +147,11 @@ Check project duration::
     >>> project.duration_to_invoice
     datetime.timedelta(0)
     >>> project.invoiced_amount
-    Decimal('0')
+    Decimal('0.00')
 
-Do 1 task::
+Do 50% of task::
 
-    >>> task.state = 'done'
+    >>> task.progress = 0.5
     >>> task.save()
 
 Check project duration::
@@ -158,44 +160,46 @@ Check project duration::
     >>> project.invoiced_duration
     datetime.timedelta(0)
     >>> project.duration_to_invoice
-    datetime.timedelta(0, 18000)
+    datetime.timedelta(0, 9000)
     >>> project.invoiced_amount
-    Decimal('0')
+    Decimal('0.00')
 
 Invoice project::
 
     >>> config.user = project_invoice_user.id
     >>> project.click('invoice')
     >>> project.invoiced_duration
-    datetime.timedelta(0, 18000)
+    datetime.timedelta(0, 9000)
     >>> project.duration_to_invoice
     datetime.timedelta(0)
     >>> project.invoiced_amount
-    Decimal('100.00')
+    Decimal('50.00')
 
-Do project::
+Do 75% of task and 100% of project::
 
     >>> config.user = project_user.id
-    >>> project.state = 'done'
+    >>> task.progress = 0.75
+    >>> task.save()
+    >>> project.progress = 1.
     >>> project.save()
 
 Check project duration::
 
     >>> project.reload()
     >>> project.invoiced_duration
-    datetime.timedelta(0, 18000)
+    datetime.timedelta(0, 9000)
     >>> project.duration_to_invoice
-    datetime.timedelta(0, 3600)
+    datetime.timedelta(0, 8100)
     >>> project.invoiced_amount
-    Decimal('100.00')
+    Decimal('50.00')
 
 Invoice again project::
 
     >>> config.user = project_invoice_user.id
     >>> project.click('invoice')
     >>> project.invoiced_duration
-    datetime.timedelta(0, 21600)
+    datetime.timedelta(0, 17100)
     >>> project.duration_to_invoice
     datetime.timedelta(0)
     >>> project.invoiced_amount
-    Decimal('120.00')
+    Decimal('95.00')
diff --git a/tests/scenario_project_invoice_timesheet.rst b/tests/scenario_project_invoice_timesheet.rst
index 351963f..2a51769 100644
--- a/tests/scenario_project_invoice_timesheet.rst
+++ b/tests/scenario_project_invoice_timesheet.rst
@@ -23,12 +23,12 @@ Create database::
 
 Install project_invoice::
 
-    >>> Module = Model.get('ir.module.module')
+    >>> Module = Model.get('ir.module')
     >>> module, = Module.find([
     ...         ('name', '=', 'project_invoice'),
     ...     ])
     >>> module.click('install')
-    >>> Wizard('ir.module.module.install_upgrade').execute('upgrade')
+    >>> Wizard('ir.module.install_upgrade').execute('upgrade')
 
 Create company::
 
@@ -116,6 +116,7 @@ Create a Project::
     >>> ProjectWork = Model.get('project.work')
     >>> TimesheetWork = Model.get('timesheet.work')
     >>> project = ProjectWork()
+    >>> project.name = 'Test timesheet'
     >>> work = TimesheetWork()
     >>> work.name = 'Test timesheet'
     >>> work.save()
@@ -125,6 +126,7 @@ Create a Project::
     >>> project.project_invoice_method = 'timesheet'
     >>> project.product = product
     >>> task = ProjectWork()
+    >>> task.name = 'Task 1'
     >>> work = TimesheetWork()
     >>> work.name = 'Task 1'
     >>> work.save()
@@ -157,7 +159,7 @@ Check project duration::
     >>> project.duration_to_invoice
     datetime.timedelta(0, 18000)
     >>> project.invoiced_amount
-    Decimal('0')
+    Decimal('0.00')
 
 Invoice project::
 
@@ -168,7 +170,7 @@ Invoice project::
     >>> project.duration_to_invoice
     datetime.timedelta(0)
     >>> project.invoiced_amount
-    Decimal('100.000000000000')
+    Decimal('100.00')
 
 Create more timesheets::
 
@@ -188,7 +190,7 @@ Check project duration::
     >>> project.duration_to_invoice
     datetime.timedelta(0, 14400)
     >>> project.invoiced_amount
-    Decimal('100.000000000000')
+    Decimal('100.00')
 
 Invoice again project::
 
@@ -199,4 +201,4 @@ Invoice again project::
     >>> project.duration_to_invoice
     datetime.timedelta(0)
     >>> project.invoiced_amount
-    Decimal('180.000000000000')
+    Decimal('180.00')
diff --git a/tests/test_project_invoice.py b/tests/test_project_invoice.py
index 7f7f2a6..9b259c9 100644
--- a/tests/test_project_invoice.py
+++ b/tests/test_project_invoice.py
@@ -24,4 +24,8 @@ def suite():
             'scenario_project_invoice_effort.rst',
             setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
             optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+    suite.addTests(doctest.DocFileSuite(
+            'scenario_project_invoice_progress.rst',
+            setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
+            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
     return suite
diff --git a/tryton.cfg b/tryton.cfg
index 1f87746..6849549 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=3.6.1
+version=3.8.0
 depends:
     ir
     project
diff --git a/trytond_project_invoice.egg-info/PKG-INFO b/trytond_project_invoice.egg-info/PKG-INFO
index d531a83..8e77718 100644
--- a/trytond_project_invoice.egg-info/PKG-INFO
+++ b/trytond_project_invoice.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-project-invoice
-Version: 3.6.1
+Version: 3.8.0
 Summary: Tryton module to invoice projects
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.6/
+Download-URL: http://downloads.tryton.org/3.8/
 Description: trytond_project_invoice
         =======================
         
@@ -60,6 +60,9 @@ Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Hungarian
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Portuguese (Brazilian)
 Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
diff --git a/trytond_project_invoice.egg-info/SOURCES.txt b/trytond_project_invoice.egg-info/SOURCES.txt
index 16b0b82..644c204 100644
--- a/trytond_project_invoice.egg-info/SOURCES.txt
+++ b/trytond_project_invoice.egg-info/SOURCES.txt
@@ -10,35 +10,60 @@ timesheet.xml
 tryton.cfg
 work.xml
 ./__init__.py
+./invoice.py
 ./project.xml
 ./timesheet.py
 ./timesheet.xml
 ./tryton.cfg
 ./work.py
 ./work.xml
+./locale/bg_BG.po
 ./locale/ca_ES.po
+./locale/cs_CZ.po
 ./locale/de_DE.po
 ./locale/es_AR.po
 ./locale/es_CO.po
 ./locale/es_EC.po
 ./locale/es_ES.po
+./locale/es_MX.po
 ./locale/fr_FR.po
+./locale/hu_HU.po
+./locale/it_IT.po
+./locale/ja_JP.po
+./locale/lt_LT.po
+./locale/nl_NL.po
+./locale/pt_BR.po
+./locale/ru_RU.po
 ./locale/sl_SI.po
 ./tests/__init__.py
 ./tests/scenario_project_invoice_effort.rst
+./tests/scenario_project_invoice_progress.rst
 ./tests/scenario_project_invoice_timesheet.rst
 ./tests/test_project_invoice.py
 ./view/work_form.xml
+./view/work_invoiced_progress_form.xml
+./view/work_invoiced_progress_list.xml
 doc/index.rst
+locale/bg_BG.po
 locale/ca_ES.po
+locale/cs_CZ.po
 locale/de_DE.po
 locale/es_AR.po
 locale/es_CO.po
 locale/es_EC.po
 locale/es_ES.po
+locale/es_MX.po
 locale/fr_FR.po
+locale/hu_HU.po
+locale/it_IT.po
+locale/ja_JP.po
+locale/lt_LT.po
+locale/nl_NL.po
+locale/pt_BR.po
+locale/ru_RU.po
 locale/sl_SI.po
 tests/scenario_project_invoice_effort.rst
+tests/scenario_project_invoice_progress.rst
 tests/scenario_project_invoice_timesheet.rst
 trytond_project_invoice.egg-info/PKG-INFO
 trytond_project_invoice.egg-info/SOURCES.txt
@@ -47,4 +72,6 @@ trytond_project_invoice.egg-info/entry_points.txt
 trytond_project_invoice.egg-info/not-zip-safe
 trytond_project_invoice.egg-info/requires.txt
 trytond_project_invoice.egg-info/top_level.txt
-view/work_form.xml
\ No newline at end of file
+view/work_form.xml
+view/work_invoiced_progress_form.xml
+view/work_invoiced_progress_list.xml
\ No newline at end of file
diff --git a/trytond_project_invoice.egg-info/requires.txt b/trytond_project_invoice.egg-info/requires.txt
index ef1f62c..3ef8868 100644
--- a/trytond_project_invoice.egg-info/requires.txt
+++ b/trytond_project_invoice.egg-info/requires.txt
@@ -1,8 +1,8 @@
 python-sql >= 0.4
-trytond_project >= 3.6, < 3.7
-trytond_project_revenue >= 3.6, < 3.7
-trytond_timesheet >= 3.6, < 3.7
-trytond_account >= 3.6, < 3.7
-trytond_account_invoice >= 3.6, < 3.7
-trytond_product >= 3.6, < 3.7
-trytond >= 3.6, < 3.7
\ No newline at end of file
+trytond_project >= 3.8, < 3.9
+trytond_project_revenue >= 3.8, < 3.9
+trytond_timesheet >= 3.8, < 3.9
+trytond_account >= 3.8, < 3.9
+trytond_account_invoice >= 3.8, < 3.9
+trytond_product >= 3.8, < 3.9
+trytond >= 3.8, < 3.9
\ No newline at end of file
diff --git a/view/work_form.xml b/view/work_form.xml
index 58a479f..5617fe0 100644
--- a/view/work_form.xml
+++ b/view/work_form.xml
@@ -22,4 +22,9 @@ this repository contains the full copyright notices and license terms. -->
         position="inside">
         <button string="Invoice" name="invoice"/>
     </xpath>
+    <xpath expr="/form/notebook" position="inside">
+        <page name="invoiced_progress">
+            <field name="invoiced_progress" colspan="4"/>
+        </page>
+    </xpath>
 </data>
diff --git a/view/work_invoiced_progress_form.xml b/view/work_invoiced_progress_form.xml
new file mode 100644
index 0000000..d4a7851
--- /dev/null
+++ b/view/work_invoiced_progress_form.xml
@@ -0,0 +1,12 @@
+<?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 string="Work Invoiced Progress">
+    <label name="work"/>
+    <field name="work"/>
+    <newline/>
+    <label name="effort_duration"/>
+    <field name="effort_duration"/>
+    <label name="invoice_line"/>
+    <field name="invoice_line"/>
+</form>
diff --git a/view/work_invoiced_progress_list.xml b/view/work_invoiced_progress_list.xml
new file mode 100644
index 0000000..9c0d567
--- /dev/null
+++ b/view/work_invoiced_progress_list.xml
@@ -0,0 +1,8 @@
+<?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 string="Work Invoiced Progresses">
+    <field name="work"/>
+    <field name="effort_duration"/>
+    <field name="invoice_line"/>
+</tree>
diff --git a/work.py b/work.py
index b6684ab..2ce85f7 100644
--- a/work.py
+++ b/work.py
@@ -3,13 +3,14 @@
 from __future__ import division
 
 from itertools import groupby
+from collections import defaultdict
 from decimal import Decimal
 import datetime
 
 from sql import Null
 from sql.aggregate import Sum
 
-from trytond.model import ModelView, fields
+from trytond.model import ModelSQL, ModelView, fields
 from trytond.pool import PoolMeta
 from trytond.pyson import Eval, Bool, PYSONEncoder
 from trytond.pool import Pool
@@ -18,12 +19,13 @@ from trytond.wizard import Wizard, StateAction
 from trytond.tools import reduce_ids, grouped_slice
 
 
-__all__ = ['Work', 'OpenInvoice']
+__all__ = ['Work', 'WorkInvoicedProgress', 'OpenInvoice']
 __metaclass__ = PoolMeta
 
 INVOICE_METHODS = [
     ('manual', 'Manual'),
     ('effort', 'On Effort'),
+    ('progress', 'On Progress'),
     ('timesheet', 'On Timesheet'),
     ]
 
@@ -45,22 +47,24 @@ class Work:
             states={
                 'invisible': Eval('invoice_method') == 'manual',
                 },
-            depends=['invoice_method']), 'get_invoice_values')
+            depends=['invoice_method']), 'get_total')
     duration_to_invoice = fields.Function(fields.TimeDelta(
             'Duration to Invoice', 'company_work_time',
             states={
                 'invisible': Eval('invoice_method') == 'manual',
                 },
-            depends=['invoice_method']), 'get_invoice_values')
+            depends=['invoice_method']), 'get_total')
     invoiced_amount = fields.Function(fields.Numeric('Invoiced Amount',
             digits=(16, Eval('currency_digits', 2)),
             states={
                 'invisible': Eval('invoice_method') == 'manual',
                 },
             depends=['currency_digits', 'invoice_method']),
-        'get_invoice_values')
+        'get_total')
     invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
         readonly=True)
+    invoiced_progress = fields.One2Many('project.work.invoiced_progress',
+        'work', 'Invoiced Progress', readonly=True)
 
     @classmethod
     def __setup__(cls):
@@ -99,12 +103,6 @@ class Work:
         else:
             return 'manual'
 
-    @property
-    def effort_hours(self):
-        if not self.effort_duration:
-            return 0
-        return self.effort_duration.total_seconds() / 60 / 60
-
     @staticmethod
     def default_invoiced_duration():
         return datetime.timedelta()
@@ -116,7 +114,16 @@ class Work:
     @staticmethod
     def _get_invoiced_duration_effort(works):
         return dict((w.id, w.effort_duration) for w in works
-            if w.invoice_line)
+            if w.invoice_line and w.effort_duration)
+
+    @staticmethod
+    def _get_invoiced_duration_progress(works):
+        durations = {}
+        for work in works:
+            durations[work.id] = sum((p.effort_duration
+                    for p in work.invoiced_progress if p.effort_duration),
+                datetime.timedelta())
+        return durations
 
     @classmethod
     def _get_invoiced_duration_timesheet(cls, works):
@@ -135,6 +142,24 @@ class Work:
         return dict((w.id, w.effort_duration) for w in works
             if w.state == 'done' and not w.invoice_line)
 
+    @staticmethod
+    def _get_duration_to_invoice_progress(works):
+        durations = {}
+        for work in works:
+            if work.progress is None or work.effort_duration is None:
+                continue
+            effort_to_invoice = datetime.timedelta(
+                hours=work.effort_hours * work.progress)
+            effort_invoiced = sum(
+                (p.effort_duration
+                    for p in work.invoiced_progress),
+                datetime.timedelta())
+            if effort_to_invoice > effort_invoiced:
+                durations[work.id] = effort_to_invoice - effort_invoiced
+            else:
+                durations[work.id] = datetime.timedelta()
+        return durations
+
     @classmethod
     def _get_duration_to_invoice_timesheet(cls, works):
         return cls._get_duration_timesheet(works, False)
@@ -151,6 +176,7 @@ class Work:
     def _get_invoiced_amount_effort(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
@@ -159,33 +185,118 @@ class Work:
         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]
-                amounts[work.id] = invoice_line.amount
+                invoice_currency = (invoice_line.invoice.currency
+                    if invoice_line.invoice else invoice_line.currency)
+                amounts[work.id] = Currency.compute(invoice_currency,
+                    Decimal(str(work.effort_hours)) * invoice_line.unit_price,
+                    currency)
             else:
                 amounts[work.id] = Decimal(0)
         return amounts
 
-    @staticmethod
-    def _get_invoiced_amount_timesheet(works):
+    @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')
 
-        invoice_lines = InvoiceLine.browse([
-                t.invoice_line.id for w in works
-                for t in w.work.timesheet_lines
-                if t.invoice_line])
+        cursor = Transaction().cursor
+        table = cls.__table__()
+        progress = Progress.__table__()
+        invoice_line = InvoiceLine.__table__()
+        company = Company.__table__()
+
+        amounts = defaultdict(Decimal)
+        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(progress,
+                    condition=progress.work == table.id
+                    ).join(invoice_line,
+                    condition=progress.invoice_line == invoice_line.id
+                    ).select(table.id,
+                    Sum(progress.effort_duration * invoice_line.unit_price),
+                    where=where,
+                    group_by=table.id))
+            for work_id, amount in cursor.fetchall():
+                if isinstance(amount, datetime.timedelta):
+                    amount = amount.total_seconds()
+                # Amount computed in second instead of hours
+                if amount is not None:
+                    amount /= 60 * 60
+                else:
+                    amount = 0
+                amounts[work_id] = amount
+
+            cursor.execute(*table.join(company,
+                    condition=table.company == company.id
+                    ).select(table.id, company.currency,
+                    where=where))
+            work2currency.update(cursor.fetchall())
+
+        currencies = Currency.browse(set(work2currency.itervalues()))
+        id2currency = {c.id: c for c in currencies}
+
+        for work in works:
+            currency = id2currency[work2currency[work.id]]
+            amounts[work.id] = currency.round(Decimal(amounts[work.id]))
+        return amounts
+
+    @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().cursor
+        table = cls.__table__()
+        timesheet_work = TimesheetWork.__table__()
+        timesheet_line = TimesheetLine.__table__()
+        invoice_line = InvoiceLine.__table__()
+        company = Company.__table__()
 
-        id2invoice_lines = dict((l.id, l) for l in invoice_lines)
         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=table.work == timesheet_work.id
+                    ).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.fetchall())
+
+            cursor.execute(*table.join(company,
+                    condition=table.company == company.id
+                    ).select(table.id, company.currency,
+                    where=where))
+            work2currency.update(cursor.fetchall())
+
+        currencies = Currency.browse(set(work2currency.itervalues()))
+        id2currency = {c.id: c for c in currencies}
+
         for work in works:
-            amounts[work.id] = Decimal(0)
-            for timesheet_line in work.work.timesheet_lines:
-                if not timesheet_line.invoice_line:
-                    continue
-                invoice_line = id2invoice_lines[timesheet_line.invoice_line.id]
-                amounts[work.id] += (invoice_line.unit_price
-                    * Decimal(str(timesheet_line.hours)))
+            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
 
     @staticmethod
@@ -208,28 +319,37 @@ class Work:
                     where=red_sql & where,
                     group_by=line.work))
             for twork_id, duration in cursor.fetchall():
-                # SQLite uses float for SUM
-                if not isinstance(duration, datetime.timedelta):
-                    duration = datetime.timedelta(seconds=duration)
-                durations[twork2work[twork_id]] = duration
+                if duration:
+                    # SQLite uses float for SUM
+                    if not isinstance(duration, datetime.timedelta):
+                        duration = datetime.timedelta(seconds=duration)
+                    durations[twork2work[twork_id]] = duration
         return durations
 
     @classmethod
-    def get_invoice_values(cls, works, name):
-        works += cls.search([
-                ('parent', 'child_of', [w.id for w in works]),
-                ])
-
-        values = {}
-        method2works = {}
+    def _get_invoice_values(cls, works, name):
+        default = getattr(cls, 'default_%s' % name)
+        durations = dict.fromkeys((w.id for w in works), default())
+        method2works = defaultdict(list)
         for work in works:
-            method2works.setdefault(work.invoice_method, []).append(work)
+            method2works[work.invoice_method].append(work)
         for method, m_works in method2works.iteritems():
             method = getattr(cls, '_get_%s_%s' % (name, method))
-            values.update(method(m_works))
+            # Re-browse for cache alignment
+            durations.update(method(cls.browse(m_works)))
+        return durations
 
-        default = getattr(cls, 'default_%s' % name)()
-        return cls.sum_tree(works, lambda w: values.get(w.id) or default)
+    @classmethod
+    def _get_invoiced_duration(cls, works):
+        return cls._get_invoice_values(works, 'invoiced_duration')
+
+    @classmethod
+    def _get_duration_to_invoice(cls, works):
+        return cls._get_invoice_values(works, 'duration_to_invoice')
+
+    @classmethod
+    def _get_invoiced_amount(cls, works):
+        return cls._get_invoice_values(works, 'invoiced_amount')
 
     @classmethod
     @ModelView.button
@@ -257,6 +377,7 @@ class Work:
                     origin = line['origin']
                     origins.setdefault(origin.__class__, []).append(origin)
                 for klass, records in origins.iteritems():
+                    klass.save(records)  # Store first new origins
                     klass.write(records, {
                             'invoice_line': invoice_line.id,
                             })
@@ -288,7 +409,7 @@ class Work:
             currency=self.company.currency,
             account=self.party.account_receivable,
             payment_term=self.party.customer_payment_term,
-            description=self.work.name,
+            description=self.name,
             )
 
     def _group_lines_to_invoice_key(self, line):
@@ -352,7 +473,38 @@ class Work:
                     'quantity': self.effort_hours,
                     'unit_price': self.list_price,
                     'origin': self,
-                    'description': self.work.name,
+                    'description': self.name,
+                    }]
+        return []
+
+    def _get_lines_to_invoice_progress(self):
+        pool = Pool()
+        InvoicedProgress = pool.get('project.work.invoiced_progress')
+        ModelData = pool.get('ir.model.data')
+        Uom = pool.get('product.uom')
+
+        hour = Uom(ModelData.get_id('product', 'uom_hour'))
+
+        if self.progress is None or self.effort_duration is None:
+            return []
+
+        invoiced_progress = sum(x.effort_hours for x in self.invoiced_progress)
+        quantity = self.effort_hours * self.progress - invoiced_progress
+        quantity = Uom.compute_qty(hour, quantity, self.product.default_uom)
+        if quantity > 0:
+            if not self.product:
+                self.raise_user_error('missing_product', (self.rec_name,))
+            elif self.list_price is None:
+                self.raise_user_error('missing_list_price', (self.rec_name,))
+            invoiced_progress = InvoicedProgress(work=self,
+                effort_duration=datetime.timedelta(hours=quantity))
+            return [{
+                    'product': self.product,
+                    'quantity': quantity,
+                    'unit_price': self.list_price,
+                    'origin': invoiced_progress,
+                    'description': self.name,
+                    'description': self.name,
                     }]
         return []
 
@@ -367,7 +519,7 @@ class Work:
                     'quantity': l.hours,
                     'unit_price': self.list_price,
                     'origin': l,
-                    'description': self.work.name,
+                    'description': self.name,
                     } for l in self.work.timesheet_lines
                 if not l.invoice_line]
         return []
@@ -390,6 +542,22 @@ class Work:
         return lines
 
 
+class WorkInvoicedProgress(ModelView, ModelSQL):
+    'Work Invoiced Progress'
+    __name__ = 'project.work.invoiced_progress'
+    work = fields.Many2One('project.work', 'Work', ondelete='RESTRICT',
+        select=True)
+    effort_duration = fields.TimeDelta('Effort', 'company_work_time')
+    invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+        ondelete='CASCADE')
+
+    @property
+    def effort_hours(self):
+        if not self.effort_duration:
+            return 0
+        return self.effort_duration.total_seconds() / 60 / 60
+
+
 class OpenInvoice(Wizard):
     'Open Invoice'
     __name__ = 'project.open_invoice'
@@ -406,10 +574,14 @@ class OpenInvoice(Wizard):
         for work in works:
             if work.invoice_line and work.invoice_line.invoice:
                 invoice_ids.add(work.invoice_line.invoice.id)
-            for timesheet_line in work.work.timesheet_lines:
-                if (timesheet_line.invoice_line
-                        and timesheet_line.invoice_line.invoice):
-                    invoice_ids.add(timesheet_line.invoice_line.invoice.id)
+            if work.work:
+                for timesheet_line in work.work.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)
         encoder = PYSONEncoder()
         action['pyson_domain'] = encoder.encode(
             [('id', 'in', list(invoice_ids))])
diff --git a/work.xml b/work.xml
index de9de41..5afdb53 100644
--- a/work.xml
+++ b/work.xml
@@ -19,6 +19,25 @@ this repository contains the full copyright notices and license terms. -->
             <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"
+                search="[('model', '=', 'project.work.invoiced_progress')]"/>
+            <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>
-- 
tryton-modules-project-invoice



More information about the tryton-debian-vcs mailing list