[tryton-debian-vcs] tryton-modules-stock-forecast branch upstream created. b4ca290ed8111bf812ba98af417ba441b5f5eb15
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Wed Nov 27 17:10:34 UTC 2013
The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-stock-forecast.git;a=commitdiff;h=b4ca290ed8111bf812ba98af417ba441b5f5eb15
commit b4ca290ed8111bf812ba98af417ba441b5f5eb15
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Nov 24 17:28:22 2013 +0100
Adding upstream version 3.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 7b6caa6..0b32092 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
Version 2.8.0 - 2013-04-22
* Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index 4b0b4c3..b354d0a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,6 +6,7 @@ Prerequisites
* Python 2.6 or later (http://www.python.org/)
* python-dateutil (http://labix.org/python-dateutil)
+ * python-sql (http://code.google.com/p/python-sql/)
* trytond (http://www.tryton.org/)
* trytond_product (http://www.tryton.org/)
* trytond_stock (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 3e04fa5..7b3817c 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond_stock_forecast
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
Description: trytond_stock_forecast
=====================
@@ -60,6 +60,7 @@ Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
diff --git a/forecast.py b/forecast.py
index f0e1738..d0d4d0a 100644
--- a/forecast.py
+++ b/forecast.py
@@ -3,10 +3,13 @@
import datetime
from dateutil.relativedelta import relativedelta
import itertools
+from sql.aggregate import Sum
+from sql.conditionals import Coalesce
+
from trytond.model import ModelView, Workflow, ModelSQL, fields
from trytond.wizard import Wizard, StateView, StateTransition, Button
from trytond.pyson import Not, Equal, Eval, Or, Bool, If
-from trytond.backend import TableHandler
+from trytond import backend
from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.tools import reduce_ids
@@ -94,7 +97,9 @@ class Forecast(Workflow, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
Location = Pool().get('stock.location')
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
table = TableHandler(cursor, cls, module_name)
migrate_warehouse = (not table.column_exist('warehouse')
@@ -114,7 +119,7 @@ class Forecast(Workflow, ModelSQL, ModelView):
return location.id
elif location.parent:
return find_warehouse(location.parent)
- cursor.execute('SELECT id, location FROM "%s"' % cls._table)
+ cursor.execute(*sql_table.select(sql_table.id, sql_table.location))
for forecast_id, location_id in cursor.fetchall():
warehouse_id = location_id # default fallback
if location_id in location2warehouse:
@@ -123,9 +128,10 @@ class Forecast(Workflow, ModelSQL, ModelView):
location = Location(location_id)
warehouse_id = find_warehouse(location) or location_id
location2warehouse[location_id] = warehouse_id
- cursor.execute('UPDATE "%s" SET warehouse = %%s '
- 'WHERE id = %%s' % cls._table,
- (warehouse_id, forecast_id))
+ cursor.execute(*sql_table.update(
+ columns=[sql_table.warehouse],
+ values=[warehouse_id],
+ where=sql_table.id == forecast_id))
table.not_null_action('warehouse',
action=cls.warehouse.required and 'add' or 'remove')
table.drop_column('location', True)
@@ -158,22 +164,19 @@ class Forecast(Workflow, ModelSQL, ModelView):
def check_date_overlap(self):
cursor = Transaction().cursor
if self.state != 'done':
- return True
- cursor.execute('SELECT id '
- 'FROM stock_forecast '
- 'WHERE ((from_date <= %s AND to_date >= %s) '
- 'OR (from_date <= %s AND to_date >= %s) '
- 'OR (from_date >= %s AND to_date <= %s)) '
- 'AND warehouse = %s '
- 'AND destination = %s '
- 'AND state = \'done\' '
- 'AND company = %s '
- 'AND id != %s',
- (self.from_date, self.from_date,
- self.to_date, self.to_date,
- self.from_date, self.to_date,
- self.warehouse.id, self.destination.id,
- self.company.id, self.id))
+ return
+ forcast = self.__table__()
+ cursor.execute(*forcast.select(forcast.id,
+ where=(((forcast.from_date <= self.from_date)
+ & (forcast.to_date >= self.from_date))
+ | ((forcast.from_date <= self.to_date)
+ & (forcast.to_date >= self.to_date))
+ | ((forcast.from_date >= self.from_date)
+ & (forcast.to_date <= self.to_date)))
+ & (forcast.warehouse == self.warehouse.id)
+ & (forcast.destination == self.destination.id)
+ & (forcast.company == self.company.id)
+ & (forcast.id != self.id)))
forecast_id = cursor.fetchone()
if forecast_id:
second = self.__class__(forecast_id[0])
@@ -338,6 +341,11 @@ class ForecastLine(ModelSQL, ModelView):
Forecast = pool.get('stock.forecast')
LineMove = pool.get('stock.forecast.line-stock.move')
+ move = Move.__table__()
+ location_from = Location.__table__()
+ location_to = Location.__table__()
+ line_move = LineMove.__table__()
+
result = dict((x.id, 0) for x in lines)
key = lambda line: line.forecast.id
lines.sort(key=key)
@@ -347,28 +355,26 @@ class ForecastLine(ModelSQL, ModelView):
product_ids = product2line.keys()
for i in range(0, len(product_ids), cursor.IN_MAX):
sub_ids = product_ids[i:i + cursor.IN_MAX]
- red_sql, red_ids = reduce_ids('product', sub_ids)
- cursor.execute('SELECT m.product, '
- 'SUM(m.internal_quantity) AS quantity '
- 'FROM "' + Move._table + '" AS m '
- 'JOIN "' + Location._table + '" AS fl '
- 'ON m.from_location = fl.id '
- 'JOIN "' + Location._table + '" AS tl '
- 'ON m.to_location = tl.id '
- 'LEFT JOIN "' + LineMove._table + '" AS lm '
- 'ON m.id = lm.move '
- 'WHERE ' + red_sql + ' '
- 'AND fl.left >= %s AND fl.right <= %s '
- 'AND tl.left >= %s AND tl.right <= %s '
- 'AND m.state != %s '
- 'AND COALESCE(m.effective_date, m.planned_date) >= %s '
- 'AND COALESCE(m.effective_date, m.planned_date) <= %s '
- 'AND lm.id IS NULL '
- 'GROUP BY m.product',
- red_ids + [forecast.warehouse.left,
- forecast.warehouse.right, forecast.destination.left,
- forecast.destination.right, 'cancel',
- forecast.from_date, forecast.to_date])
+ red_sql = reduce_ids(move.product, sub_ids)
+ cursor.execute(*move.join(location_from,
+ condition=move.from_location == location_from.id
+ ).join(location_to,
+ condition=move.to_location == location_to.id
+ ).join(line_move, 'LEFT',
+ condition=move.id == line_move.move
+ ).select(move.product, Sum(move.internal_quantity),
+ where=red_sql
+ & (location_from.left >= forecast.warehouse.left)
+ & (location_from.right <= forecast.warehouse.right)
+ & (location_to.left >= forecast.destination.left)
+ & (location_to.right <= forecast.destination.right)
+ & (move.state != 'cancel')
+ & (Coalesce(move.effective_date, move.planned_date)
+ >= forecast.from_date)
+ & (Coalesce(move.effective_date, move.planned_date)
+ <= forecast.to_date)
+ & (line_move.id == None),
+ group_by=move.product))
for product_id, quantity in cursor.fetchall():
line = product2line[product_id]
result[line.id] = Uom.compute_qty(line.product.default_uom,
@@ -513,7 +519,8 @@ class ForecastComplete(Wizard):
def __setup__(cls):
super(ForecastComplete, cls).__setup__()
cls._error_messages.update({
- 'from_to_date': '"From Date" should be smaller than "To Date".',
+ 'from_to_date': (
+ '"From Date" should be smaller than "To Date".'),
})
def default_ask(self, fields):
@@ -541,7 +548,7 @@ class ForecastComplete(Wizard):
stock_date_start=self.ask.from_date,
stock_date_end=self.ask.to_date):
return Product.products_by_location([forecast.warehouse.id],
- with_childs=True, skip_zero=False)
+ with_childs=True)
def default_choose(self, fields):
"""
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 4190548..3c21e70 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"."
-msgstr "\"Desde la fecha\" debe ser más pequeña que \"Hasta la fecha\"."
+msgstr "\"Desde la fecha\" debe ser anterior a \"Hasta la fecha\"."
msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity"
@@ -20,19 +20,19 @@ msgstr "El producto debe ser único en la previsión de stocks."
msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\""
-msgstr "\"Hasta la fecha\" debe ser más grande que \"Desde la fecha\"."
+msgstr "\"Hasta la fecha\" debe ser posterior a \"Desde la fecha\"."
msgctxt "error:stock.forecast:"
msgid ""
"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
" same location."
msgstr ""
-"La previsión \"%(first)s\" se solpa con las fechas de la previsón "
+"La previsión \"%(first)s\" se solapa con las fechas de la previsón "
"%(second)s\" en la misma ubicación."
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar la previsión \"%s\" antes de borrar."
+msgstr "Debe cancelar la previsión \"%s\" antes de borrarla."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -301,11 +301,11 @@ msgstr "Restaurar a borrador"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr "Seleccione productos"
+msgstr "Seleccionar productos"
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Completa"
+msgstr "Completar"
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
@@ -313,11 +313,11 @@ msgstr "Cancelar"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Seleccione fechas"
+msgstr "Seleccionar fechas"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
-msgstr "Completa"
+msgstr "Completar"
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 63df909..79240d5 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -249,14 +249,6 @@ msgid "Cancel"
msgstr "Annulé"
msgctxt "selection:stock.forecast,state:"
-msgid "Cancel"
-msgstr "Annulé"
-
-msgctxt "selection:stock.forecast,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Fait"
@@ -264,14 +256,6 @@ msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Brouillon"
-msgctxt "selection:stock.forecast,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:stock.forecast.complete.ask:"
-msgid "Choose dates"
-msgstr "Choisir les dates"
-
msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr "Choisir les dates"
@@ -280,14 +264,6 @@ msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr "Choisissez les produits"
-msgctxt "view:stock.forecast.complete.choose:"
-msgid "Choose products"
-msgstr "Choisissez les produits"
-
-msgctxt "view:stock.forecast.line:"
-msgid "Forecast Line"
-msgstr "Ligne de prévision"
-
msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Ligne de prévision"
@@ -296,23 +272,11 @@ msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Lignes de prévision"
-msgctxt "view:stock.forecast.line:"
-msgid "Forecast Lines"
-msgstr "Lignes de prévision"
-
msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
msgctxt "view:stock.forecast:"
-msgid "Add forecast line based on past data."
-msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
-
-msgctxt "view:stock.forecast:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Annuler"
@@ -321,14 +285,6 @@ msgid "Complete Forecast"
msgstr "Completer la prévision"
msgctxt "view:stock.forecast:"
-msgid "Complete Forecast"
-msgstr "Completer la prévision"
-
-msgctxt "view:stock.forecast:"
-msgid "Confirm"
-msgstr "Confirmer"
-
-msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Confirmer"
@@ -337,14 +293,6 @@ msgid "Forecast"
msgstr "Prévision"
msgctxt "view:stock.forecast:"
-msgid "Forecast"
-msgstr "Prévision"
-
-msgctxt "view:stock.forecast:"
-msgid "Forecasts"
-msgstr "Prévisions"
-
-msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Prévisions"
@@ -352,10 +300,6 @@ msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Remettre en brouillon"
-msgctxt "view:stock.forecast:"
-msgid "Reset to Draft"
-msgstr "Remettre en brouillon"
-
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
msgstr "Choix des produits"
diff --git a/locale/es_ES.po b/locale/sl_SI.po
similarity index 72%
copy from locale/es_ES.po
copy to locale/sl_SI.po
index 4190548..4f7e6a1 100644
--- a/locale/es_ES.po
+++ b/locale/sl_SI.po
@@ -4,55 +4,55 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"."
-msgstr "\"Desde la fecha\" debe ser más pequeña que \"Hasta la fecha\"."
+msgstr "Datum \"Od\" naj bo manjši od datuma \"Do\""
msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity"
-msgstr "La cantidad de la línea debe ser más grande que la cantidad mínima."
+msgstr "Količina postavke mora biti večja od minimalne količine"
msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive"
-msgstr "La cantidad de la línea debe ser positiva."
+msgstr "Količina postavke mora biti pozitivna"
msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forecast"
-msgstr "El producto debe ser único en la previsión de stocks."
+msgstr "Izdelek mora biti edinstven po napovedih"
msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\""
-msgstr "\"Hasta la fecha\" debe ser más grande que \"Desde la fecha\"."
+msgstr "Datum \"Do\" mora biti večji od datuma \"Od\""
msgctxt "error:stock.forecast:"
msgid ""
"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
" same location."
msgstr ""
-"La previsión \"%(first)s\" se solpa con las fechas de la previsón "
-"%(second)s\" en la misma ubicación."
+"Napoved \"%(first)s\" se prekriva z datumi napovedi \"%(second)s\" na isti "
+"lokaciji."
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar la previsión \"%s\" antes de borrar."
+msgstr "Napoved \"%s\" mora biti pred brisanjem preklicana."
msgctxt "field:stock.forecast,company:"
msgid "Company"
-msgstr "Empresa"
+msgstr "Podjetje"
msgctxt "field:stock.forecast,create_date:"
msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Ustvarjeno"
msgctxt "field:stock.forecast,create_uid:"
msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Ustvaril"
msgctxt "field:stock.forecast,destination:"
msgid "Destination"
-msgstr "Destino"
+msgstr "Cilj"
msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
-msgstr "Desde la fecha"
+msgstr "Od"
msgctxt "field:stock.forecast,id:"
msgid "ID"
@@ -60,35 +60,35 @@ msgstr "ID"
msgctxt "field:stock.forecast,lines:"
msgid "Lines"
-msgstr "Líneas"
+msgstr "Postavke"
msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:stock.forecast,state:"
msgid "State"
-msgstr "Estado"
+msgstr "Stanje"
msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
-msgstr "Hasta la fecha"
+msgstr "Do"
msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
-msgstr "Ubicación"
+msgstr "Lokacija"
msgctxt "field:stock.forecast,write_date:"
msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Zapisano"
msgctxt "field:stock.forecast,write_uid:"
msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Zapisal"
msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
-msgstr "Desde la fecha"
+msgstr "Od"
msgctxt "field:stock.forecast.complete.ask,id:"
msgid "ID"
@@ -96,7 +96,7 @@ msgstr "ID"
msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
-msgstr "Hasta la fecha"
+msgstr "Do"
msgctxt "field:stock.forecast.complete.choose,id:"
msgid "ID"
@@ -104,19 +104,19 @@ msgstr "ID"
msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
-msgstr "Productos"
+msgstr "Izdelki"
msgctxt "field:stock.forecast.line,create_date:"
msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Ustvarjeno"
msgctxt "field:stock.forecast.line,create_uid:"
msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Ustvaril"
msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
-msgstr "Previsión"
+msgstr "Napoved"
msgctxt "field:stock.forecast.line,id:"
msgid "ID"
@@ -124,55 +124,55 @@ msgstr "ID"
msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
-msgstr "Cantidad mínima"
+msgstr "Minimalna količina"
msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
-msgstr "Movimientos"
+msgstr "Promet"
msgctxt "field:stock.forecast.line,product:"
msgid "Product"
-msgstr "Producto"
+msgstr "Izdelek"
msgctxt "field:stock.forecast.line,product_uom_category:"
msgid "Product Uom Category"
-msgstr "Categoría UdM del producto"
+msgstr "Katerogija ME izdelka"
msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
-msgstr "Cantidad"
+msgstr "Količina"
msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr "Cantidades ejecutadas"
+msgstr "Izvedena količina"
msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
-msgstr "Decimales de la unidad"
+msgstr "Decimalke"
msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
-msgstr "UdM"
+msgstr "ME"
msgctxt "field:stock.forecast.line,write_date:"
msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Zapisano"
msgctxt "field:stock.forecast.line,write_uid:"
msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Zapisal"
msgctxt "field:stock.forecast.line-stock.move,create_date:"
msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Ustvarjeno"
msgctxt "field:stock.forecast.line-stock.move,create_uid:"
msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Ustvaril"
msgctxt "field:stock.forecast.line-stock.move,id:"
msgid "ID"
@@ -180,145 +180,145 @@ msgstr "ID"
msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
-msgstr "Línea de previsión"
+msgstr "Postavka napovedi"
msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
-msgstr "Movimiento"
+msgstr "Promet"
msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:stock.forecast.line-stock.move,write_date:"
msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Zapisano"
msgctxt "field:stock.forecast.line-stock.move,write_uid:"
msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Zapisal"
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
-msgstr "Previsiones"
+msgstr "Napovedi"
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
-msgstr "Previsión completa"
+msgstr "Izpolnitev napovedi"
msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
msgid "All"
-msgstr "Todos"
+msgstr "Vse"
msgctxt ""
"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
msgid "Draft"
-msgstr "Borrador"
+msgstr "Osnutki"
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
-msgstr "Previsiones"
+msgstr "Napovedi"
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
-msgstr "Previsión de stock"
+msgstr "Zaloga - napoved"
msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
-msgstr "Previsión de stock"
+msgstr "Napoved zaloge"
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
-msgstr "Previsión completa"
+msgstr "Izpolnitev napovedi"
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
-msgstr "Elegir previsión completa"
+msgstr "Izpolnitev napovedi"
msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
-msgstr "Línea de previsión de stock"
+msgstr "Postavka napovedi zaloge"
msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
-msgstr "Línea de previsión - Movimiento"
+msgstr "Postavka napovedi - Promet"
msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
-msgstr "Cancelar"
+msgstr "Preklic"
msgctxt "selection:stock.forecast,state:"
msgid "Done"
-msgstr "Realizada"
+msgstr "Zaključeno"
msgctxt "selection:stock.forecast,state:"
msgid "Draft"
-msgstr "Borrador"
+msgstr "Osnutek"
msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
-msgstr "Seleccione fechas"
+msgstr "Izberi datume"
msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
-msgstr "Seleccione productos"
+msgstr "Izberi izdelke"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
-msgstr "Línea de previsión"
+msgstr "Postavka napovedi"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
-msgstr "Líneas de previsión"
+msgstr "Postavke napovedi"
msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
-msgstr "Añadir línea de previsión en base a datos anteriores."
+msgstr "Dodaj postavko napovedi na osnovi preteklih podatkov."
msgctxt "view:stock.forecast:"
msgid "Cancel"
-msgstr "Cancelar"
+msgstr "Preklic"
msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
-msgstr "Previsión completa"
+msgstr "Izpolnitev napovedi"
msgctxt "view:stock.forecast:"
msgid "Confirm"
-msgstr "Confirmar"
+msgstr "Potrditev"
msgctxt "view:stock.forecast:"
msgid "Forecast"
-msgstr "Previsión"
+msgstr "Napoved"
msgctxt "view:stock.forecast:"
msgid "Forecasts"
-msgstr "Previsiones"
+msgstr "Napovedi"
msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
-msgstr "Restaurar a borrador"
+msgstr "Ponastavitev"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr "Seleccione productos"
+msgstr "Izberi izdelke"
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Completa"
+msgstr "Zaključi"
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
-msgstr "Cancelar"
+msgstr "Prekliči"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Seleccione fechas"
+msgstr "Izberi datume"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
-msgstr "Completa"
+msgstr "Zaključi"
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
-msgstr "Cancelar"
+msgstr "Prekliči"
diff --git a/setup.py b/setup.py
index e4be1e7..22bc159 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
-requires = ['python-dateutil']
+requires = ['python-dateutil', 'python-sql']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
@@ -64,6 +64,7 @@ setup(name='trytond_stock_forecast',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2.6',
diff --git a/tests/__init__.py b/tests/__init__.py
index 00ff08d..fe5fd50 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,3 +2,5 @@
#this repository contains the full copyright notices and license terms.
from .test_stock_forecast import suite
+
+__all__ = ['suite']
diff --git a/tryton.cfg b/tryton.cfg
index b851483..441c882 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.8.0
+version=3.0.0
depends:
company
ir
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 59aeb43..293719d 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond-stock-forecast
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
Description: trytond_stock_forecast
=====================
@@ -60,6 +60,7 @@ Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index f1b3aa3..cd76b78 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -22,6 +22,7 @@ locale/es_ES.po
locale/fr_FR.po
locale/nl_NL.po
locale/ru_RU.po
+locale/sl_SI.po
trytond_stock_forecast.egg-info/PKG-INFO
trytond_stock_forecast.egg-info/SOURCES.txt
trytond_stock_forecast.egg-info/dependency_links.txt
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index e88d788..a950d22 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,6 @@
python-dateutil
-trytond_company >= 2.8, < 2.9
-trytond_product >= 2.8, < 2.9
-trytond_stock >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_company >= 3.0, < 3.1
+trytond_product >= 3.0, < 3.1
+trytond_stock >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/view/forecast_tree.xml b/view/forecast_tree.xml
index 39b1277..c367b9d 100644
--- a/view/forecast_tree.xml
+++ b/view/forecast_tree.xml
@@ -7,5 +7,4 @@ this repository contains the full copyright notices and license terms. -->
<field name="from_date"/>
<field name="to_date"/>
<field name="company"/>
- <field name="create_date" tree_invisible="1"/>
</tree>
commit 32621e34e67a187695353fde5ee3f8adeadcce0f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu May 2 00:37:54 2013 +0200
Adding upstream version 2.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index 120e31b..7b6caa6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
Version 2.6.0 - 2012-10-22
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 2057c72..9192c97 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2012 Cédric Krier.
-Copyright (C) 2008-2012 Bertrand Chenal.
-Copyright (C) 2008-2012 B2CK SPRL.
+Copyright (C) 2008-2013 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+Copyright (C) 2008-2013 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/MANIFEST.in b/MANIFEST.in
index 97a9596..2569955 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,6 +6,7 @@ include CHANGELOG
include LICENSE
include tryton.cfg
include *.xml
+include view/*.xml
include *.odt
include locale/*.po
include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index f60862b..3e04fa5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,11 +1,12 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond_stock_forecast
-Version: 2.6.0
+Version: 2.8.0
Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
+Download-URL: http://downloads.tryton.org/2.8/
Description: trytond_stock_forecast
=====================
@@ -52,6 +53,7 @@ Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
diff --git a/forecast.py b/forecast.py
index e24d9dc..f0e1738 100644
--- a/forecast.py
+++ b/forecast.py
@@ -60,16 +60,13 @@ class Forecast(Workflow, ModelSQL, ModelView):
cls._sql_constraints += [
('check_from_to_date',
'CHECK(to_date >= from_date)',
- '"To Date" must be greater than "From Date"!'),
- ]
- cls._constraints += [
- ('check_date_overlap', 'date_overlap'),
+ '"To Date" must be greater than "From Date"'),
]
cls._error_messages.update({
- 'date_overlap': 'You can not create forecasts for the same ' \
- 'locations with overlapping dates',
- 'delete_cancel': 'Forecast "%s" must be cancelled before '\
- 'deletion!',
+ 'date_overlap': ('Forecast "%(first)s" overlaps with dates '
+ 'of forecast "%(second)s" in the same location.'),
+ 'delete_cancel': ('Forecast "%s" must be cancelled before '
+ 'deletion.'),
})
cls._order.insert(0, ('from_date', 'DESC'))
cls._order.insert(1, ('warehouse', 'ASC'))
@@ -152,31 +149,38 @@ class Forecast(Workflow, ModelSQL, ModelView):
def default_company():
return Transaction().context.get('company')
+ @classmethod
+ def validate(cls, forecasts):
+ super(Forecast, cls).validate(forecasts)
+ for forecast in forecasts:
+ forecast.check_date_overlap()
+
def check_date_overlap(self):
cursor = Transaction().cursor
if self.state != 'done':
return True
- cursor.execute('SELECT id ' \
- 'FROM stock_forecast ' \
- 'WHERE ((from_date <= %s AND to_date >= %s) ' \
- 'OR (from_date <= %s AND to_date >= %s) ' \
- 'OR (from_date >= %s AND to_date <= %s)) ' \
- 'AND warehouse = %s ' \
- 'AND destination = %s ' \
- 'AND state = \'done\' ' \
- 'AND company = %s '
- 'AND id != %s',
- (self.from_date, self.from_date,
- self.to_date, self.to_date,
- self.from_date, self.to_date,
- self.warehouse.id, self.destination.id,
- self.company.id, self.id))
- rowcount = cursor.rowcount
- if rowcount == -1 or rowcount is None:
- rowcount = len(cursor.fetchall())
- if rowcount:
- return False
- return True
+ cursor.execute('SELECT id '
+ 'FROM stock_forecast '
+ 'WHERE ((from_date <= %s AND to_date >= %s) '
+ 'OR (from_date <= %s AND to_date >= %s) '
+ 'OR (from_date >= %s AND to_date <= %s)) '
+ 'AND warehouse = %s '
+ 'AND destination = %s '
+ 'AND state = \'done\' '
+ 'AND company = %s '
+ 'AND id != %s',
+ (self.from_date, self.from_date,
+ self.to_date, self.to_date,
+ self.from_date, self.to_date,
+ self.warehouse.id, self.destination.id,
+ self.company.id, self.id))
+ forecast_id = cursor.fetchone()
+ if forecast_id:
+ second = self.__class__(forecast_id[0])
+ self.raise_user_error('date_overlap', {
+ 'first': self.rec_name,
+ 'second': second.rec_name,
+ })
@classmethod
def delete(self, forecasts):
@@ -285,12 +289,12 @@ class ForecastLine(ModelSQL, ModelView):
super(ForecastLine, cls).__setup__()
cls._sql_constraints += [
('check_line_qty_pos',
- 'CHECK(quantity >= 0.0)', 'Line quantity must be positive!'),
+ 'CHECK(quantity >= 0.0)', 'Line quantity must be positive'),
('check_line_minimal_qty',
'CHECK(quantity >= minimal_quantity)',
- 'Line quantity must be greater than the minimal quantity!'),
+ 'Line quantity must be greater than the minimal quantity'),
('forecast_product_uniq', 'UNIQUE(forecast, product)',
- 'Product must be unique by forcast!'),
+ 'Product must be unique by forecast'),
]
@staticmethod
@@ -407,13 +411,13 @@ class ForecastLine(ModelSQL, ModelView):
unit_price = Uom.compute_price(self.product.default_uom,
unit_price, self.uom)
- moves = []
+ to_create = []
for day, qty in distribution.iteritems():
if qty == 0.0:
continue
- move = Move.create({
- 'from_location': \
- self.forecast.warehouse.storage_location.id,
+ to_create.append({
+ 'from_location': (
+ self.forecast.warehouse.storage_location.id),
'to_location': self.forecast.destination.id,
'product': self.product.id,
'uom': self.uom.id,
@@ -424,7 +428,9 @@ class ForecastLine(ModelSQL, ModelView):
'currency': self.forecast.company.currency.id,
'unit_price': unit_price,
})
- moves.append(move)
+ moves = []
+ if to_create:
+ moves = Move.create(to_create)
self.write([self], {'moves': [('set', [m.id for m in moves])]})
@classmethod
@@ -490,13 +496,13 @@ class ForecastComplete(Wizard):
__name__ = 'stock.forecast.complete'
start_state = 'ask'
ask = StateView('stock.forecast.complete.ask',
- 'stock_forecast.forecast_comlete_ask_view_form', [
+ 'stock_forecast.forecast_complete_ask_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Choose Products', 'choose', 'tryton-go-next'),
Button('Complete', 'complete', 'tryton-ok', default=True),
])
choose = StateView('stock.forecast.complete.choose',
- 'stock_forecast.forecast_comlete_choose_view_form', [
+ 'stock_forecast.forecast_complete_choose_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Choose Dates', 'ask', 'tryton-go-previous'),
Button('Complete', 'complete', 'tryton-ok', default=True),
@@ -507,8 +513,8 @@ class ForecastComplete(Wizard):
def __setup__(cls):
super(ForecastComplete, cls).__setup__()
cls._error_messages.update({
- 'from_to_date': '"From Date" should be smaller than "To Date"!',
- })
+ 'from_to_date': '"From Date" should be smaller than "To Date".',
+ })
def default_ask(self, fields):
"""
@@ -542,7 +548,7 @@ class ForecastComplete(Wizard):
Collect products for which there is an outgoing stream between
the given location and the destination.
"""
- if self.choose.products:
+ if getattr(self.choose, 'products', None):
return {'products': [x.id for x in self.choose.products]}
pbl = self._get_product_quantity()
products = []
@@ -569,11 +575,12 @@ class ForecastComplete(Wizard):
for product in Product.browse(product_ids):
prod2uom[product.id] = product.default_uom.id
- if self.choose.products:
+ if getattr(self.choose, 'products', None):
products = [x.id for x in self.choose.products]
else:
products = None
+ to_create = []
for key, qty in pbl.iteritems():
_, product = key
if products and product not in products:
@@ -589,11 +596,13 @@ class ForecastComplete(Wizard):
'minimal_quantity': min(1, -qty),
})
else:
- ForecastLine.create({
+ to_create.append({
'product': product,
'quantity': -qty,
'uom': prod2uom[product],
'forecast': Transaction().context['active_id'],
'minimal_quantity': min(1, -qty),
})
+ if to_create:
+ ForecastLine.create(to_create)
return 'end'
diff --git a/forecast.xml b/forecast.xml
index 427debd..18546ff 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -26,54 +26,12 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.ui.view" id="forecast_view_form">
<field name="model">stock.forecast</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Forecast" col="4">
- <label name="warehouse"/>
- <field name="warehouse"/>
- <label name="destination"/>
- <field name="destination"/>
- <label name="from_date"/>
- <field name="from_date"/>
- <label name="to_date"/>
- <field name="to_date"/>
- <label name="company"/>
- <field name="company"/>
- <button string="Complete Forecast" name="complete"
- colspan="2"
- help="Add forecast line based on past data."/>
- <field name="lines" colspan="4"/>
- <group col="4" colspan="4" id="state_buttons">
- <label name="state"/>
- <field name="state"/>
- <group colspan="2" col="3" id="buttons">
- <button string="Reset to Draft" name="draft"
- icon="tryton-clear"/>
- <button string="Cancel" name="cancel"
- icon="tryton-cancel"/>
- <button string="Confirm" name="confirm"
- icon="tryton-ok"/>
- </group>
- </group>
- </form>
- ]]>
- </field>
+ <field name="name">forecast_form</field>
</record>
<record model="ir.ui.view" id="forecast_view_tree">
<field name="model">stock.forecast</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Forecasts">
- <field name="warehouse"/>
- <field name="state"/>
- <field name="from_date"/>
- <field name="to_date"/>
- <field name="company"/>
- <field name="create_date" tree_invisible="1"/>
- </tree>
- ]]>
- </field>
+ <field name="name">forecast_tree</field>
</record>
<record model="ir.action.act_window" id="act_forecast_form">
<field name="name">Forecasts</field>
@@ -92,99 +50,43 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="forecast_view_form"/>
<field name="act_window" ref="act_forecast_form"/>
</record>
- <menuitem parent="stock.menu_stock" sequence="50"
- action="act_forecast_form" id="menu_forecast_form"/>
-
- <record model="ir.action.act_window" id="act_forecast_form_draft">
- <field name="name">Draft Forecasts</field>
- <field name="res_model">stock.forecast</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_forecast_form_draft_view1">
+ <record model="ir.action.act_window.domain" id="act_forecast_form_domain_all">
+ <field name="name">All</field>
<field name="sequence" eval="10"/>
- <field name="view" ref="forecast_view_tree"/>
- <field name="act_window" ref="act_forecast_form_draft"/>
+ <field name="domain"></field>
+ <field name="act_window" ref="act_forecast_form"/>
</record>
- <record model="ir.action.act_window.view"
- id="act_forecast_form_draft_view2">
+ <record model="ir.action.act_window.domain" id="act_forecast_form_domain_draft">
+ <field name="name">Draft</field>
<field name="sequence" eval="20"/>
- <field name="view" ref="forecast_view_form"/>
- <field name="act_window" ref="act_forecast_form_draft"/>
+ <field name="domain">[('state', '=', 'draft')]</field>
+ <field name="act_window" ref="act_forecast_form"/>
</record>
- <menuitem parent="menu_forecast_form"
- action="act_forecast_form_draft" id="menu_forecast_form_draft"
- sequence="20"/>
+ <menuitem parent="stock.menu_stock" sequence="50"
+ action="act_forecast_form" id="menu_forecast_form"/>
<record model="ir.ui.view" id="forecast_line_view_form">
<field name="model">stock.forecast.line</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Forecast Line" col="4">
- <label name="forecast"/>
- <field name="forecast"/>
- <newline/>
- <label name="product"/>
- <field name="product"/>
- <label name="quantity"/>
- <field name="quantity"/>
- <label name="minimal_quantity"/>
- <field name="minimal_quantity"/>
- <label name="uom"/>
- <field name="uom"/>
- <label name="quantity_executed"/>
- <field name="quantity_executed"/>
- <field name="moves" colspan="4"/>
- <field name="unit_digits" invisible="1" colspan="4"/>
- </form>
- ]]>
- </field>
+ <field name="name">forecast_line_form</field>
</record>
<record model="ir.ui.view" id="forecast_line_view_tree">
<field name="model">stock.forecast.line</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Forecast Lines" editable="bottom">
- <field name="product"/>
- <field name="quantity"/>
- <field name="minimal_quantity"/>
- <field name="uom"/>
- <field name="quantity_executed"/>
- <field name="forecast"/>
- <field name="unit_digits" tree_invisible="1"/>
- </tree>
- ]]>
- </field>
+ <field name="name">forecast_line_tree</field>
</record>
- <record model="ir.ui.view" id="forecast_comlete_ask_view_form">
+ <record model="ir.ui.view" id="forecast_complete_ask_view_form">
<field name="model">stock.forecast.complete.ask</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Choose dates">
- <label name="from_date"/>
- <field name="from_date"/>
- <label name="to_date"/>
- <field name="to_date"/>
- </form>
- ]]>
- </field>
- </record>
- <record model="ir.ui.view" id="forecast_comlete_choose_view_form">
+ <field name="name">forecast_complete_ask_form</field>
+ </record>
+ <record model="ir.ui.view" id="forecast_complete_choose_view_form">
<field name="model">stock.forecast.complete.choose</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Choose products" col="1" >
- <field name="products"/>
- </form>
- ]]>
- </field>
+ <field name="name">forecast_complete_choose_form</field>
</record>
-
<record model="ir.model.access" id="access_forecast">
<field name="model" search="[('model', '=', 'stock.forecast')]"/>
<field name="perm_read" eval="True"/>
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 06f50ae..a765728 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -3,35 +3,34 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "Стойността на \"От дата\" трябва да е по-малка от тази на \"До дата\"!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "Количество на ред трябва да е по-голямо от минималното количество!"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "Количеството на реда трябва да е положително число!"
+msgid "Line quantity must be positive"
+msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "Продукта трябва да уникален по прогноза!"
+msgid "Product must be unique by forecast"
+msgstr ""
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "Стойността на \"До дата\" трябва да е по-голяма от тази на \"От дата\"!"
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr ""
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "Преди да бъде изтрита прогноза \"%s\" трябва да бъде прекратена!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
+msgstr ""
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+msgid "Forecast \"%s\" must be cancelled before deletion."
msgstr ""
-"Не може да създавате прогнози за еднао и също местонахиждение за "
-"припокриващи се периоди"
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -201,22 +200,24 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Прогнози"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Проект на прогноза"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Изготвяне на прогноза"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Прогнози"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Проект на прогноза"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Прогноза за наличност"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 9efc519..02a8de7 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -3,35 +3,36 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "«Des de la data» ha de ser anterior a «Fins a la data»"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "\"Desde de la data\" ha de ser més petit que \"Fins a la data\"."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La quantitat de la línia ha de ser major que la quantitat mínima"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "La quantitat de la línia ha de ser superior a la quantitat mínima."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "La quantitat de la línia ha de ser positiva"
+msgid "Line quantity must be positive"
+msgstr "La quantitat de la línia ha de ser positiva."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "El producte ha de ser únic per previsió"
+msgid "Product must be unique by forecast"
+msgstr "El producte ha de ser únic en la previssió d'estocs."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "«Fins a la data» ha de ser més recent que «Des de la data»"
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "\"Fins a la data\" ha de ser més gran que \"Desde de la data\"."
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"No pot crear previsions per a les mateixes ubicacions amb dates solapadas."
+"La previsó \"%(first)s\" es solapa amb les dates de la pervisió "
+"\"%(second)s\" a la mateixa ubicació."
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
-msgstr ""
-"No pot crear previsions per les mateixes ubicacions amb dates solapades"
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "Heu de cancel·lar la previsió \"%s\" abans de ser eliminat."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -201,22 +202,23 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Previsió"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsions en esborrany"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Previsió completa"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Tots"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Previsions"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsions en esborrany"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Previsió d'existències"
@@ -295,7 +297,7 @@ msgstr "Previsions"
msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
-msgstr "Restablir a esborrany"
+msgstr "Restaura a esborrany"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 0d23869..fa3243a 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -3,32 +3,33 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
+msgid "Line quantity must be greater than the minimal quantity"
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
+msgid "Line quantity must be positive"
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
+msgid "Product must be unique by forecast"
msgstr ""
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
+msgid "\"To Date\" must be greater than \"From Date\""
msgstr ""
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+msgid "Forecast \"%s\" must be cancelled before deletion."
msgstr ""
msgctxt "field:stock.forecast,company:"
@@ -199,20 +200,21 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr ""
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr ""
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr ""
-msgctxt "model:ir.ui.menu,name:menu_forecast_form"
-msgid "Forecasts"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
msgstr ""
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
msgstr ""
msgctxt "model:res.group,name:group_stock_forecast"
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 3586cb0..1e6bae3 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3,37 +3,38 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "\"Von Datum\" muss kleiner als \"Bis Datum\" sein!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "\"Von Datum\" sollte vor \"Bis Datum\" liegen."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "Anzahl der Position muss größer als die Minimalanzahl sein!"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "Anzahl auf der Zeile muss größer als Minimalanzahl sein."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "Anzahl der Position muss positiv sein!"
+msgid "Line quantity must be positive"
+msgstr "Anzahl auf der Zeile muss einen positiven Wert aufweisen."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!"
+msgid "Product must be unique by forecast"
+msgstr "Ein Artikel kann nur einmal pro Bedarfsermittlung eingetragen werden."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "\"Bis Datum\" muss größer sein als \"Von Datum\""
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "\"Bis Datum\" muss größer als \"Von Datum\" sein."
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"Bedarfsermittlung \"%s\" muss annulliert werden, bevor sie gelöscht werden "
-"kann."
+"Bedarfsermittlung \"%(first)s\" überschneidet sich mit den Datumsangaben von"
+" Bedarfsermittlung \"%(second)s\" bezogen auf denselben Lagerort."
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+msgid "Forecast \"%s\" must be cancelled before deletion."
msgstr ""
-"Bei Bedarfsermittlungen für den selben Lagerort darf sich das Datum nicht "
-"überschneiden!"
+"Bedarfsermittlung \"%s\" muss annulliert werden, bevor sie gelöscht werden "
+"kann."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -203,22 +204,23 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Bedarfsermittlung"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Entwürfe Bedarfsermittlung"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
-msgstr "Bedarfsermittlung durchführen"
+msgstr "Bedarfsermittlung Durchführen Nachfrage"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Bedarfsermittlung"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Entwürfe Bedarfsermittlung"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Lager Bedarfsermittlung"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 87fde37..a8295a9 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -3,34 +3,36 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "¡«Desde la fecha» debe ser anterior a «Hasta la fecha»!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "«Desde la fecha» debe ser más pequeña que «Hasta la fecha»."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "¡La línea cantidad debe ser mayor que la cantidad mínima!"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "La cantidad de la línea debe ser más grande que la cantidad mínima."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "¡La cantidad de la línea debe ser positiva!"
+msgid "Line quantity must be positive"
+msgstr "La cantidad de la línea debe ser positiva."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "¡El producto debe ser único por previsión!"
+msgid "Product must be unique by forecast"
+msgstr "El producto debe ser único en la previsión de existencias."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "¡«Hasta la fecha» debe ser más reciente que «Desde la fecha»!"
-
-msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "¡Previsión «%s» debe ser cancelada antes de la eliminación!"
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "«Hasta la fecha» debe ser más grande que «Desde la fecha»."
msgctxt "error:stock.forecast:"
msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"No puede crear previsiones para las mísmas ubicaciones con fechas solapadas"
+"La previsión «%(first)s» se solpa con las fechas de la previsión "
+"«%(second)s» en la misma ubicación."
+
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la previsión «%s» antes de eliminar."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -142,7 +144,7 @@ msgstr "Cantidad"
msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr "Cantidad Ejecutada"
+msgstr "Cantidades ejecutadas"
msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
@@ -150,7 +152,7 @@ msgstr "Nombre"
msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
-msgstr "Decimales de la unidad"
+msgstr "Dígitos de unidad"
msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
@@ -200,22 +202,23 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Previsión"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsiones en borrador"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Previsión completa"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Previsiones"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsiones en borrador"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Previsión de existencias"
@@ -238,7 +241,7 @@ msgstr "Línea de previsión de existencias"
msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
-msgstr "LineaPrevisión - Movimiento"
+msgstr "Linea de previsión - Movimiento"
msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
@@ -246,7 +249,7 @@ msgstr "Cancelar"
msgctxt "selection:stock.forecast,state:"
msgid "Done"
-msgstr "Terminada"
+msgstr "Realizada"
msgctxt "selection:stock.forecast,state:"
msgid "Draft"
@@ -254,11 +257,11 @@ msgstr "Borrador"
msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
-msgstr "Elegir fechas"
+msgstr "Seleccione fechas"
msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
-msgstr "Elegir productos"
+msgstr "Seleccione productos"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
@@ -298,11 +301,11 @@ msgstr "Restablecer a borrador"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr "Elegir Productos"
+msgstr "Seleccione productos"
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Completo"
+msgstr "Completa"
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
@@ -310,11 +313,11 @@ msgstr "Cancelar"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Elegir Fechas"
+msgstr "Seleccione fechas"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
-msgstr "Completo"
+msgstr "Completa"
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index e6b7251..eabdadd 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -3,35 +3,36 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "¡\"Desde la Fecha\" debería ser menor que \"A la Fecha\"!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "\"Desde la Fecha\" debería ser menor que \"A la Fecha\"!"
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "¡La cantidad por línea debe ser mayor que la mínima cantidad!"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "La cantidad por línea debe ser mayor que la mínima cantidad!"
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "La línea de cantidad debe ser positiva!"
+msgid "Line quantity must be positive"
+msgstr "La cantidad en la línea debe ser positiva."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
+msgid "Product must be unique by forecast"
msgstr "¡El producto debe ser único por proyección!"
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
+msgid "\"To Date\" must be greater than \"From Date\""
msgstr "\"Hasta la Fecha\" debe ser mayor que \"Desde la Fecha\""
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "¡La proyección \"%s\" debe ser cancelada antes de su eliminación!"
-
-msgctxt "error:stock.forecast:"
msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"No puede crear proyecciones para la misma localización con fechas "
-"sobrepuestas"
+"La proyección \"%s(first)s\" se solapa con las fechas de la proyección "
+"\"%(second)s\" en la misma bodega."
+
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "La proyección \"%s\" debe ser cancelada antes de su eliminación."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -75,7 +76,7 @@ msgstr "A la Fecha"
msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
-msgstr "Locación"
+msgstr "Bodega"
msgctxt "field:stock.forecast,write_date:"
msgid "Write Date"
@@ -201,41 +202,42 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Proyecciones"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Proyecciones en Borrador"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Proyección Completa"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Proyecciones"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Proyecciones en Borrador"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
-msgstr "Proyección de Almacén"
+msgstr "Proyección de Inventario"
msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
-msgstr "Proyección de Almacén"
+msgstr "Proyección de Inventario"
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
-msgstr "Pregunta Proyección Completa"
+msgstr "Proyección Completa"
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
-msgstr "Escojer Proyección Completa"
+msgstr "Proyección Completa"
msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
-msgstr "Línea de Proyección de Almacén"
+msgstr "Línea de Proyección de Inventario"
msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 6b5eba3..4190548 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -3,34 +3,36 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "\"Desde la fecha\" debe ser anterior a \"Hasta la fecha\"."
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "\"Desde la fecha\" debe ser más pequeña que \"Hasta la fecha\"."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La cantidad de la línea debe ser mayor que la cantidad mínima."
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "La cantidad de la línea debe ser más grande que la cantidad mínima."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
+msgid "Line quantity must be positive"
msgstr "La cantidad de la línea debe ser positiva."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "El producto debe ser único por previsión."
+msgid "Product must be unique by forecast"
+msgstr "El producto debe ser único en la previsión de stocks."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "\"Hasta la fecha\" debe ser más reciente que \"Desde la fecha\"."
-
-msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "La previsión \"%s\" debe ser cancelada antes de eliminarla."
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "\"Hasta la fecha\" debe ser más grande que \"Desde la fecha\"."
msgctxt "error:stock.forecast:"
msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"No puede crear previsiones para las mismas ubicaciones con fechas solapadas."
+"La previsión \"%(first)s\" se solpa con las fechas de la previsón "
+"%(second)s\" en la misma ubicación."
+
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la previsión \"%s\" antes de borrar."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -200,22 +202,23 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Previsiones"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsiones borrador"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Previsión completa"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Todos"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Previsiones"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Previsiones borrador"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Previsión de stock"
@@ -294,7 +297,7 @@ msgstr "Previsiones"
msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
-msgstr "Restablecer a borrador"
+msgstr "Restaurar a borrador"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 82c6b86..63df909 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -3,62 +3,37 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "\"De la date\" devrait être plus petit que \"À la date\" !"
-
-msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "\"De la date\" devrait être plus petit que \"À la date\" !"
-
-msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La quantité de la ligne doit être supérieure à la quantité minimale !"
-
-msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La quantité de la ligne doit être supérieure à la quantité minimale !"
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "La date de début doit être inférieure à la date de fin."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "Les quantités sur les lignes doivent être positives!"
-
-msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "Les quantités sur les lignes doivent être positives!"
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr ""
+"La quantité de la ligne doit être plus grande que la quantité minimale."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "Le produit doit être unique par prévision !"
+msgid "Line quantity must be positive"
+msgstr "La quantité de la ligne doit être positive."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr "Le produit doit être unique par prévision !"
-
-msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "\"À la date\" doit être plus grande que «De la date\" !"
+msgid "Product must be unique by forecast"
+msgstr "Le produit par prévision doit être unique."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "\"À la date\" doit être plus grande que «De la date\" !"
-
-msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "La prévision \"%s\" doit être annulée avant suppression"
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "La date de fin doit être supérieure à la date de début."
msgctxt "error:stock.forecast:"
msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
-"Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des"
-" dates qui se chevauchent"
+"Les dates de la prévision \"%(first)s\" chevauchent celles de "
+"\"%(second)s\" pour le même emplacement."
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
-msgstr ""
-"Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des"
-" dates qui se chevauchent"
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "La prévision \"%s\" doit être anullée pour pouvoir être supprimée."
msgctxt "field:stock.forecast,company:"
msgid "Company"
@@ -228,22 +203,23 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Prévisions"
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Prévisions en brouillon"
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr "Completer les prévisions"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
msgstr "Prévisions"
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr "Prévisions en brouillon"
-
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Stock prévisionnel"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 8f8a212..5490c28 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -3,32 +3,33 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgid "\"From Date\" should be smaller than \"To Date\"."
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
+msgid "Line quantity must be greater than the minimal quantity"
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
+msgid "Line quantity must be positive"
msgstr ""
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
+msgid "Product must be unique by forecast"
msgstr ""
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
+msgid "\"To Date\" must be greater than \"From Date\""
msgstr ""
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
+msgid "Forecast \"%s\" must be cancelled before deletion."
msgstr ""
#, fuzzy
@@ -215,20 +216,22 @@ msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr ""
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr ""
-
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
msgstr ""
-msgctxt "model:ir.ui.menu,name:menu_forecast_form"
-msgid "Forecasts"
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
msgstr ""
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
msgstr ""
msgctxt "model:res.group,name:group_stock_forecast"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index d69ec73..72d0750 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -3,341 +3,322 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
-msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr ""
+msgid "\"From Date\" should be smaller than \"To Date\"."
+msgstr "\"Начальная дата\" должна быть меньше \"Конечной даты\"."
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be greater than the minimal quantity!"
-msgstr ""
+msgid "Line quantity must be greater than the minimal quantity"
+msgstr "Кол-во в строке должно быть больше чем минимальное кол-во."
-#, fuzzy
msgctxt "error:stock.forecast.line:"
-msgid "Line quantity must be positive!"
-msgstr "Кол-во должно быть положительным"
+msgid "Line quantity must be positive"
+msgstr "Кол-во в строке должно быть положительным."
msgctxt "error:stock.forecast.line:"
-msgid "Product must be unique by forcast!"
-msgstr ""
+msgid "Product must be unique by forecast"
+msgstr "Продукт должен быть уникальным в пределах прогноза."
msgctxt "error:stock.forecast:"
-msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr ""
+msgid "\"To Date\" must be greater than \"From Date\""
+msgstr "\"Конечная дата\" должна быть больше чем \"Начальная дата\""
msgctxt "error:stock.forecast:"
-msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgid ""
+"Forecast \"%(first)s\" overlaps with dates of forecast \"%(second)s\" in the"
+" same location."
msgstr ""
+"Прогноз \"%(first)s\" пересекается в датах с прогнозом \"%(second)s\" в "
+"одинаковом местоположении."
msgctxt "error:stock.forecast:"
-msgid ""
-"You can not create forecasts for the same locations with overlapping dates"
-msgstr ""
+msgid "Forecast \"%s\" must be cancelled before deletion."
+msgstr "Прогноз \"%s\" должен быть отменен перед удалением."
-#, fuzzy
msgctxt "field:stock.forecast,company:"
msgid "Company"
-msgstr "Учет.орг."
+msgstr "Организация"
msgctxt "field:stock.forecast,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:stock.forecast,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:stock.forecast,destination:"
msgid "Destination"
-msgstr ""
+msgstr "Назначение"
msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
-msgstr ""
+msgstr "Начальная дата"
msgctxt "field:stock.forecast,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Строки"
-#, fuzzy
msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Наименование"
-#, fuzzy
msgctxt "field:stock.forecast,state:"
msgid "State"
-msgstr "Статус"
+msgstr "Состояние"
msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
-msgstr ""
+msgstr "Конечная дата"
-#, fuzzy
msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Местоположение"
msgctxt "field:stock.forecast,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:stock.forecast,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
-msgstr ""
+msgstr "Начальная дата"
msgctxt "field:stock.forecast.complete.ask,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
-msgstr ""
+msgstr "Конечная дата"
msgctxt "field:stock.forecast.complete.choose,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
-msgstr "ТМЦ"
+msgstr "Продукция"
msgctxt "field:stock.forecast.line,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:stock.forecast.line,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
-msgstr ""
+msgstr "Прогноз"
msgctxt "field:stock.forecast.line,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
-msgstr ""
+msgstr "Минимальное кол-во"
-#, fuzzy
msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Перемещения"
-#, fuzzy
msgctxt "field:stock.forecast.line,product:"
msgid "Product"
-msgstr "Товарно материальные ценности (ТМЦ)"
+msgstr "Продукт"
msgctxt "field:stock.forecast.line,product_uom_category:"
msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория ед. измерения продукции"
-#, fuzzy
msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Кол-во"
msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr ""
+msgstr "Кол-во выполнено"
-#, fuzzy
msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Наименование"
-#, fuzzy
msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
-msgstr "Группа цифр"
+msgstr "Кол-во цифр после запятой"
-#, fuzzy
msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "Ед.изм."
msgctxt "field:stock.forecast.line,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:stock.forecast.line,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:stock.forecast.line-stock.move,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:stock.forecast.line-stock.move,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:stock.forecast.line-stock.move,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
-msgstr ""
+msgstr "Строка прогноза"
-#, fuzzy
msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Перемещение"
-#, fuzzy
msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Наименование"
msgctxt "field:stock.forecast.line-stock.move,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:stock.forecast.line-stock.move,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr ""
+msgstr "Прогнозы"
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
-msgstr ""
+msgstr "Завершить прогноз"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Все"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Черновик"
msgctxt "model:ir.ui.menu,name:menu_forecast_form"
msgid "Forecasts"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
-msgid "Draft Forecasts"
-msgstr ""
+msgstr "Прогнозы"
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
-msgstr ""
+msgstr "Прогноз по складу"
msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
-msgstr ""
+msgstr "Прогноз по складу"
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
-msgstr ""
+msgstr "Завершить прогноз"
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
-msgstr ""
+msgstr "Завершить прогноз"
msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
-msgstr ""
+msgstr "Строка прогноза по складу"
msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
-msgstr ""
+msgstr "Строка прогноза - Перемещение"
-#, fuzzy
msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Отменить"
-#, fuzzy
msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Выполнено"
-#, fuzzy
msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Черновик"
msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
-msgstr ""
+msgstr "Выбрать даты"
msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
-msgstr ""
+msgstr "Выбрать продукты"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
-msgstr ""
+msgstr "Строка прогноза"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
-msgstr ""
+msgstr "Строки прогноза"
msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
-msgstr ""
+msgstr "Добавить строчку прогноза основанного на предыдущих данных."
-#, fuzzy
msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Отменить"
msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
-msgstr ""
+msgstr "Завершить прогноз"
-#, fuzzy
msgctxt "view:stock.forecast:"
msgid "Confirm"
-msgstr "Подтверждать"
+msgstr "Подтвердить"
msgctxt "view:stock.forecast:"
msgid "Forecast"
-msgstr ""
+msgstr "Прогноз"
msgctxt "view:stock.forecast:"
msgid "Forecasts"
-msgstr ""
+msgstr "Прогнозы"
-#, fuzzy
msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
-msgstr "Сброс в черновики"
+msgstr "Сброс в черновик"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr ""
+msgstr "Выбрать продукты"
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr ""
+msgstr "Завершить"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
msgstr "Отменить"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr ""
+msgstr "Выбрать даты"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
-msgstr ""
+msgstr "Завершить"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Отменить"
diff --git a/setup.py b/setup.py
index 67dc643..e4be1e7 100644
--- a/setup.py
+++ b/setup.py
@@ -25,10 +25,10 @@ requires = ['python-dateutil']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
- (dep, major_version, minor_version, major_version,
- minor_version + 1))
+ (dep, major_version, minor_version, major_version,
+ minor_version + 1))
requires.append('trytond >= %s.%s, < %s.%s' %
- (major_version, minor_version, major_version, minor_version + 1))
+ (major_version, minor_version, major_version, minor_version + 1))
setup(name='trytond_stock_forecast',
version=info.get('version', '0.0.1'),
@@ -36,14 +36,16 @@ setup(name='trytond_stock_forecast',
long_description=read('README'),
author='Tryton',
url='http://www.tryton.org/',
+ download_url=("http://downloads.tryton.org/" +
+ info.get('version', '0.0.1').rsplit('.', 1)[0] + '/'),
package_dir={'trytond.modules.stock_forecast': '.'},
packages=[
'trytond.modules.stock_forecast',
'trytond.modules.stock_forecast.tests',
],
package_data={
- 'trytond.modules.stock_forecast': info.get('xml', []) \
- + ['tryton.cfg', 'locale/*.po'],
+ 'trytond.modules.stock_forecast': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
},
classifiers=[
'Development Status :: 5 - Production/Stable',
@@ -55,6 +57,7 @@ setup(name='trytond_stock_forecast',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
'Natural Language :: Czech',
'Natural Language :: Dutch',
'Natural Language :: English',
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index f3d88c7..173c55f 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -28,6 +28,7 @@ class StockForecastTestCase(unittest.TestCase):
trytond.tests.test_tryton.install_module('stock_forecast')
self.category = POOL.get('product.category')
self.uom = POOL.get('product.uom')
+ self.template = POOL.get('product.template')
self.product = POOL.get('product.product')
self.location = POOL.get('stock.location')
self.company = POOL.get('company.company')
@@ -66,23 +67,26 @@ class StockForecastTestCase(unittest.TestCase):
Test create_moves.
'''
with Transaction().start(DB_NAME, USER, context=CONTEXT):
- category = self.category.create({
- 'name': 'Test create_moves',
- })
+ category, = self.category.create([{
+ 'name': 'Test create_moves',
+ }])
unit, = self.uom.search([('name', '=', 'Unit')])
- product = self.product.create({
- 'name': 'Test create_moves',
- 'type': 'goods',
- 'category': category.id,
- 'cost_price_method': 'fixed',
- 'default_uom': unit.id,
- 'list_price': Decimal('1'),
- 'cost_price': Decimal(0),
- })
+ template, = self.template.create([{
+ 'name': 'Test create_moves',
+ 'type': 'goods',
+ 'category': category.id,
+ 'cost_price_method': 'fixed',
+ 'default_uom': unit.id,
+ 'list_price': Decimal('1'),
+ 'cost_price': Decimal(0),
+ }])
+ product, = self.product.create([{
+ 'template': template.id,
+ }])
customer, = self.location.search([('code', '=', 'CUS')])
warehouse, = self.location.search([('code', '=', 'WH')])
storage, = self.location.search([('code', '=', 'STO')])
- company, = self.company.search([('name', '=', 'B2CK')])
+ company, = self.company.search([('rec_name', '=', 'B2CK')])
self.user.write([self.user(USER)], {
'main_company': company.id,
'company': company.id,
@@ -90,22 +94,22 @@ class StockForecastTestCase(unittest.TestCase):
today = datetime.date.today()
- forecast = self.forecast.create({
- 'warehouse': warehouse.id,
- 'destination': customer.id,
- 'from_date': today + relativedelta(months=1, day=1),
- 'to_date': today + relativedelta(months=1, day=20),
- 'company': company.id,
- 'lines': [
- ('create', {
- 'product': product.id,
- 'quantity': 10,
- 'uom': unit.id,
- 'minimal_quantity': 2,
- },
- ),
- ],
- })
+ forecast, = self.forecast.create([{
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
+ 'from_date': today + relativedelta(months=1, day=1),
+ 'to_date': today + relativedelta(months=1, day=20),
+ 'company': company.id,
+ 'lines': [
+ ('create', [{
+ 'product': product.id,
+ 'quantity': 10,
+ 'uom': unit.id,
+ 'minimal_quantity': 2,
+ }],
+ ),
+ ],
+ }])
self.forecast.confirm([forecast])
self.forecast.create_moves([forecast])
@@ -118,17 +122,17 @@ class StockForecastTestCase(unittest.TestCase):
line, = forecast.lines
self.assertEqual(len(line.moves), 0)
- self.move.create({
- 'from_location': storage.id,
- 'to_location': customer.id,
- 'product': product.id,
- 'uom': unit.id,
- 'quantity': 2,
- 'planned_date': today + relativedelta(months=1, day=5),
- 'company': company.id,
- 'currency': company.currency.id,
- 'unit_price': Decimal('1'),
- })
+ self.move.create([{
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 2,
+ 'planned_date': today + relativedelta(months=1, day=5),
+ 'company': company.id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ }])
line, = forecast.lines
self.assertEqual(line.quantity_executed, 2)
diff --git a/tryton.cfg b/tryton.cfg
index ab31c67..b851483 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.6.0
+version=2.8.0
depends:
company
ir
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 47f48f2..59aeb43 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,11 +1,12 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond-stock-forecast
-Version: 2.6.0
+Version: 2.8.0
Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
+Download-URL: http://downloads.tryton.org/2.8/
Description: trytond_stock_forecast
=====================
@@ -52,6 +53,7 @@ Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index 4258d5d..f1b3aa3 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -28,4 +28,10 @@ trytond_stock_forecast.egg-info/dependency_links.txt
trytond_stock_forecast.egg-info/entry_points.txt
trytond_stock_forecast.egg-info/not-zip-safe
trytond_stock_forecast.egg-info/requires.txt
-trytond_stock_forecast.egg-info/top_level.txt
\ No newline at end of file
+trytond_stock_forecast.egg-info/top_level.txt
+view/forecast_complete_ask_form.xml
+view/forecast_complete_choose_form.xml
+view/forecast_form.xml
+view/forecast_line_form.xml
+view/forecast_line_tree.xml
+view/forecast_tree.xml
\ No newline at end of file
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 5142b61..e88d788 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_company >= 2.6, < 2.7
-trytond_product >= 2.6, < 2.7
-trytond_stock >= 2.6, < 2.7
-trytond >= 2.6, < 2.7
\ No newline at end of file
+trytond_company >= 2.8, < 2.9
+trytond_product >= 2.8, < 2.9
+trytond_stock >= 2.8, < 2.9
+trytond >= 2.8, < 2.9
\ No newline at end of file
diff --git a/view/forecast_complete_ask_form.xml b/view/forecast_complete_ask_form.xml
new file mode 100644
index 0000000..a279412
--- /dev/null
+++ b/view/forecast_complete_ask_form.xml
@@ -0,0 +1,9 @@
+<?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="Choose dates">
+ <label name="from_date"/>
+ <field name="from_date"/>
+ <label name="to_date"/>
+ <field name="to_date"/>
+</form>
diff --git a/view/forecast_complete_choose_form.xml b/view/forecast_complete_choose_form.xml
new file mode 100644
index 0000000..fbbc4ab
--- /dev/null
+++ b/view/forecast_complete_choose_form.xml
@@ -0,0 +1,6 @@
+<?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="Choose products" col="1" >
+ <field name="products"/>
+</form>
diff --git a/view/forecast_form.xml b/view/forecast_form.xml
new file mode 100644
index 0000000..dc93220
--- /dev/null
+++ b/view/forecast_form.xml
@@ -0,0 +1,28 @@
+<?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="Forecast" col="4">
+ <label name="warehouse"/>
+ <field name="warehouse"/>
+ <label name="destination"/>
+ <field name="destination"/>
+ <label name="from_date"/>
+ <field name="from_date"/>
+ <label name="to_date"/>
+ <field name="to_date"/>
+ <label name="company"/>
+ <field name="company"/>
+ <button string="Complete Forecast" name="complete"
+ colspan="2"
+ help="Add forecast line based on past data."/>
+ <field name="lines" colspan="4"/>
+ <group col="4" colspan="4" id="state_buttons">
+ <label name="state"/>
+ <field name="state"/>
+ <group colspan="2" col="3" id="buttons">
+ <button string="Reset to Draft" name="draft" icon="tryton-clear"/>
+ <button string="Cancel" name="cancel" icon="tryton-cancel"/>
+ <button string="Confirm" name="confirm" icon="tryton-ok"/>
+ </group>
+ </group>
+</form>
diff --git a/view/forecast_line_form.xml b/view/forecast_line_form.xml
new file mode 100644
index 0000000..97f1bad
--- /dev/null
+++ b/view/forecast_line_form.xml
@@ -0,0 +1,20 @@
+<?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="Forecast Line" col="4">
+ <label name="forecast"/>
+ <field name="forecast"/>
+ <newline/>
+ <label name="product"/>
+ <field name="product"/>
+ <label name="quantity"/>
+ <field name="quantity"/>
+ <label name="minimal_quantity"/>
+ <field name="minimal_quantity"/>
+ <label name="uom"/>
+ <field name="uom"/>
+ <label name="quantity_executed"/>
+ <field name="quantity_executed"/>
+ <field name="moves" colspan="4"/>
+ <field name="unit_digits" invisible="1" colspan="4"/>
+</form>
diff --git a/view/forecast_line_tree.xml b/view/forecast_line_tree.xml
new file mode 100644
index 0000000..af44429
--- /dev/null
+++ b/view/forecast_line_tree.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. -->
+<tree string="Forecast Lines" editable="bottom">
+ <field name="product"/>
+ <field name="quantity"/>
+ <field name="minimal_quantity"/>
+ <field name="uom"/>
+ <field name="quantity_executed"/>
+ <field name="forecast"/>
+ <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/forecast_tree.xml b/view/forecast_tree.xml
new file mode 100644
index 0000000..39b1277
--- /dev/null
+++ b/view/forecast_tree.xml
@@ -0,0 +1,11 @@
+<?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="Forecasts">
+ <field name="warehouse"/>
+ <field name="state"/>
+ <field name="from_date"/>
+ <field name="to_date"/>
+ <field name="company"/>
+ <field name="create_date" tree_invisible="1"/>
+</tree>
commit 7cc33b7b0ff7a4b1018fd21575769c0f5b9bb96b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Oct 23 19:53:58 2012 +0200
Adding upstream version 2.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index 5343c81..120e31b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
Version 2.4.0 - 2012-04-24
* Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 32879df..97a9596 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,6 +4,7 @@ include TODO
include COPYRIGHT
include CHANGELOG
include LICENSE
+include tryton.cfg
include *.xml
include *.odt
include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 365d97f..f60862b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,19 +1,47 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 2.4.0
-Summary: Provide the "Forecast" model in Inventory Management.
-The Forecast form allow to define the expected stock movement towards
-customers in any period of time in the future. A wizard allow to
-compute the expected quantities with respect to a period in the
-past. Once the form confirmed, the corresponding moves are created and
-spread homogeneously across the period. Those moves will allow other
-process to take forecasts into account.
-
+Version: 2.6.0
+Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
License: GPL-3
-Description: UNKNOWN
+Description: trytond_stock_forecast
+ =====================
+
+ The stock_forecast module of the Tryton application platform.
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
diff --git a/README b/README
index 9a2018b..09525d9 100644
--- a/README
+++ b/README
@@ -2,7 +2,6 @@ trytond_stock_forecast
=====================
The stock_forecast module of the Tryton application platform.
-See __tryton__.py
Installing
----------
diff --git a/__init__.py b/__init__.py
index 0be3aee..545bad1 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,4 +1,18 @@
#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 Pool
from .forecast import *
+
+
+def register():
+ Pool.register(
+ Forecast,
+ ForecastLine,
+ ForecastLineMove,
+ ForecastCompleteAsk,
+ ForecastCompleteChoose,
+ module='stock_forecast', type_='model')
+ Pool.register(
+ ForecastComplete,
+ module='stock_forecast', type_='wizard')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index b563ee0..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,108 +0,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.
-{
- 'name': 'Stock Forecast',
- 'name_bg_BG': 'Прогнозиране на наличност',
- 'name_ca_ES': 'Previsió d''estocs',
- 'name_de_DE': 'Lagerverwaltung Bedarfsermittlung',
- 'name_es_AR': 'Previsión de existencias',
- 'name_es_CO': 'Previsión de existencias',
- 'name_es_ES': 'Previsión de stock',
- 'name_fr_FR': 'Prévision de stock',
- 'version': '2.4.0',
- 'author': 'B2CK',
- 'email': 'info at b2ck.com',
- 'website': 'http://www.tryton.org/',
- 'description': '''Provide the "Forecast" model in Inventory Management.
-The Forecast form allow to define the expected stock movement towards
-customers in any period of time in the future. A wizard allow to
-compute the expected quantities with respect to a period in the
-past. Once the form confirmed, the corresponding moves are created and
-spread homogeneously across the period. Those moves will allow other
-process to take forecasts into account.
-''',
- 'description_bg_BG': '''Предоставя модел за "прогнозиране" при управление на инвентазирация
- - Формата за "Прогноза" позволява да се зададат очакваните движения на наличност
- към клиенти в бъдещ период. Помощник позволява да се изчислят очакваните
- количества отчитайки периоди в миналто. След потвърждаване на формата, съответните
- движения биват създадени и разпределени равномерно за периода. Тези движения
- позволяват на други процеси да вземат предвид тези прогнози.
-''',
- 'description_ca_ES': '''Proporciona el model de «Previsió» en la gestió d'inventaris.
-El formulari de previsió permet definir els moviments d'estoc previstos
-cap a clients en el futur. Un assistent permet calcular les quantitats previstes
-respecte a un període en el passat. Una vegada el formulari es confirma, els
-moviments corresponents es creen i es distribueixen homogèniament al llarg del
-període. Aquests moviments permetran a altres processos tenir en compte les
-previsions.
-''',
- 'description_de_DE': '''Bedarfsermittlung für die Lagerverwaltung
- - Fügt das Modell "Vorhersage" zur Lagerverwaltung hinzu.
- - Das Formular "Bedarfsermittlung" ermöglicht die Erstellung von zu
- erwartenden Lagerbewegungen zu Kunden in einem beliebigen Zeitraum in der
- Zukunft. Ein Wizard ermöglicht die Berechnung der zu erwartenden
- Bewegungen auf der Grundlage eines Zeitraumes in der Vergangenheit. Bei
- Bestätigung des Formulars werden die entsprechenden Lagerbewegungen
- erzeugt und über den entsprechenden Zeitraum gleichmässig verteilt. Diese
- Lagerbewegungen ermöglichen die Berücksichtigung von Vorhersagen in
- den anderen Prozessen der Lagerverwaltung.
-''',
- 'description_es_AR': '''Provee el modelo de «Previsión» en la gestión de
-inventarios.
-El formulario de previsión permite definir los movimientos de existencias
-planificados hacia los clientes en cualquier período de tiempo en el futuro.
-Un asistente permite calcular las cantidades esperadas respecto a un período
-en el pasado. Una vez el formulario se confirma, los movimientos
-correspondientes se crean y se distribuyen homogéneamente a lo largo del
-período. Dichos movimientos permitirá a otros procesos tener en cuenta las
-previsiones.
-''',
- 'description_es_CO': '''Provee el modelo de «Previsión» en la gestión de
-inventarios.
-El formulario de previsión permite definir los movimientos de existencias
-planificados hacia los clientes en cualquier período de tiempo en el futuro.
-Un asistente permite calcular las cantidades esperadas respecto a un período
-anterior. Cuando se confirma, los movimientos correspondientes se crean
-y se distribuyen homogeneamente en el período. Tales movimientos permitirá
-a otros procesos hacer previsiones.
-''',
- 'description_es_ES': '''Proporciona el modelo de «Previsión» en la gestión de inventarios.
-El formulario de previsión permite definir los movimientos de stock
-previstos hacia los clientes en cualquier período de tiempo en el futuro.
-Un asistente permite calcular las cantidades previstas respecto a un período
-en el pasado. Una vez el formulario se confirma, los movimientos
-correspondientes se crean y se distribuyen homogeneamente a lo largo del
-período. Dichos movimientos permitirá a otros procesos tener en cuenta las previsiones.
-''',
- 'description_fr_FR': '''Fournit le modèle "Prévision" dans la gestion des stocks.
-Le formulaire de prévision permet de définir les mouvements attendus
-vers les clients pour n'importe quelle période dans le futur. Un
-wizard permet de calculer les quantités attendues en fonction d'une
-période dans le passé. A la validation du formulaire, les mouvements
-correspondants sont créés et répartis sur la période donnée. Ces
-mouvement permettent aux autres processus de prendre en compte les
-prévisions.
-''',
- 'depends': [
- 'ir',
- 'res',
- 'stock',
- 'product',
- 'company',
- ],
- 'xml': [
- 'forecast.xml',
- ],
- 'translation': [
- 'locale/cs_CZ.po',
- 'locale/bg_BG.po',
- 'locale/ca_ES.po',
- 'locale/de_DE.po',
- 'locale/es_AR.po',
- 'locale/es_CO.po',
- 'locale/es_ES.po',
- 'locale/fr_FR.po',
- 'locale/nl_NL.po',
- 'locale/ru_RU.po',
- ],
-}
diff --git a/forecast.py b/forecast.py
index 32f4f94..e24d9dc 100644
--- a/forecast.py
+++ b/forecast.py
@@ -11,6 +11,9 @@ from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.tools import reduce_ids
+__all__ = ['Forecast', 'ForecastLine', 'ForecastLineMove',
+ 'ForecastCompleteAsk', 'ForecastCompleteChoose', 'ForecastComplete']
+
STATES = {
'readonly': Not(Equal(Eval('state'), 'draft')),
}
@@ -19,10 +22,8 @@ DEPENDS = ['state']
class Forecast(Workflow, ModelSQL, ModelView):
"Stock Forecast"
- _name = "stock.forecast"
- _description = __doc__
+ __name__ = "stock.forecast"
_rec_name = 'warehouse'
-
warehouse = fields.Many2One(
'stock.location', 'Location', required=True,
domain=[('type', '=', 'warehouse')], states={
@@ -53,31 +54,32 @@ class Forecast(Workflow, ModelSQL, ModelView):
('cancel', 'Cancel'),
], 'State', readonly=True, select=True)
- def __init__(self):
- super(Forecast, self).__init__()
- self._sql_constraints += [
+ @classmethod
+ def __setup__(cls):
+ super(Forecast, cls).__setup__()
+ cls._sql_constraints += [
('check_from_to_date',
'CHECK(to_date >= from_date)',
'"To Date" must be greater than "From Date"!'),
]
- self._constraints += [
+ cls._constraints += [
('check_date_overlap', 'date_overlap'),
]
- self._error_messages.update({
+ cls._error_messages.update({
'date_overlap': 'You can not create forecasts for the same ' \
'locations with overlapping dates',
'delete_cancel': 'Forecast "%s" must be cancelled before '\
'deletion!',
})
- self._order.insert(0, ('from_date', 'DESC'))
- self._order.insert(1, ('warehouse', 'ASC'))
- self._transitions |= set((
+ cls._order.insert(0, ('from_date', 'DESC'))
+ cls._order.insert(1, ('warehouse', 'ASC'))
+ cls._transitions |= set((
('draft', 'done'),
('draft', 'cancel'),
('done', 'draft'),
('cancel', 'draft'),
))
- self._buttons.update({
+ cls._buttons.update({
'cancel': {
'invisible': Eval('state') != 'draft',
},
@@ -87,20 +89,24 @@ class Forecast(Workflow, ModelSQL, ModelView):
'confirm': {
'invisible': Eval('state') != 'draft',
},
+ 'complete': {
+ 'readonly': Eval('state') != 'draft',
+ },
})
- def init(self, module_name):
- location_obj = Pool().get('stock.location')
+ @classmethod
+ def __register__(cls, module_name):
+ Location = Pool().get('stock.location')
cursor = Transaction().cursor
- table = TableHandler(cursor, self, module_name)
+ table = TableHandler(cursor, cls, module_name)
migrate_warehouse = (not table.column_exist('warehouse')
and table.column_exist('location'))
- super(Forecast, self).init(module_name)
+ super(Forecast, cls).__register__(module_name)
# Add index on create_date
- table = TableHandler(cursor, self, module_name)
+ table = TableHandler(cursor, cls, module_name)
table.index_action('create_date', action='add')
if migrate_warehouse:
@@ -111,145 +117,138 @@ class Forecast(Workflow, ModelSQL, ModelView):
return location.id
elif location.parent:
return find_warehouse(location.parent)
- cursor.execute('SELECT id, location FROM "%s"' % self._table)
+ cursor.execute('SELECT id, location FROM "%s"' % cls._table)
for forecast_id, location_id in cursor.fetchall():
warehouse_id = location_id # default fallback
if location_id in location2warehouse:
warehouse_id = location2warehouse[location_id]
else:
- location = location_obj.browse(location_id)
+ location = Location(location_id)
warehouse_id = find_warehouse(location) or location_id
location2warehouse[location_id] = warehouse_id
cursor.execute('UPDATE "%s" SET warehouse = %%s '
- 'WHERE id = %%s' % self._table,
+ 'WHERE id = %%s' % cls._table,
(warehouse_id, forecast_id))
table.not_null_action('warehouse',
- action=self.warehouse.required and 'add' or 'remove')
+ action=cls.warehouse.required and 'add' or 'remove')
table.drop_column('location', True)
# Migration from 2.0 delete stock moves
- forecast_ids = self.search([])
- self.delete_moves(forecast_ids)
+ forecasts = cls.search([])
+ cls.delete_moves(forecasts)
- def default_state(self):
+ @staticmethod
+ def default_state():
return 'draft'
- def default_destination(self):
- location_obj = Pool().get('stock.location')
- location_ids = location_obj.search(
- self.destination.domain)
- if len(location_ids) == 1:
- return location_ids[0]
+ @classmethod
+ def default_destination(cls):
+ Location = Pool().get('stock.location')
+ locations = Location.search(cls.destination.domain)
+ if len(locations) == 1:
+ return locations[0].id
- def default_company(self):
+ @staticmethod
+ def default_company():
return Transaction().context.get('company')
- def check_date_overlap(self, ids):
+ def check_date_overlap(self):
cursor = Transaction().cursor
- for forecast in self.browse(ids):
- if forecast.state != 'done':
- continue
- cursor.execute('SELECT id ' \
- 'FROM stock_forecast ' \
- 'WHERE ((from_date <= %s AND to_date >= %s) ' \
- 'OR (from_date <= %s AND to_date >= %s) ' \
- 'OR (from_date >= %s AND to_date <= %s)) ' \
- 'AND warehouse = %s ' \
- 'AND destination = %s ' \
- 'AND state = \'done\' ' \
- 'AND company = %s '
- 'AND id != %s',
- (forecast.from_date, forecast.from_date,
- forecast.to_date, forecast.to_date,
- forecast.from_date, forecast.to_date,
- forecast.warehouse.id, forecast.destination.id,
- forecast.company.id, forecast.id))
- rowcount = cursor.rowcount
- if rowcount == -1 or rowcount is None:
- rowcount = len(cursor.fetchall())
- if rowcount:
- return False
+ if self.state != 'done':
+ return True
+ cursor.execute('SELECT id ' \
+ 'FROM stock_forecast ' \
+ 'WHERE ((from_date <= %s AND to_date >= %s) ' \
+ 'OR (from_date <= %s AND to_date >= %s) ' \
+ 'OR (from_date >= %s AND to_date <= %s)) ' \
+ 'AND warehouse = %s ' \
+ 'AND destination = %s ' \
+ 'AND state = \'done\' ' \
+ 'AND company = %s '
+ 'AND id != %s',
+ (self.from_date, self.from_date,
+ self.to_date, self.to_date,
+ self.from_date, self.to_date,
+ self.warehouse.id, self.destination.id,
+ self.company.id, self.id))
+ rowcount = cursor.rowcount
+ if rowcount == -1 or rowcount is None:
+ rowcount = len(cursor.fetchall())
+ if rowcount:
+ return False
return True
- def delete(self, ids):
- if isinstance(ids, (int, long)):
- ids = [ids]
+ @classmethod
+ def delete(self, forecasts):
# Cancel before delete
- self.cancel(ids)
- for forecast in self.browse(ids):
+ self.cancel(forecasts)
+ for forecast in forecasts:
if forecast.state != 'cancel':
self.raise_user_error('delete_cancel', forecast.rec_name)
- return super(Forecast, self).delete(ids)
+ super(Forecast, self).delete(forecasts)
+ @classmethod
@ModelView.button
@Workflow.transition('draft')
- def draft(self, ids):
+ def draft(cls, forecasts):
pass
+ @classmethod
@ModelView.button
@Workflow.transition('done')
- def confirm(self, ids):
+ def confirm(cls, forecasts):
pass
+ @classmethod
@ModelView.button
@Workflow.transition('cancel')
- def cancel(self, ids):
+ def cancel(cls, forecasts):
pass
- def create_moves(self, forecast_ids):
- 'Create stock moves for the forecast ids'
- line_obj = Pool().get('stock.forecast.line')
+ @classmethod
+ @ModelView.button_action('stock_forecast.wizard_forecast_complete')
+ def complete(cls, forecasts):
+ pass
- forecasts = self.browse(forecast_ids)
+ @staticmethod
+ def create_moves(forecasts):
+ 'Create stock moves for the forecast ids'
for forecast in forecasts:
if forecast.state == 'done':
for line in forecast.lines:
- line_obj.create_moves(line)
+ line.create_moves()
- def delete_moves(self, forecast_ids):
+ @staticmethod
+ def delete_moves(forecasts):
'Delete stock moves for the forecast ids'
- line_obj = Pool().get('stock.forecast.line')
+ Line = Pool().get('stock.forecast.line')
+ Line.delete_moves([l for f in forecasts for l in f.lines])
- forecasts = self.browse(forecast_ids)
- for forecast in forecasts:
- for line in forecast.lines:
- line_obj.delete_moves(line)
-
- def copy(self, ids, default=None):
- line_obj = Pool().get('stock.forecast.line')
-
- int_id = False
- if isinstance(ids, (int, long)):
- int_id = True
- ids = [ids]
+ @classmethod
+ def copy(cls, forecasts, default=None):
+ Line = Pool().get('stock.forecast.line')
if default is None:
default = {}
default = default.copy()
default['lines'] = None
- new_ids = []
- for forecast in self.browse(ids):
- new_id = super(Forecast, self).copy(forecast.id, default=default)
- line_obj.copy([x.id for x in forecast.lines],
- default={
- 'forecast': new_id,
+ new_forecasts = []
+ for forecast in forecasts:
+ new_forecast, = super(Forecast, cls).copy([forecast],
+ default=default)
+ Line.copy([x for x in forecast.lines],
+ default={
+ 'forecast': new_forecast.id,
})
- new_ids.append(new_id)
-
- if int_id:
- return new_ids[0]
- return new_ids
-
-Forecast()
+ new_forecasts.append(new_forecast)
+ return new_forecasts
class ForecastLine(ModelSQL, ModelView):
'Stock Forecast Line'
- _name = 'stock.forecast.line'
- _description = __doc__
+ __name__ = 'stock.forecast.line'
_rec_name = 'product'
-
product = fields.Many2One('product.product', 'Product', required=True,
domain=[
('type', '=', 'goods'),
@@ -259,7 +258,7 @@ class ForecastLine(ModelSQL, ModelView):
product_uom_category = fields.Function(
fields.Many2One('product.uom.category', 'Product Uom Category',
on_change_with=['product']),
- 'get_product_uom_category')
+ 'on_change_with_product_uom_category')
uom = fields.Many2One('product.uom', 'UOM', required=True,
domain=[
If(Bool(Eval('product_uom_category')),
@@ -281,9 +280,10 @@ class ForecastLine(ModelSQL, ModelView):
digits=(16, Eval('unit_digits', 2)), depends=['unit_digits']),
'get_quantity_executed')
- def __init__(self):
- super(ForecastLine, self).__init__()
- self._sql_constraints += [
+ @classmethod
+ def __setup__(cls):
+ super(ForecastLine, cls).__setup__()
+ cls._sql_constraints += [
('check_line_qty_pos',
'CHECK(quantity >= 0.0)', 'Line quantity must be positive!'),
('check_line_minimal_qty',
@@ -291,70 +291,54 @@ class ForecastLine(ModelSQL, ModelView):
'Line quantity must be greater than the minimal quantity!'),
('forecast_product_uniq', 'UNIQUE(forecast, product)',
'Product must be unique by forcast!'),
- ]
+ ]
- def default_unit_digits(self):
+ @staticmethod
+ def default_unit_digits():
return 2
- def default_minimal_quantity(self):
+ @staticmethod
+ def default_minimal_quantity():
return 1.0
- def on_change_product(self, vals):
- product_obj = Pool().get('product.product')
+ def on_change_product(self):
res = {}
res['unit_digits'] = 2
- if vals.get('product'):
- product = product_obj.browse(vals['product'])
- res['uom'] = product.default_uom.id
- res['uom.rec_name'] = product.default_uom.rec_name
- res['unit_digits'] = product.default_uom.digits
+ if self.product:
+ res['uom'] = self.product.default_uom.id
+ res['uom.rec_name'] = self.product.default_uom.rec_name
+ res['unit_digits'] = self.product.default_uom.digits
return res
- def on_change_with_product_uom_category(self, values):
- pool = Pool()
- product_obj = pool.get('product.product')
- if values.get('product'):
- product = product_obj.browse(values['product'])
- return product.default_uom_category.id
-
- def get_product_uom_category(self, ids, name):
- categories = {}
- for line in self.browse(ids):
- if line.product:
- categories[line.id] = line.product.default_uom_category.id
- else:
- categories[line.id] = None
- return categories
+ def on_change_with_product_uom_category(self, name=None):
+ if self.product:
+ return self.product.default_uom_category.id
- def on_change_uom(self, vals):
- uom_obj = Pool().get('product.uom')
+ def on_change_uom(self):
res = {}
res['unit_digits'] = 2
- if vals.get('uom'):
- uom = uom_obj.browse(vals['uom'])
- res['unit_digits'] = uom.digits
+ if self.uom:
+ res['unit_digits'] = self.uom.digits
return res
- def get_unit_digits(self, ids, name):
- res = {}
- for line in self.browse(ids):
- res[line.id] = line.product.default_uom.digits
- return res
+ def get_unit_digits(self, name):
+ return self.product.default_uom.digits
- def get_quantity_executed(self, ids, name):
+ @classmethod
+ def get_quantity_executed(cls, lines, name):
cursor = Transaction().cursor
- move_obj = Pool().get('stock.move')
- location_obj = Pool().get('stock.location')
- uom_obj = Pool().get('product.uom')
- forecast_obj = Pool().get('stock.forecast')
- line_move_obj = Pool().get('stock.forecast.line-stock.move')
-
- result = dict((x, 0) for x in ids)
- lines = self.browse(ids)
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Location = pool.get('stock.location')
+ Uom = pool.get('product.uom')
+ Forecast = pool.get('stock.forecast')
+ LineMove = pool.get('stock.forecast.line-stock.move')
+
+ result = dict((x.id, 0) for x in lines)
key = lambda line: line.forecast.id
lines.sort(key=key)
for forecast_id, lines in itertools.groupby(lines, key):
- forecast = forecast_obj.browse(forecast_id)
+ forecast = Forecast(forecast_id)
product2line = dict((line.product.id, line) for line in lines)
product_ids = product2line.keys()
for i in range(0, len(product_ids), cursor.IN_MAX):
@@ -362,12 +346,12 @@ class ForecastLine(ModelSQL, ModelView):
red_sql, red_ids = reduce_ids('product', sub_ids)
cursor.execute('SELECT m.product, '
'SUM(m.internal_quantity) AS quantity '
- 'FROM "' + move_obj._table + '" AS m '
- 'JOIN "' + location_obj._table + '" AS fl '
+ 'FROM "' + Move._table + '" AS m '
+ 'JOIN "' + Location._table + '" AS fl '
'ON m.from_location = fl.id '
- 'JOIN "' + location_obj._table + '" AS tl '
+ 'JOIN "' + Location._table + '" AS tl '
'ON m.to_location = tl.id '
- 'LEFT JOIN "' + line_move_obj._table + '" AS lm '
+ 'LEFT JOIN "' + LineMove._table + '" AS lm '
'ON m.id = lm.move '
'WHERE ' + red_sql + ' '
'AND fl.left >= %s AND fl.right <= %s '
@@ -383,69 +367,74 @@ class ForecastLine(ModelSQL, ModelView):
forecast.from_date, forecast.to_date])
for product_id, quantity in cursor.fetchall():
line = product2line[product_id]
- result[line.id] = uom_obj.compute_qty(
- line.product.default_uom, quantity, line.uom)
+ result[line.id] = Uom.compute_qty(line.product.default_uom,
+ quantity, line.uom)
return result
- def copy(self, ids, default=None):
+ @classmethod
+ def copy(cls, lines, default=None):
if default is None:
default = {}
default = default.copy()
default['moves'] = None
- return super(ForecastLine, self).copy(ids, default=default)
+ return super(ForecastLine, cls).copy(lines, default=default)
- def create_moves(self, line):
+ def create_moves(self):
'Create stock moves for the forecast line'
- move_obj = Pool().get('stock.move')
- uom_obj = Pool().get('product.uom')
- date_obj = Pool().get('ir.date')
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+ Date = pool.get('ir.date')
- assert not line.moves
+ assert not self.moves
- today = date_obj.today()
- from_date = line.forecast.from_date
+ today = Date.today()
+ from_date = self.forecast.from_date
if from_date < today:
from_date = today
- to_date = line.forecast.to_date
+ to_date = self.forecast.to_date
if to_date < today:
return
delta = to_date - from_date
delta = delta.days + 1
- nb_packet = int((line.quantity - line.quantity_executed)
- / line.minimal_quantity)
+ nb_packet = int((self.quantity - self.quantity_executed)
+ / self.minimal_quantity)
distribution = self.distribute(delta, nb_packet)
unit_price = None
- if line.forecast.destination.type == 'customer':
- unit_price = line.product.list_price
- unit_price = uom_obj.compute_price(line.product.default_uom,
- unit_price, line.uom)
+ if self.forecast.destination.type == 'customer':
+ unit_price = self.product.list_price
+ unit_price = Uom.compute_price(self.product.default_uom,
+ unit_price, self.uom)
moves = []
for day, qty in distribution.iteritems():
if qty == 0.0:
continue
- mid = move_obj.create({
- 'from_location': line.forecast.warehouse.storage_location.id,
- 'to_location': line.forecast.destination.id,
- 'product': line.product.id,
- 'uom': line.uom.id,
- 'quantity': qty * line.minimal_quantity,
- 'planned_date': (line.forecast.from_date
+ move = Move.create({
+ 'from_location': \
+ self.forecast.warehouse.storage_location.id,
+ 'to_location': self.forecast.destination.id,
+ 'product': self.product.id,
+ 'uom': self.uom.id,
+ 'quantity': qty * self.minimal_quantity,
+ 'planned_date': (self.forecast.from_date
+ datetime.timedelta(day)),
- 'company': line.forecast.company.id,
- 'currency': line.forecast.company.currency.id,
- 'unit_price': unit_price,
- })
- moves.append(mid)
- self.write(line.id, {'moves': [('set', moves)]})
+ 'company': self.forecast.company.id,
+ 'currency': self.forecast.company.currency.id,
+ 'unit_price': unit_price,
+ })
+ moves.append(move)
+ self.write([self], {'moves': [('set', [m.id for m in moves])]})
- def delete_moves(self, line):
+ @classmethod
+ def delete_moves(cls, lines):
'Delete stock moves of the forecast line'
- move_obj = Pool().get('stock.move')
- move_obj.delete([m.id for m in line.moves])
+ Move = Pool().get('stock.move')
+ Move.delete([m for l in lines for m in l.moves])
- def distribute(self, delta, qty):
+ @staticmethod
+ def distribute(delta, qty):
'Distribute qty over delta'
range_delta = range(delta)
a = {}.fromkeys(range_delta, 0)
@@ -472,44 +461,33 @@ class ForecastLine(ModelSQL, ModelView):
qty = 0
return a
-ForecastLine()
-
class ForecastLineMove(ModelSQL):
'ForecastLine - Move'
- _name = 'stock.forecast.line-stock.move'
+ __name__ = 'stock.forecast.line-stock.move'
_table = 'forecast_line_stock_move_rel'
- _description = __doc__
line = fields.Many2One('stock.forecast.line', 'Forecast Line',
ondelete='CASCADE', select=True, required=True)
move = fields.Many2One('stock.move', 'Move', ondelete='CASCADE',
select=True, required=True)
-ForecastLineMove()
-
class ForecastCompleteAsk(ModelView):
'Complete Forecast'
- _name = 'stock.forecast.complete.ask'
- _description = __doc__
+ __name__ = 'stock.forecast.complete.ask'
from_date = fields.Date('From Date', required=True)
to_date = fields.Date('To Date', required=True)
-ForecastCompleteAsk()
-
class ForecastCompleteChoose(ModelView):
'Complete Forecast'
- _name = 'stock.forecast.complete.choose'
- _description = __doc__
+ __name__ = 'stock.forecast.complete.choose'
products = fields.Many2Many('product.product', None, None, 'Products')
-ForecastCompleteChoose()
-
class ForecastComplete(Wizard):
'Complete Forecast'
- _name = 'stock.forecast.complete'
+ __name__ = 'stock.forecast.complete'
start_state = 'ask'
ask = StateView('stock.forecast.complete.ask',
'stock_forecast.forecast_comlete_ask_view_form', [
@@ -525,72 +503,74 @@ class ForecastComplete(Wizard):
])
complete = StateTransition()
- def __init__(self):
- super(ForecastComplete, self).__init__()
- self._error_messages.update({
+ @classmethod
+ def __setup__(cls):
+ super(ForecastComplete, cls).__setup__()
+ cls._error_messages.update({
'from_to_date': '"From Date" should be smaller than "To Date"!',
})
- def default_ask(self, session, fields):
+ def default_ask(self, fields):
"""
Forecast dates shifted by one year.
"""
- forecast_obj = Pool().get('stock.forecast')
- forecast = forecast_obj.browse(Transaction().context['active_id'])
+ Forecast = Pool().get('stock.forecast')
+ forecast = Forecast(Transaction().context['active_id'])
res = {}
for field in ("to_date", "from_date"):
res[field] = forecast[field] - relativedelta(years=1)
return res
- def _get_product_quantity(self, session):
- forecast_obj = Pool().get('stock.forecast')
- product_obj = Pool().get('product.product')
- forecast = forecast_obj.browse(Transaction().context['active_id'])
- if session.ask.from_date > session.ask.to_date:
+ def _get_product_quantity(self):
+ pool = Pool()
+ Forecast = pool.get('stock.forecast')
+ Product = pool.get('product.product')
+ forecast = Forecast(Transaction().context['active_id'])
+ if self.ask.from_date > self.ask.to_date:
self.raise_user_error('from_to_date')
with Transaction().set_context(
stock_destination=[forecast.destination.id],
- stock_date_start=session.ask.from_date,
- stock_date_end=session.ask.to_date):
- return product_obj.products_by_location([forecast.warehouse.id],
+ stock_date_start=self.ask.from_date,
+ stock_date_end=self.ask.to_date):
+ return Product.products_by_location([forecast.warehouse.id],
with_childs=True, skip_zero=False)
- def default_choose(self, session, fields):
+ def default_choose(self, fields):
"""
Collect products for which there is an outgoing stream between
the given location and the destination.
"""
- if session.choose.products:
- return {'products': [x.id for x in session.choose.products]}
- pbl = self._get_product_quantity(session)
+ if self.choose.products:
+ return {'products': [x.id for x in self.choose.products]}
+ pbl = self._get_product_quantity()
products = []
for (_, product), qty in pbl.iteritems():
if qty < 0:
products.append(product)
return {'products': products}
- def transition_complete(self, session):
+ def transition_complete(self):
pool = Pool()
- forecast_line_obj = pool.get('stock.forecast.line')
- product_obj = pool.get('product.product')
+ ForecastLine = pool.get('stock.forecast.line')
+ Product = pool.get('product.product')
prod2line = {}
- forecast_line_ids = forecast_line_obj.search([
+ forecast_lines = ForecastLine.search([
('forecast', '=', Transaction().context['active_id']),
])
- for forecast_line in forecast_line_obj.browse(forecast_line_ids):
- prod2line[forecast_line.product.id] = forecast_line.id
+ for forecast_line in forecast_lines:
+ prod2line[forecast_line.product.id] = forecast_line
- pbl = self._get_product_quantity(session)
+ pbl = self._get_product_quantity()
product_ids = [x[1] for x in pbl]
prod2uom = {}
- for product in product_obj.browse(product_ids):
+ for product in Product.browse(product_ids):
prod2uom[product.id] = product.default_uom.id
- if session.choose.products:
- products = [x.id for x in session.choose.products]
+ if self.choose.products:
+ products = [x.id for x in self.choose.products]
else:
products = None
@@ -601,7 +581,7 @@ class ForecastComplete(Wizard):
if -qty <= 0:
continue
if product in prod2line:
- forecast_line_obj.write(prod2line[product], {
+ ForecastLine.write([prod2line[product]], {
'product': product,
'quantity': -qty,
'uom': prod2uom[product],
@@ -609,7 +589,7 @@ class ForecastComplete(Wizard):
'minimal_quantity': min(1, -qty),
})
else:
- forecast_line_obj.create({
+ ForecastLine.create({
'product': product,
'quantity': -qty,
'uom': prod2uom[product],
@@ -617,5 +597,3 @@ class ForecastComplete(Wizard):
'minimal_quantity': min(1, -qty),
})
return 'end'
-
-ForecastComplete()
diff --git a/forecast.xml b/forecast.xml
index 4faf460..427debd 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -39,9 +39,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="to_date"/>
<label name="company"/>
<field name="company"/>
- <button string="Complete Forecast" type="action"
- name="%(wizard_forecast_complete)d"
- states="{'readonly': Not(Equal(Eval('state'), 'draft'))}"
+ <button string="Complete Forecast" name="complete"
colspan="2"
help="Add forecast line based on past data."/>
<field name="lines" colspan="4"/>
@@ -50,11 +48,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="state"/>
<group colspan="2" col="3" id="buttons">
<button string="Reset to Draft" name="draft"
- type="object" icon="tryton-clear"/>
+ icon="tryton-clear"/>
<button string="Cancel" name="cancel"
- type="object" icon="tryton-cancel"/>
+ icon="tryton-cancel"/>
<button string="Confirm" name="confirm"
- type="object" icon="tryton-ok"/>
+ icon="tryton-ok"/>
</group>
</group>
</form>
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 57e2f01..06f50ae 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -24,7 +24,7 @@ msgstr "Стойността на \"До дата\" трябва да е по-г
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "Прогноза \"%s\" трябва да бъде отказана преди изтриване!"
+msgstr "Преди да бъде изтрита прогноза \"%s\" трябва да бъде прекратена!"
msgctxt "error:stock.forecast:"
msgid ""
@@ -135,7 +135,7 @@ msgstr "Продукт"
msgctxt "field:stock.forecast.line,product_uom_category:"
msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория мер. ед. на продукт"
msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
@@ -225,12 +225,10 @@ msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Прогноза за наличност"
-#, fuzzy
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
msgstr "Изготвяне на прогноза"
-#, fuzzy
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
msgstr "Изготвяне на прогноза"
@@ -301,7 +299,7 @@ msgstr "Изпращане в проект"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr ""
+msgstr "Избот на продукти"
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
@@ -319,11 +317,6 @@ msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Пълен"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Отказ"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr "Отказ"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index b0b7403..9efc519 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -25,6 +25,7 @@ msgstr "«Fins a la data» ha de ser més recent que «Des de la data»"
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion!"
msgstr ""
+"No pot crear previsions per a les mateixes ubicacions amb dates solapadas."
msgctxt "error:stock.forecast:"
msgid ""
@@ -38,12 +39,11 @@ msgstr "Empresa"
msgctxt "field:stock.forecast,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:stock.forecast,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:stock.forecast,destination:"
msgid "Destination"
@@ -55,7 +55,7 @@ msgstr "Des de la data"
msgctxt "field:stock.forecast,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast,lines:"
msgid "Lines"
@@ -73,18 +73,17 @@ msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "Fins a la data"
-#, fuzzy
msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Ubicació"
msgctxt "field:stock.forecast,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:stock.forecast,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
@@ -92,7 +91,7 @@ msgstr "Des de la data"
msgctxt "field:stock.forecast.complete.ask,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
@@ -100,7 +99,7 @@ msgstr "Fins a la data"
msgctxt "field:stock.forecast.complete.choose,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
@@ -108,12 +107,11 @@ msgstr "Productes"
msgctxt "field:stock.forecast.line,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:stock.forecast.line,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
@@ -121,7 +119,7 @@ msgstr "Previsió"
msgctxt "field:stock.forecast.line,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
@@ -137,7 +135,7 @@ msgstr "Producte"
msgctxt "field:stock.forecast.line,product_uom_category:"
msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoria UdM del producte"
msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
@@ -145,7 +143,7 @@ msgstr "Quantitat"
msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr ""
+msgstr "Quantitats executades"
msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
@@ -161,24 +159,23 @@ msgstr "UdM"
msgctxt "field:stock.forecast.line,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:stock.forecast.line,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:stock.forecast.line-stock.move,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:stock.forecast.line-stock.move,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:stock.forecast.line-stock.move,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
@@ -194,11 +191,11 @@ msgstr "Nom"
msgctxt "field:stock.forecast.line-stock.move,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:stock.forecast.line-stock.move,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
@@ -206,7 +203,7 @@ msgstr "Previsió"
msgctxt "model:ir.action,name:act_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr ""
+msgstr "Previsions en esborrany"
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
@@ -218,7 +215,7 @@ msgstr "Previsions"
msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr ""
+msgstr "Previsions en esborrany"
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
@@ -228,12 +225,10 @@ msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Previsió d'existències"
-#, fuzzy
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
msgstr "Demanar previsió completa"
-#, fuzzy
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
msgstr "Triar previsió completa"
@@ -248,7 +243,7 @@ msgstr "Línea de previsió - Moviment"
msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
msgctxt "selection:stock.forecast,state:"
msgid "Done"
@@ -280,7 +275,7 @@ msgstr "Afegir línia de previsió sobre la base de dades anteriors."
msgctxt "view:stock.forecast:"
msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
@@ -288,7 +283,7 @@ msgstr "Previsió completa"
msgctxt "view:stock.forecast:"
msgid "Confirm"
-msgstr "Confirmar"
+msgstr "Confirma"
msgctxt "view:stock.forecast:"
msgid "Forecast"
@@ -304,31 +299,24 @@ msgstr "Restablir a esborrany"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr ""
+msgstr "Seleccioni productes"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Complet"
+msgstr "Completa"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr ""
+msgstr "Seleccioni dates"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Complet"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
-msgstr "Cancel·lar"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr "cancel·lar"
+msgstr "Cancel·la"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index ac18c45..0d23869 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -318,7 +318,3 @@ msgstr ""
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr ""
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr ""
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 46939f0..87fde37 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -24,7 +24,7 @@ msgstr "¡«Hasta la fecha» debe ser más reciente que «Desde la fecha»!"
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr "¡Previsión \"%s\" debe ser cancelada antes de la eliminación!"
+msgstr "¡Previsión «%s» debe ser cancelada antes de la eliminación!"
msgctxt "error:stock.forecast:"
msgid ""
@@ -319,7 +319,3 @@ msgstr "Completo"
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Cancelar"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr "cancelar"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 423ae75..e6b7251 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "¡\"Desde la Fecha\" puede ser menor que \"A la Fecha\"!"
+msgstr "¡\"Desde la Fecha\" debería ser menor que \"A la Fecha\"!"
msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
@@ -24,7 +24,7 @@ msgstr "\"Hasta la Fecha\" debe ser mayor que \"Desde la Fecha\""
msgctxt "error:stock.forecast:"
msgid "Forecast \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgstr "¡La proyección \"%s\" debe ser cancelada antes de su eliminación!"
msgctxt "error:stock.forecast:"
msgid ""
@@ -39,12 +39,11 @@ msgstr "Compañía"
msgctxt "field:stock.forecast,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:stock.forecast,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:stock.forecast,destination:"
msgid "Destination"
@@ -56,7 +55,7 @@ msgstr "Fecha Inicial"
msgctxt "field:stock.forecast,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast,lines:"
msgid "Lines"
@@ -74,18 +73,17 @@ msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "A la Fecha"
-#, fuzzy
msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
-msgstr "Lugar"
+msgstr "Locación"
msgctxt "field:stock.forecast,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:stock.forecast,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
@@ -93,7 +91,7 @@ msgstr "Fecha Inicial"
msgctxt "field:stock.forecast.complete.ask,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
@@ -101,7 +99,7 @@ msgstr "A la Fecha"
msgctxt "field:stock.forecast.complete.choose,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
@@ -109,12 +107,11 @@ msgstr "Productos"
msgctxt "field:stock.forecast.line,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:stock.forecast.line,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
@@ -122,7 +119,7 @@ msgstr "Proyección"
msgctxt "field:stock.forecast.line,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
@@ -138,7 +135,7 @@ msgstr "Productos"
msgctxt "field:stock.forecast.line,product_uom_category:"
msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoria de UdM de Producto"
msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
@@ -146,15 +143,15 @@ msgstr "Cantidad"
msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr ""
+msgstr "Cantidad Ejecutada"
msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
-msgstr "Nombre de Contacto"
+msgstr "Nombre"
msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
-msgstr "Dígitos Unitarios"
+msgstr "Decimales de la Unidad"
msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
@@ -162,24 +159,23 @@ msgstr "UDM"
msgctxt "field:stock.forecast.line,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:stock.forecast.line,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:stock.forecast.line-stock.move,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:stock.forecast.line-stock.move,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:stock.forecast.line-stock.move,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
@@ -195,11 +191,11 @@ msgstr "Nombre"
msgctxt "field:stock.forecast.line-stock.move,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Creación"
msgctxt "field:stock.forecast.line-stock.move,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
@@ -207,7 +203,7 @@ msgstr "Proyecciones"
msgctxt "model:ir.action,name:act_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr "Proyección de Pruebas"
+msgstr "Proyecciones en Borrador"
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
@@ -219,7 +215,7 @@ msgstr "Proyecciones"
msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr "Proyección de Pruebas"
+msgstr "Proyecciones en Borrador"
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
@@ -229,23 +225,21 @@ msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Proyección de Almacén"
-#, fuzzy
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
-msgstr "Pregunta de Proyección Completa"
+msgstr "Pregunta Proyección Completa"
-#, fuzzy
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
-msgstr "Escojencia de Proyección Completa"
+msgstr "Escojer Proyección Completa"
msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
-msgstr "Línea de Proyección de Alamacén"
+msgstr "Línea de Proyección de Almacén"
msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
-msgstr "Línea de Proyección - Mover"
+msgstr "Línea de Proyección - Movimiento"
msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
@@ -261,11 +255,11 @@ msgstr "Borrador"
msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
-msgstr "Escoja fechas"
+msgstr "Escoja las fechas"
msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
-msgstr "Escoja productos"
+msgstr "Escoja los productos"
msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
@@ -305,31 +299,24 @@ msgstr "Revertir a Borrador"
msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
msgid "Choose Products"
-msgstr ""
+msgstr "Escojer Productos"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
msgstr "Completo"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,ask,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr ""
+msgstr "Escoja las Fechas"
msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Completo"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Cancelar"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr "cancelar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index da5864c..6b5eba3 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -224,12 +224,10 @@ msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Previsión de stock"
-#, fuzzy
msgctxt "model:stock.forecast.complete.ask,name:"
msgid "Complete Forecast"
msgstr "Previsión completa"
-#, fuzzy
msgctxt "model:stock.forecast.complete.choose,name:"
msgid "Complete Forecast"
msgstr "Elegir previsión completa"
@@ -318,11 +316,6 @@ msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Completa"
-#, fuzzy
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Cancelar"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr "Cancelar"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 66da0d3..8f8a212 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -342,7 +342,3 @@ msgstr ""
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Annuleren"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index b8a185c..d69ec73 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -341,7 +341,3 @@ msgstr ""
msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "Cancel"
msgstr "Отменить"
-
-msgctxt "wizard_button:stock.forecast.complete,choose,end:"
-msgid "cancel"
-msgstr ""
diff --git a/setup.py b/setup.py
index 608f511..67dc643 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,19 @@
from setuptools import setup
import re
+import os
+import ConfigParser
-info = eval(open('__tryton__.py').read())
+
+def read(fname):
+ return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+config = ConfigParser.ConfigParser()
+config.readfp(open('tryton.cfg'))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
@@ -21,19 +32,19 @@ requires.append('trytond >= %s.%s, < %s.%s' %
setup(name='trytond_stock_forecast',
version=info.get('version', '0.0.1'),
- description=info.get('description', ''),
- author=info.get('author', ''),
- author_email=info.get('email', ''),
- url=info.get('website', ''),
+ description='Tryton module with stock forecasts',
+ long_description=read('README'),
+ author='Tryton',
+ url='http://www.tryton.org/',
package_dir={'trytond.modules.stock_forecast': '.'},
packages=[
'trytond.modules.stock_forecast',
'trytond.modules.stock_forecast.tests',
- ],
+ ],
package_data={
'trytond.modules.stock_forecast': info.get('xml', []) \
- + info.get('translation', []),
- },
+ + ['tryton.cfg', 'locale/*.po'],
+ },
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
@@ -55,7 +66,7 @@ setup(name='trytond_stock_forecast',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
- ],
+ ],
license='GPL-3',
install_requires=requires,
zip_safe=False,
@@ -65,4 +76,4 @@ setup(name='trytond_stock_forecast',
""",
test_suite='tests',
test_loader='trytond.test_loader:Loader',
-)
+ )
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 695c77a..f3d88c7 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -66,78 +66,73 @@ class StockForecastTestCase(unittest.TestCase):
Test create_moves.
'''
with Transaction().start(DB_NAME, USER, context=CONTEXT):
- category_id = self.category.create({
+ category = self.category.create({
'name': 'Test create_moves',
})
- unit_id, = self.uom.search([('name', '=', 'Unit')])
- product_id = self.product.create({
+ unit, = self.uom.search([('name', '=', 'Unit')])
+ product = self.product.create({
'name': 'Test create_moves',
'type': 'goods',
- 'category': category_id,
+ 'category': category.id,
'cost_price_method': 'fixed',
- 'default_uom': unit_id,
+ 'default_uom': unit.id,
'list_price': Decimal('1'),
'cost_price': Decimal(0),
})
- customer_id, = self.location.search([('code', '=', 'CUS')])
- warehouse_id, = self.location.search([('code', '=', 'WH')])
- storage_id, = self.location.search([('code', '=', 'STO')])
- company_id, = self.company.search([('name', '=', 'B2CK')])
- self.user.write(USER, {
- 'main_company': company_id,
- 'company': company_id,
+ customer, = self.location.search([('code', '=', 'CUS')])
+ warehouse, = self.location.search([('code', '=', 'WH')])
+ storage, = self.location.search([('code', '=', 'STO')])
+ company, = self.company.search([('name', '=', 'B2CK')])
+ self.user.write([self.user(USER)], {
+ 'main_company': company.id,
+ 'company': company.id,
})
today = datetime.date.today()
- forecast_id = self.forecast.create({
- 'warehouse': warehouse_id,
- 'destination': customer_id,
+ forecast = self.forecast.create({
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
'from_date': today + relativedelta(months=1, day=1),
'to_date': today + relativedelta(months=1, day=20),
- 'company': company_id,
+ 'company': company.id,
'lines': [
('create', {
- 'product': product_id,
+ 'product': product.id,
'quantity': 10,
- 'uom': unit_id,
+ 'uom': unit.id,
'minimal_quantity': 2,
},
),
],
})
- self.forecast.confirm([forecast_id])
+ self.forecast.confirm([forecast])
- self.forecast.create_moves([forecast_id])
- forecast = self.forecast.browse(forecast_id)
+ self.forecast.create_moves([forecast])
line, = forecast.lines
self.assertEqual(line.quantity_executed, 0)
self.assertEqual(len(line.moves), 5)
self.assertEqual(sum(move.quantity for move in line.moves), 10)
- self.forecast.delete_moves([forecast_id])
- forecast = self.forecast.browse(forecast_id)
+ self.forecast.delete_moves([forecast])
line, = forecast.lines
self.assertEqual(len(line.moves), 0)
- company = self.company.browse(company_id)
self.move.create({
- 'from_location': storage_id,
- 'to_location': customer_id,
- 'product': product_id,
- 'uom': unit_id,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'product': product.id,
+ 'uom': unit.id,
'quantity': 2,
'planned_date': today + relativedelta(months=1, day=5),
- 'company': company_id,
+ 'company': company.id,
'currency': company.currency.id,
'unit_price': Decimal('1'),
})
- forecast = self.forecast.browse(forecast_id)
line, = forecast.lines
self.assertEqual(line.quantity_executed, 2)
- self.forecast.create_moves([forecast_id])
- forecast = self.forecast.browse(forecast_id)
+ self.forecast.create_moves([forecast])
line, = forecast.lines
self.assertEqual(line.quantity_executed, 2)
self.assertEqual(len(line.moves), 4)
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..ab31c67
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,10 @@
+[tryton]
+version=2.6.0
+depends:
+ company
+ ir
+ product
+ res
+ stock
+xml:
+ forecast.xml
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 892310c..47f48f2 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,19 +1,47 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 2.4.0
-Summary: Provide the "Forecast" model in Inventory Management.
-The Forecast form allow to define the expected stock movement towards
-customers in any period of time in the future. A wizard allow to
-compute the expected quantities with respect to a period in the
-past. Once the form confirmed, the corresponding moves are created and
-spread homogeneously across the period. Those moves will allow other
-process to take forecasts into account.
-
+Version: 2.6.0
+Summary: Tryton module with stock forecasts
Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
License: GPL-3
-Description: UNKNOWN
+Description: trytond_stock_forecast
+ =====================
+
+ The stock_forecast module of the Tryton application platform.
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index 1191bb2..4258d5d 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -6,8 +6,8 @@ MANIFEST.in
README
forecast.xml
setup.py
+tryton.cfg
./__init__.py
-./__tryton__.py
./forecast.py
./tests/__init__.py
./tests/test_stock_forecast.py
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 45fa6eb..5142b61 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_stock >= 2.4, < 2.5
-trytond_product >= 2.4, < 2.5
-trytond_company >= 2.4, < 2.5
-trytond >= 2.4, < 2.5
\ No newline at end of file
+trytond_company >= 2.6, < 2.7
+trytond_product >= 2.6, < 2.7
+trytond_stock >= 2.6, < 2.7
+trytond >= 2.6, < 2.7
\ No newline at end of file
commit ed05808ba648cb876860bfcd9dd5f7a63c9e0579
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Apr 24 19:31:05 2012 +0200
Adding upstream version 2.4.0.
diff --git a/CHANGELOG b/CHANGELOG
index 229540b..5343c81 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 2.2.1 - 2011-12-26
+Version 2.4.0 - 2012-04-24
* Bug fixes (see mercurial logs for details)
Version 2.2.0 - 2011-10-25
diff --git a/COPYRIGHT b/COPYRIGHT
index 3d2324b..2057c72 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2011 Cédric Krier.
-Copyright (C) 2008-2011 Bertrand Chenal.
-Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2008-2012 Cédric Krier.
+Copyright (C) 2008-2012 Bertrand Chenal.
+Copyright (C) 2008-2012 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/INSTALL b/INSTALL
index cd44bde..4b0b4c3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_stock_forecast
Prerequisites
-------------
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
* python-dateutil (http://labix.org/python-dateutil)
* trytond (http://www.tryton.org/)
* trytond_product (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 6109463..365d97f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 2.2.1
+Version: 2.4.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__init__.py b/__init__.py
index cf92f4b..0be3aee 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,4 +1,4 @@
#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 forecast import *
+from .forecast import *
diff --git a/__tryton__.py b/__tryton__.py
index c652929..b563ee0 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,11 +3,13 @@
{
'name': 'Stock Forecast',
'name_bg_BG': 'Прогнозиране на наличност',
+ 'name_ca_ES': 'Previsió d''estocs',
'name_de_DE': 'Lagerverwaltung Bedarfsermittlung',
+ 'name_es_AR': 'Previsión de existencias',
'name_es_CO': 'Previsión de existencias',
- 'name_es_ES': 'Previsión de existencias',
+ 'name_es_ES': 'Previsión de stock',
'name_fr_FR': 'Prévision de stock',
- 'version': '2.2.1',
+ 'version': '2.4.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -19,14 +21,22 @@ past. Once the form confirmed, the corresponding moves are created and
spread homogeneously across the period. Those moves will allow other
process to take forecasts into account.
''',
- 'description_bg_BG':'''Предоставя модел за "прогнозиране" при управление на инвентазирация
+ 'description_bg_BG': '''Предоставя модел за "прогнозиране" при управление на инвентазирация
- Формата за "Прогноза" позволява да се зададат очакваните движения на наличност
към клиенти в бъдещ период. Помощник позволява да се изчислят очакваните
количества отчитайки периоди в миналто. След потвърждаване на формата, съответните
движения биват създадени и разпределени равномерно за периода. Тези движения
позволяват на други процеси да вземат предвид тези прогнози.
''',
- 'description_de_DE':'''Bedarfsermittlung für die Lagerverwaltung
+ 'description_ca_ES': '''Proporciona el model de «Previsió» en la gestió d'inventaris.
+El formulari de previsió permet definir els moviments d'estoc previstos
+cap a clients en el futur. Un assistent permet calcular les quantitats previstes
+respecte a un període en el passat. Una vegada el formulari es confirma, els
+moviments corresponents es creen i es distribueixen homogèniament al llarg del
+període. Aquests moviments permetran a altres processos tenir en compte les
+previsions.
+''',
+ 'description_de_DE': '''Bedarfsermittlung für die Lagerverwaltung
- Fügt das Modell "Vorhersage" zur Lagerverwaltung hinzu.
- Das Formular "Bedarfsermittlung" ermöglicht die Erstellung von zu
erwartenden Lagerbewegungen zu Kunden in einem beliebigen Zeitraum in der
@@ -37,6 +47,16 @@ process to take forecasts into account.
Lagerbewegungen ermöglichen die Berücksichtigung von Vorhersagen in
den anderen Prozessen der Lagerverwaltung.
''',
+ 'description_es_AR': '''Provee el modelo de «Previsión» en la gestión de
+inventarios.
+El formulario de previsión permite definir los movimientos de existencias
+planificados hacia los clientes en cualquier período de tiempo en el futuro.
+Un asistente permite calcular las cantidades esperadas respecto a un período
+en el pasado. Una vez el formulario se confirma, los movimientos
+correspondientes se crean y se distribuyen homogéneamente a lo largo del
+período. Dichos movimientos permitirá a otros procesos tener en cuenta las
+previsiones.
+''',
'description_es_CO': '''Provee el modelo de «Previsión» en la gestión de
inventarios.
El formulario de previsión permite definir los movimientos de existencias
@@ -46,15 +66,15 @@ anterior. Cuando se confirma, los movimientos correspondientes se crean
y se distribuyen homogeneamente en el período. Tales movimientos permitirá
a otros procesos hacer previsiones.
''',
- 'description_es_ES': '''Provee el modelo de «Previsión» en la gestión de inventarios.
-El formulario de previsión permite definir los movimientos de existencias
-planificados hacia los clientes en cualquier periodo de tiempo en el futuro.
-Un asistente permite calcular las cantidades esperadas respecto a un periodo
+ 'description_es_ES': '''Proporciona el modelo de «Previsión» en la gestión de inventarios.
+El formulario de previsión permite definir los movimientos de stock
+previstos hacia los clientes en cualquier período de tiempo en el futuro.
+Un asistente permite calcular las cantidades previstas respecto a un período
en el pasado. Una vez el formulario se confirma, los movimientos
correspondientes se crean y se distribuyen homogeneamente a lo largo del
-periodo. Dichos movimientos permitirá a otros procesos tener en cuenta las previsiones.
+período. Dichos movimientos permitirá a otros procesos tener en cuenta las previsiones.
''',
- 'description_fr_FR':'''Fournit le modèle "Prévision" dans la gestion des stocks.
+ 'description_fr_FR': '''Fournit le modèle "Prévision" dans la gestion des stocks.
Le formulaire de prévision permet de définir les mouvements attendus
vers les clients pour n'importe quelle période dans le futur. Un
wizard permet de calculer les quantités attendues en fonction d'une
@@ -66,7 +86,6 @@ prévisions.
'depends': [
'ir',
'res',
- 'workflow',
'stock',
'product',
'company',
@@ -77,7 +96,9 @@ prévisions.
'translation': [
'locale/cs_CZ.po',
'locale/bg_BG.po',
+ 'locale/ca_ES.po',
'locale/de_DE.po',
+ 'locale/es_AR.po',
'locale/es_CO.po',
'locale/es_ES.po',
'locale/fr_FR.po',
diff --git a/forecast.py b/forecast.py
index 34c0148..32f4f94 100644
--- a/forecast.py
+++ b/forecast.py
@@ -1,12 +1,11 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import datetime
-import time
from dateutil.relativedelta import relativedelta
import itertools
-from trytond.model import ModelView, ModelWorkflow, ModelSQL, fields
-from trytond.wizard import Wizard
-from trytond.pyson import Not, Equal, Eval, Or, Bool
+from trytond.model import ModelView, Workflow, ModelSQL, fields
+from trytond.wizard import Wizard, StateView, StateTransition, Button
+from trytond.pyson import Not, Equal, Eval, Or, Bool, If
from trytond.backend import TableHandler
from trytond.transaction import Transaction
from trytond.pool import Pool
@@ -18,7 +17,7 @@ STATES = {
DEPENDS = ['state']
-class Forecast(ModelWorkflow, ModelSQL, ModelView):
+class Forecast(Workflow, ModelSQL, ModelView):
"Stock Forecast"
_name = "stock.forecast"
_description = __doc__
@@ -52,13 +51,10 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
('draft', 'Draft'),
('done', 'Done'),
('cancel', 'Cancel'),
- ], 'State', readonly=True, select=1)
+ ], 'State', readonly=True, select=True)
def __init__(self):
super(Forecast, self).__init__()
- self._rpc.update({
- 'button_draft': True,
- })
self._sql_constraints += [
('check_from_to_date',
'CHECK(to_date >= from_date)',
@@ -68,11 +64,30 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
('check_date_overlap', 'date_overlap'),
]
self._error_messages.update({
- 'date_overlap': 'You can not create forecasts for the same '
- 'locations with overlapping dates'
+ 'date_overlap': 'You can not create forecasts for the same ' \
+ 'locations with overlapping dates',
+ 'delete_cancel': 'Forecast "%s" must be cancelled before '\
+ 'deletion!',
})
self._order.insert(0, ('from_date', 'DESC'))
self._order.insert(1, ('warehouse', 'ASC'))
+ self._transitions |= set((
+ ('draft', 'done'),
+ ('draft', 'cancel'),
+ ('done', 'draft'),
+ ('cancel', 'draft'),
+ ))
+ self._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state') != 'draft',
+ },
+ 'draft': {
+ 'invisible': Eval('state') == 'draft',
+ },
+ 'confirm': {
+ 'invisible': Eval('state') != 'draft',
+ },
+ })
def init(self, module_name):
location_obj = Pool().get('stock.location')
@@ -90,6 +105,7 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
if migrate_warehouse:
location2warehouse = {}
+
def find_warehouse(location):
if location.type == 'warehouse':
return location.id
@@ -97,7 +113,7 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
return find_warehouse(location.parent)
cursor.execute('SELECT id, location FROM "%s"' % self._table)
for forecast_id, location_id in cursor.fetchall():
- warehouse_id = location_id # default fallback
+ warehouse_id = location_id # default fallback
if location_id in location2warehouse:
warehouse_id = location2warehouse[location_id]
else:
@@ -105,7 +121,8 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
warehouse_id = find_warehouse(location) or location_id
location2warehouse[location_id] = warehouse_id
cursor.execute('UPDATE "%s" SET warehouse = %%s '
- 'WHERE id = %%s' % self._table, (warehouse_id, forecast_id))
+ 'WHERE id = %%s' % self._table,
+ (warehouse_id, forecast_id))
table.not_null_action('warehouse',
action=self.warehouse.required and 'add' or 'remove')
table.drop_column('location', True)
@@ -123,10 +140,9 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
self.destination.domain)
if len(location_ids) == 1:
return location_ids[0]
- return False
def default_company(self):
- return Transaction().context.get('company') or False
+ return Transaction().context.get('company')
def check_date_overlap(self, ids):
cursor = Transaction().cursor
@@ -155,24 +171,30 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
return False
return True
- def button_draft(self, ids):
- self.workflow_trigger_create(ids)
- return True
+ def delete(self, ids):
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ # Cancel before delete
+ self.cancel(ids)
+ for forecast in self.browse(ids):
+ if forecast.state != 'cancel':
+ self.raise_user_error('delete_cancel', forecast.rec_name)
+ return super(Forecast, self).delete(ids)
- def wkf_draft(self, forecast):
- self.write(forecast.id, {
- 'state': 'draft',
- })
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(self, ids):
+ pass
- def wkf_cancel(self, forecast):
- self.write(forecast.id, {
- 'state': 'cancel',
- })
+ @ModelView.button
+ @Workflow.transition('done')
+ def confirm(self, ids):
+ pass
- def wkf_done(self, forecast):
- self.write(forecast.id, {
- 'state': 'done',
- })
+ @ModelView.button
+ @Workflow.transition('cancel')
+ def cancel(self, ids):
+ pass
def create_moves(self, forecast_ids):
'Create stock moves for the forecast ids'
@@ -204,7 +226,7 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
if default is None:
default = {}
default = default.copy()
- default['lines'] = False
+ default['lines'] = None
new_ids = []
for forecast in self.browse(ids):
@@ -229,12 +251,21 @@ class ForecastLine(ModelSQL, ModelView):
_rec_name = 'product'
product = fields.Many2One('product.product', 'Product', required=True,
- domain=[('type', '=', 'stockable')], on_change=['product'])
+ domain=[
+ ('type', '=', 'goods'),
+ ('consumable', '=', False),
+ ],
+ on_change=['product'])
+ product_uom_category = fields.Function(
+ fields.Many2One('product.uom.category', 'Product Uom Category',
+ on_change_with=['product']),
+ 'get_product_uom_category')
uom = fields.Many2One('product.uom', 'UOM', required=True,
domain=[
- ('category', '=',
- (Eval('product'), 'product.default_uom.category')),
- ], on_change=['uom'], depends=['product'])
+ If(Bool(Eval('product_uom_category')),
+ ('category', '=', Eval('product_uom_category')),
+ ('category', '!=', -1)),
+ ], on_change=['uom'], depends=['product', 'product_uom_category'])
unit_digits = fields.Function(fields.Integer('Unit Digits'),
'get_unit_digits')
quantity = fields.Float('Quantity', digits=(16, Eval('unit_digits', 2)),
@@ -243,7 +274,7 @@ class ForecastLine(ModelSQL, ModelView):
digits=(16, Eval('unit_digits', 2)), required=True,
depends=['unit_digits'])
moves = fields.Many2Many('stock.forecast.line-stock.move',
- 'line', 'move','Moves', readonly=True)
+ 'line', 'move', 'Moves', readonly=True)
forecast = fields.Many2One(
'stock.forecast', 'Forecast', required=True, ondelete='CASCADE')
quantity_executed = fields.Function(fields.Float('Quantity Executed',
@@ -279,6 +310,22 @@ class ForecastLine(ModelSQL, ModelView):
res['unit_digits'] = product.default_uom.digits
return res
+ def on_change_with_product_uom_category(self, values):
+ pool = Pool()
+ product_obj = pool.get('product.product')
+ if values.get('product'):
+ product = product_obj.browse(values['product'])
+ return product.default_uom_category.id
+
+ def get_product_uom_category(self, ids, name):
+ categories = {}
+ for line in self.browse(ids):
+ if line.product:
+ categories[line.id] = line.product.default_uom_category.id
+ else:
+ categories[line.id] = None
+ return categories
+
def on_change_uom(self, vals):
uom_obj = Pool().get('product.uom')
res = {}
@@ -330,9 +377,10 @@ class ForecastLine(ModelSQL, ModelView):
'AND COALESCE(m.effective_date, m.planned_date) <= %s '
'AND lm.id IS NULL '
'GROUP BY m.product',
- red_ids + [forecast.warehouse.left, forecast.warehouse.right,
- forecast.destination.left, forecast.destination.right,
- 'cancel', forecast.from_date, forecast.to_date])
+ red_ids + [forecast.warehouse.left,
+ forecast.warehouse.right, forecast.destination.left,
+ forecast.destination.right, 'cancel',
+ forecast.from_date, forecast.to_date])
for product_id, quantity in cursor.fetchall():
line = product2line[product_id]
result[line.id] = uom_obj.compute_qty(
@@ -343,7 +391,7 @@ class ForecastLine(ModelSQL, ModelView):
if default is None:
default = {}
default = default.copy()
- default['moves'] = False
+ default['moves'] = None
return super(ForecastLine, self).copy(ids, default=default)
def create_moves(self, line):
@@ -367,7 +415,7 @@ class ForecastLine(ModelSQL, ModelView):
nb_packet = int((line.quantity - line.quantity_executed)
/ line.minimal_quantity)
distribution = self.distribute(delta, nb_packet)
- unit_price = False
+ unit_price = None
if line.forecast.destination.type == 'customer':
unit_price = line.product.list_price
unit_price = uom_obj.compute_price(line.product.default_uom,
@@ -386,7 +434,7 @@ class ForecastLine(ModelSQL, ModelView):
'planned_date': (line.forecast.from_date
+ datetime.timedelta(day)),
'company': line.forecast.company.id,
- 'currency':line.forecast.company.currency.id,
+ 'currency': line.forecast.company.currency.id,
'unit_price': unit_price,
})
moves.append(mid)
@@ -404,21 +452,22 @@ class ForecastLine(ModelSQL, ModelView):
while qty > 0:
if qty > delta:
for i in range_delta:
- a[i] += qty//delta
- qty = qty%delta
- elif delta//qty > 1:
+ a[i] += qty // delta
+ qty = qty % delta
+ elif delta // qty > 1:
i = 0
while i < qty:
- a[i*delta//qty + (delta//qty/2)] += 1
+ a[i * delta // qty + (delta // qty / 2)] += 1
i += 1
qty = 0
else:
for i in range_delta:
a[i] += 1
- qty = delta-qty
+ qty = delta - qty
i = 0
while i < qty:
- a[delta - ((i*delta//qty) + (delta//qty/2)) - 1] -= 1
+ a[delta - ((i * delta // qty) + (delta // qty / 2)) - 1
+ ] -= 1
i += 1
qty = 0
return a
@@ -432,15 +481,15 @@ class ForecastLineMove(ModelSQL):
_table = 'forecast_line_stock_move_rel'
_description = __doc__
line = fields.Many2One('stock.forecast.line', 'Forecast Line',
- ondelete='CASCADE', select=1, required=True)
+ ondelete='CASCADE', select=True, required=True)
move = fields.Many2One('stock.move', 'Move', ondelete='CASCADE',
- select=1, required=True)
+ select=True, required=True)
ForecastLineMove()
class ForecastCompleteAsk(ModelView):
- 'Forecast Complete Ask'
+ 'Complete Forecast'
_name = 'stock.forecast.complete.ask'
_description = __doc__
from_date = fields.Date('From Date', required=True)
@@ -450,7 +499,7 @@ ForecastCompleteAsk()
class ForecastCompleteChoose(ModelView):
- 'Forecast Complete Choose'
+ 'Complete Forecast'
_name = 'stock.forecast.complete.choose'
_description = __doc__
products = fields.Many2Many('product.product', None, None, 'Products')
@@ -461,41 +510,20 @@ ForecastCompleteChoose()
class ForecastComplete(Wizard):
'Complete Forecast'
_name = 'stock.forecast.complete'
- states = {
- 'init': {
- 'actions': ['_set_default_dates'],
- 'result': {
- 'type': 'form',
- 'object': 'stock.forecast.complete.ask',
- 'state': [
- ('end', 'cancel', 'tryton-cancel'),
- ('choose', 'Choose products', 'tryton-go-next'),
- ('complete', 'Complete', 'tryton-ok', True),
- ],
- },
- },
-
- 'choose': {
- 'actions': ['_set_default_products'],
- 'result': {
- 'type': 'form',
- 'object': 'stock.forecast.complete.choose',
- 'state': [
- ('end', 'cancel', 'tryton-cancel'),
- ('init', 'Choose Dates', 'tryton-go-previous'),
- ('complete', 'Complete', 'tryton-ok', True),
- ],
- },
- },
-
- 'complete': {
- 'result': {
- 'type': 'action',
- 'action': '_complete',
- 'state': 'end',
- },
- },
- }
+ start_state = 'ask'
+ ask = StateView('stock.forecast.complete.ask',
+ 'stock_forecast.forecast_comlete_ask_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Choose Products', 'choose', 'tryton-go-next'),
+ Button('Complete', 'complete', 'tryton-ok', default=True),
+ ])
+ choose = StateView('stock.forecast.complete.choose',
+ 'stock_forecast.forecast_comlete_choose_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Choose Dates', 'ask', 'tryton-go-previous'),
+ Button('Complete', 'complete', 'tryton-ok', default=True),
+ ])
+ complete = StateTransition()
def __init__(self):
super(ForecastComplete, self).__init__()
@@ -503,67 +531,66 @@ class ForecastComplete(Wizard):
'from_to_date': '"From Date" should be smaller than "To Date"!',
})
-
- def _set_default_dates(self, data):
+ def default_ask(self, session, fields):
"""
Forecast dates shifted by one year.
"""
forecast_obj = Pool().get('stock.forecast')
- forecast = forecast_obj.browse(data['id'])
+ forecast = forecast_obj.browse(Transaction().context['active_id'])
res = {}
for field in ("to_date", "from_date"):
res[field] = forecast[field] - relativedelta(years=1)
return res
- def _get_product_quantity(self, data):
+ def _get_product_quantity(self, session):
forecast_obj = Pool().get('stock.forecast')
product_obj = Pool().get('product.product')
- forecast = forecast_obj.browse(data['id'])
- if data['form']['from_date'] > data['form']['to_date']:
+ forecast = forecast_obj.browse(Transaction().context['active_id'])
+ if session.ask.from_date > session.ask.to_date:
self.raise_user_error('from_to_date')
with Transaction().set_context(
stock_destination=[forecast.destination.id],
- stock_date_start=data['form']['from_date'],
- stock_date_end=data['form']['to_date']):
+ stock_date_start=session.ask.from_date,
+ stock_date_end=session.ask.to_date):
return product_obj.products_by_location([forecast.warehouse.id],
with_childs=True, skip_zero=False)
- def _set_default_products(self, data):
+ def default_choose(self, session, fields):
"""
Collect products for which there is an outgoing stream between
the given location and the destination.
"""
- pbl = self._get_product_quantity(data)
+ if session.choose.products:
+ return {'products': [x.id for x in session.choose.products]}
+ pbl = self._get_product_quantity(session)
products = []
for (_, product), qty in pbl.iteritems():
if qty < 0:
products.append(product)
- data['form'].update({'products': products})
- return data['form']
+ return {'products': products}
- def _complete(self, data):
+ def transition_complete(self, session):
pool = Pool()
- forecast_obj = pool.get('stock.forecast')
forecast_line_obj = pool.get('stock.forecast.line')
product_obj = pool.get('product.product')
prod2line = {}
forecast_line_ids = forecast_line_obj.search([
- ('forecast', '=', data['id']),
- ])
+ ('forecast', '=', Transaction().context['active_id']),
+ ])
for forecast_line in forecast_line_obj.browse(forecast_line_ids):
prod2line[forecast_line.product.id] = forecast_line.id
- pbl = self._get_product_quantity(data)
+ pbl = self._get_product_quantity(session)
product_ids = [x[1] for x in pbl]
prod2uom = {}
for product in product_obj.browse(product_ids):
prod2uom[product.id] = product.default_uom.id
- if data['form'].get('products'):
- products = data['form']['products'][0][1]
+ if session.choose.products:
+ products = [x.id for x in session.choose.products]
else:
products = None
@@ -574,21 +601,21 @@ class ForecastComplete(Wizard):
if -qty <= 0:
continue
if product in prod2line:
- forecast_line_obj.write(prod2line[product],{
- 'product': product,
- 'quantity': -qty,
- 'uom': prod2uom[product],
- 'forecast': data['id'],
- 'minimal_quantity': min(1, -qty),
- })
+ forecast_line_obj.write(prod2line[product], {
+ 'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': Transaction().context['active_id'],
+ 'minimal_quantity': min(1, -qty),
+ })
else:
forecast_line_obj.create({
- 'product': product,
- 'quantity': -qty,
- 'uom': prod2uom[product],
- 'forecast': data['id'],
- 'minimal_quantity': min(1, -qty),
- })
- return {}
+ 'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': Transaction().context['active_id'],
+ 'minimal_quantity': min(1, -qty),
+ })
+ return 'end'
ForecastComplete()
diff --git a/forecast.xml b/forecast.xml
index 28f4db8..4faf460 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -49,19 +49,12 @@ this repository contains the full copyright notices and license terms. -->
<label name="state"/>
<field name="state"/>
<group colspan="2" col="3" id="buttons">
- <button string="Reset to Draft"
- name="button_draft"
- type="object"
- states="{'invisible': Equal(Eval('state'), 'draft'), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
- icon="tryton-clear"/>
- <button string="Cancel"
- name="cancel"
- states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
- icon="tryton-cancel"/>
- <button string="Confirm"
- name="done"
- states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
- icon="tryton-ok"/>
+ <button string="Reset to Draft" name="draft"
+ type="object" icon="tryton-clear"/>
+ <button string="Cancel" name="cancel"
+ type="object" icon="tryton-cancel"/>
+ <button string="Confirm" name="confirm"
+ type="object" icon="tryton-ok"/>
</group>
</group>
</form>
@@ -167,46 +160,7 @@ this repository contains the full copyright notices and license terms. -->
</field>
</record>
- <!-- Workflow forecast -->
- <record model="workflow" id="wkf_forecast">
- <field name="name">Forecast</field>
- <field name="model">stock.forecast</field>
- <field name="on_create">True</field>
- </record>
- <record model="workflow.activity" id="forecast_act_draft">
- <field name="workflow" ref="wkf_forecast"/>
- <field name="flow_start">True</field>
- <field name="method">wkf_draft</field>
- <field name="name">Draft</field>
- </record>
- <record model="workflow.activity" id="forecast_act_cancel">
- <field name="workflow" ref="wkf_forecast"/>
- <field name="flow_stop">True</field>
- <field name="name">Cancel</field>
- <field name="method">wkf_cancel</field>
- </record>
- <record model="workflow.activity" id="forecast_act_done">
- <field name="workflow" ref="wkf_forecast"/>
- <field name="flow_stop">True</field>
- <field name="name">Done</field>
- <field name="method">wkf_done</field>
- </record>
- <record model="workflow.transition"
- id="forecast_trans_draft_cancel">
- <field name="act_from" ref="forecast_act_draft"/>
- <field name="act_to" ref="forecast_act_cancel"/>
- <field name="group" ref="group_stock_forecast"/>
- <field name="signal">cancel</field>
- </record>
- <record model="workflow.transition"
- id="forecast_trans_draft_done">
- <field name="act_from" ref="forecast_act_draft"/>
- <field name="act_to" ref="forecast_act_done"/>
- <field name="group" ref="group_stock_forecast"/>
- <field name="signal">done</field>
- </record>
-
- <record model="ir.ui.view" id="stock_forecast_comlete_ask_view_form">
+ <record model="ir.ui.view" id="forecast_comlete_ask_view_form">
<field name="model">stock.forecast.complete.ask</field>
<field name="type">form</field>
<field name="arch" type="xml">
@@ -220,7 +174,7 @@ this repository contains the full copyright notices and license terms. -->
]]>
</field>
</record>
- <record model="ir.ui.view" id="stock_forecast_comlete_choose_view_form">
+ <record model="ir.ui.view" id="forecast_comlete_choose_view_form">
<field name="model">stock.forecast.complete.choose</field>
<field name="type">form</field>
<field name="arch" type="xml">
@@ -265,5 +219,35 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="True"/>
</record>
+ <record model="ir.model.button" id="forecast_cancel_button">
+ <field name="name">cancel</field>
+ <field name="model" search="[('model', '=', 'stock.forecast')]"/>
+ </record>
+ <record model="ir.model.button-res.group"
+ id="forecaset_cancel_button_group_stock_forecast">
+ <field name="button" ref="forecast_cancel_button"/>
+ <field name="group" ref="group_stock_forecast"/>
+ </record>
+
+ <record model="ir.model.button" id="forecast_draft_button">
+ <field name="name">draft</field>
+ <field name="model" search="[('model', '=', 'stock.forecast')]"/>
+ </record>
+ <record model="ir.model.button-res.group"
+ id="forecaset_draft_button_group_stock_forecast">
+ <field name="button" ref="forecast_draft_button"/>
+ <field name="group" ref="group_stock_forecast"/>
+ </record>
+
+ <record model="ir.model.button" id="forecast_confirm_button">
+ <field name="name">confirm</field>
+ <field name="model" search="[('model', '=', 'stock.forecast')]"/>
+ </record>
+ <record model="ir.model.button-res.group"
+ id="forecaset_confirm_button_group_stock_forecast">
+ <field name="button" ref="forecast_confirm_button"/>
+ <field name="group" ref="group_stock_forecast"/>
+ </record>
+
</data>
</tryton>
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 862604c..57e2f01 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,126 +2,201 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr "Стойността на \"От дата\" трябва да е по-малка от тази на \"До дата\"!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr "Количество на ред трябва да е по-голямо от минималното количество!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr "Количеството на реда трябва да е положително число!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr "Продукта трябва да уникален по прогноза!"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr "Стойността на \"До дата\" трябва да е по-голяма от тази на \"От дата\"!"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr "Прогноза \"%s\" трябва да бъде отказана преди изтриване!"
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
"Не може да създавате прогнози за еднао и също местонахиждение за "
"припокриващи се периоди"
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Фирма"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr "Местонахождение-цел"
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "От дата"
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Редове"
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Състояние"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "До дата"
-#, fuzzy
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "От дата"
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "До дата"
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Продукти"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr "Прогноза"
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr "Мин, к-во"
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Движения"
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Продукт"
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Количество"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr ""
+msgstr "Изпълнено количество"
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Десетични единици"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "Мер. ед."
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr "Ред от прогноза"
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Движение"
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Прогнози"
@@ -146,118 +221,109 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Прогноза за наличност"
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Прогноза за наличност"
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
-msgstr "Запитване за изготвяне на прогноза"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
-msgstr "Изготвяне на прогноза - Избор"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr "Ред от прогноза за наличност"
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr "Ред от прогноза - Движение"
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr "Прогноза"
-
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Отказ"
-
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Приключен"
-
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Проект"
-
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Отказ"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Приключен"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Проект"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr "Избор на дати"
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr "Избор на продукти"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Ред от прогноза"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Редове от прогноза"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr "Добавяне на ред от прогноза въз основа на минали данни"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Отказ"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr "Изготвяне на прогноза"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Потвърждаване"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr "Прогноза"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Прогнози"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Изпращане в проект"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Пълен"
+msgstr "Изпълнен"
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
msgstr "Отказ"
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
msgstr "Избор на дати"
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
-msgstr "Избор на продукти"
-
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Пълен"
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
msgstr "Отказ"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..b0b7403
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,334 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "«Des de la data» ha de ser anterior a «Fins a la data»"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "La quantitat de la línia ha de ser major que la quantitat mínima"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be positive!"
+msgstr "La quantitat de la línia ha de ser positiva"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Product must be unique by forcast!"
+msgstr "El producte ha de ser únic per previsió"
+
+msgctxt "error:stock.forecast:"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "«Fins a la data» ha de ser més recent que «Des de la data»"
+
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.forecast:"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"No pot crear previsions per les mateixes ubicacions amb dates solapades"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destinació"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Des de la data"
+
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:stock.forecast,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Fins a la data"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Des de la data"
+
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Fins a la data"
+
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Previsió"
+
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Quantitat mínima"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.forecast.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimals de la unitat"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Línia de previsió"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Previsió"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Previsió completa"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Previsions"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Previsió d'existències"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Previsió d'existències"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Demanar previsió completa"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Triar previsió completa"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Línia de previsió d'existències"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Línea de previsió - Moviment"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Acabada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "view:stock.forecast.complete.ask:"
+msgid "Choose dates"
+msgstr "Triar dates"
+
+msgctxt "view:stock.forecast.complete.choose:"
+msgid "Choose products"
+msgstr "Triar productes"
+
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Line"
+msgstr "Línia de previsió"
+
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Lines"
+msgstr "Línies de previsió"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Afegir línia de previsió sobre la base de dades anteriors."
+
+msgctxt "view:stock.forecast:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Previsió completa"
+
+msgctxt "view:stock.forecast:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:stock.forecast:"
+msgid "Forecast"
+msgstr "Previsió"
+
+msgctxt "view:stock.forecast:"
+msgid "Forecasts"
+msgstr "Previsions"
+
+msgctxt "view:stock.forecast:"
+msgid "Reset to Draft"
+msgstr "Restablir a esborrany"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Complet"
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Complet"
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "cancel"
+msgstr "cancel·lar"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 9fdf985..ac18c45 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,123 +2,199 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr ""
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr ""
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr ""
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr ""
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr ""
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr ""
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr ""
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr ""
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr ""
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr ""
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr ""
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr ""
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr ""
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr ""
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr ""
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr ""
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr ""
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr ""
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr ""
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr ""
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr ""
@@ -143,118 +219,106 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr ""
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr ""
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr ""
-
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr ""
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr ""
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr ""
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr ""
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
-msgid "Complete"
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 70e5a68..3586cb0 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,125 +2,203 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr "\"Von Datum\" muss kleiner als \"Bis Datum\" sein!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr "Anzahl der Position muss größer als die Minimalanzahl sein!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr "Anzahl der Position muss positiv sein!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr "Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr "\"Bis Datum\" muss größer sein als \"Von Datum\""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+"Bedarfsermittlung \"%s\" muss annulliert werden, bevor sie gelöscht werden "
+"kann."
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
"Bei Bedarfsermittlungen für den selben Lagerort darf sich das Datum nicht "
"überschneiden!"
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Unternehmen"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr "Bestimmungsort"
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "Von Datum"
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Positionen"
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Status"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "Bis Datum"
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Ort"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "Von Datum"
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "Bis Datum"
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Artikel"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr "Bedarfsermittlung"
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr "Minimale Anzahl"
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Bewegungen"
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Artikel"
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Artikel Maßeinheit Kategorie"
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Anzahl"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr "Anzahl ausgeführt"
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Anzahl Stellen"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "Maßeinheit"
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr "Position Bedarfsermittlung"
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Bewegung"
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Name"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Bedarfsermittlung"
@@ -145,119 +223,103 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Lager Bedarfsermittlung"
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Bedarfsermittlung Lagerhaltung"
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr "Bedarfsermittlung Durchführen Nachfrage"
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr "Bedarfsermittlung Durchführen Auswahl"
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr "Position Bedarfsermittlung Lagerhaltung"
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr "Position Bedarfsermittlung - Bewegung"
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr "Bedarfsermittlung"
-
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Annullieren"
-
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Erledigt"
-
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Entwurf"
-
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Annulliert"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Erledigt"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Entwurf"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr "Auswahl Datum"
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr "Auswahl Artikel"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Position Bedarfsermittlung"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Positionen Bedarfsermittlung"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr ""
"Erstelle Bedarfspositionen basierend auf den Werten aus der Vergangenheit"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Annullieren"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr "Bedarfsermittlung durchführen"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Bestätigen"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr "Bedarfsermittlung"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Bedarfsermittlung"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Auf Entwurf zurücksetzen"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Artikel auswählen"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
msgstr "Durchführen"
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
msgstr "Abbrechen"
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
msgstr "Auswahl Datum"
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
-msgstr "Auswahl Artikel"
-
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Durchführen"
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
msgstr "Abbrechen"
diff --git a/locale/es_AR.po b/locale/es_AR.po
new file mode 100644
index 0000000..46939f0
--- /dev/null
+++ b/locale/es_AR.po
@@ -0,0 +1,325 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "¡«Desde la fecha» debe ser anterior a «Hasta la fecha»!"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "¡La línea cantidad debe ser mayor que la cantidad mínima!"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be positive!"
+msgstr "¡La cantidad de la línea debe ser positiva!"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Product must be unique by forcast!"
+msgstr "¡El producto debe ser único por previsión!"
+
+msgctxt "error:stock.forecast:"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "¡«Hasta la fecha» debe ser más reciente que «Desde la fecha»!"
+
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr "¡Previsión \"%s\" debe ser cancelada antes de la eliminación!"
+
+msgctxt "error:stock.forecast:"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"No puede crear previsiones para las mísmas ubicaciones con fechas solapadas"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destino"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:stock.forecast,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Cantidad mínima"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Cantidad Ejecutada"
+
+msgctxt "field:stock.forecast.line,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimales de la unidad"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Línea de previsión"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Previsión"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Previsiones en borrador"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Previsiones en borrador"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Previsión de existencias"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Previsión de existencias"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Pedir previsión completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Elegir previsión completa"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Línea de previsión de existencias"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "LineaPrevisión - Movimiento"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:stock.forecast.complete.ask:"
+msgid "Choose dates"
+msgstr "Elegir fechas"
+
+msgctxt "view:stock.forecast.complete.choose:"
+msgid "Choose products"
+msgstr "Elegir productos"
+
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Line"
+msgstr "Línea de previsión"
+
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Lines"
+msgstr "Líneas de previsión"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Añadir línea de previsión en base a datos anteriores."
+
+msgctxt "view:stock.forecast:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "view:stock.forecast:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:stock.forecast:"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "view:stock.forecast:"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "view:stock.forecast:"
+msgid "Reset to Draft"
+msgstr "Restablecer a borrador"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Elegir Productos"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Elegir Fechas"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "cancel"
+msgstr "cancelar"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index c8ab340..423ae75 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,126 +2,205 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr "¡\"Desde la Fecha\" puede ser menor que \"A la Fecha\"!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr "¡La cantidad por línea debe ser mayor que la mínima cantidad!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr "La línea de cantidad debe ser positiva!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr "¡El producto debe ser único por proyección!"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr "\"Hasta la Fecha\" debe ser mayor que \"Desde la Fecha\""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
"No puede crear proyecciones para la misma localización con fechas "
"sobrepuestas"
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Compañía"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr "Destino"
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "Fecha Inicial"
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Líneas de Inventario"
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Estado"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "A la Fecha"
#, fuzzy
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Lugar"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "Fecha Inicial"
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "A la Fecha"
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Productos"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr "Proyección"
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr "Cantidad Mínima"
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Movimientos"
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Productos"
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Cantidad"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr ""
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Nombre de Contacto"
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Dígitos Unitarios"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "UDM"
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr "Línea de Proyección"
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Proyecciones"
@@ -146,118 +225,111 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Proyección de Almacén"
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Proyección de Almacén"
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr "Pregunta de Proyección Completa"
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr "Escojencia de Proyección Completa"
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr "Línea de Proyección de Alamacén"
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr "Línea de Proyección - Mover"
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr "Proyección"
-
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Cancelar"
-
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Hecho"
-
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Cancelar"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Hecho"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Borrador"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr "Escoja fechas"
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr "Escoja productos"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Línea de Proyección"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Líneas de Proyección"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr "Adicione líneas de proyecciones basadas en fechas pasadas."
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Cancelar"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr "Proyección Completa"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Confirmar"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr "Proyección"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Proyecciones"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Revertir a Borrador"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
msgstr "Completo"
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
-msgstr "cancelar"
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Escoja fechas"
-
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
-msgstr "Escoja productos"
+msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Completo"
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
msgstr "cancelar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 8ca1394..da5864c 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,132 +2,207 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
-msgstr "«Desde la fecha» debe ser anterior a «Hasta la fecha»"
+msgstr "\"Desde la fecha\" debe ser anterior a \"Hasta la fecha\"."
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La línea cantidad debe ser mayor que la cantidad mínima"
+msgstr "La cantidad de la línea debe ser mayor que la cantidad mínima."
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
-msgstr "La cantidad de la línea debe ser positiva"
+msgstr "La cantidad de la línea debe ser positiva."
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
-msgstr "El producto debe ser único por previsión"
+msgstr "El producto debe ser único por previsión."
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
-msgstr "«Hasta la fecha» debe ser más reciente que «Desde la fecha»"
+msgstr "\"Hasta la fecha\" debe ser más reciente que \"Desde la fecha\"."
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr "La previsión \"%s\" debe ser cancelada antes de eliminarla."
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
-"No puede crear previsiones para las mísmas ubicaciones con fechas solapadas"
+"No puede crear previsiones para las mismas ubicaciones con fechas solapadas."
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Empresa"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr "Destino"
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "Desde la fecha"
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Líneas"
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Estado"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "Hasta la fecha"
-#, fuzzy
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "Desde la fecha"
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "Hasta la fecha"
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Productos"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr "Previsión"
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr "Cantidad mínima"
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Movimientos"
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Producto"
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Cantidad"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
-msgstr ""
+msgstr "Cantidades ejecutadas"
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Decimales de la unidad"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "UdM"
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr "Línea de previsión"
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Movimiento"
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
-msgstr "Previsión"
+msgstr "Previsiones"
msgctxt "model:ir.action,name:act_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr ""
+msgstr "Previsiones borrador"
msgctxt "model:ir.action,name:wizard_forecast_complete"
msgid "Complete Forecast"
@@ -139,124 +214,115 @@ msgstr "Previsiones"
msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
msgid "Draft Forecasts"
-msgstr ""
+msgstr "Previsiones borrador"
msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
-msgstr "Previsión de existéncias"
+msgstr "Previsión de stock"
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
-msgstr "Previsión de existencias"
+msgstr "Previsión de stock"
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
-msgstr "Pedir previsión completa"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr "Elegir previsión completa"
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
-msgstr "Línea de previsión de existencias"
+msgstr "Línea de previsión de stock"
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
-msgstr "LineaPrevisión - Movimiento"
-
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr "Previsión"
-
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Cancelar"
-
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Terminada"
-
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Borrador"
+msgstr "Línea de previsión - Movimiento"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Cancelar"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
-msgstr "Terminada"
+msgstr "Realizada"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Borrador"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
-msgstr "Elegir fechas"
+msgstr "Seleccione fechas"
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
-msgstr "Elegir productos"
+msgstr "Seleccione productos"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Línea de previsión"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Líneas de previsión"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr "Añadir línea de previsión en base a datos anteriores."
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Cancelar"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr "Previsión completa"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Confirmar"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr "Previsión"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Previsiones"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Restablecer a borrador"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Seleccione productos"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Completo"
+msgstr "Completa"
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
-msgstr "cancelar"
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Elegir fechas"
+msgstr "Seleccione fechas"
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
-msgstr "Elegir productos"
-
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
-msgstr "Completo"
+msgstr "Completa"
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
-msgstr "cancelar"
+msgstr "Cancelar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index f03bbbb..82c6b86 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,125 +2,228 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr "\"De la date\" devrait être plus petit que \"À la date\" !"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.complete:"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "\"De la date\" devrait être plus petit que \"À la date\" !"
+
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
-msgstr "La quantité de ligne doit être supérieure à la quantité minimale !"
+msgstr "La quantité de la ligne doit être supérieure à la quantité minimale !"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "La quantité de la ligne doit être supérieure à la quantité minimale !"
+
+msgctxt "error:stock.forecast.line:"
+msgid "Line quantity must be positive!"
+msgstr "Les quantités sur les lignes doivent être positives!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr "Les quantités sur les lignes doivent être positives!"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
+msgid "Product must be unique by forcast!"
+msgstr "Le produit doit être unique par prévision !"
+
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr "Le produit doit être unique par prévision !"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "\"À la date\" doit être plus grande que «De la date\" !"
+
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr "\"À la date\" doit être plus grande que «De la date\" !"
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr "La prévision \"%s\" doit être annulée avant suppression"
+
+msgctxt "error:stock.forecast:"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des"
+" dates qui se chevauchent"
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
"Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des"
" dates qui se chevauchent"
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Société"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr "Destination"
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "Date de début"
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Lignes"
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "État"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "Date de fin"
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "Date de début"
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "Date de fin"
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Produits"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr "Prévision"
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr "Qté minimale"
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Mouvements"
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Produit"
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Quantité"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr "Quantité exécutée"
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Décimales de l'unité"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "UDM"
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr "Ligne de prévision"
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Mouvement"
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr "Prévisions"
@@ -145,118 +248,158 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr "Stock prévisionnel"
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr "Stock prévisionnel"
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr "Completer la prévision - Demander"
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr "Completer la prévision - Choisir"
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr "Ligne de prévision de stock"
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr "Ligne de prévision - Mouvement"
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr "Prévision"
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancel"
+msgstr "Annulé"
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
-msgstr "Annuler"
+msgstr "Annulé"
-msgctxt "model:workflow.activity,name:forecast_act_done"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Fait"
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.forecast,state:0"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Fait"
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Brouillon"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr "Choisir les dates"
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.ask:"
+msgid "Choose dates"
+msgstr "Choisir les dates"
+
+msgctxt "view:stock.forecast.complete.choose:"
+msgid "Choose products"
+msgstr "Choisissez les produits"
+
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr "Choisissez les produits"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr "Ligne de prévision"
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Line"
+msgstr "Ligne de prévision"
+
+msgctxt "view:stock.forecast.line:"
+msgid "Forecast Lines"
+msgstr "Lignes de prévision"
+
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr "Lignes de prévision"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
+
+msgctxt "view:stock.forecast:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Annuler"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr "Completer la prévision"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Completer la prévision"
+
+msgctxt "view:stock.forecast:"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Confirmer"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr "Prévision"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
+msgid "Forecast"
+msgstr "Prévision"
+
+msgctxt "view:stock.forecast:"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr "Prévisions"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Remettre en brouillon"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgctxt "view:stock.forecast:"
+msgid "Reset to Draft"
+msgstr "Remettre en brouillon"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Choix des produits"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
msgid "Complete"
-msgstr "Achevé"
+msgstr "Achever"
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
-msgstr "annuler"
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Annuler"
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
msgid "Choose Dates"
-msgstr "Choisissez les dates"
-
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
-msgstr "Choisissez les produits"
+msgstr "Choix des dates"
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr "Achevé"
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
-msgid "cancel"
-msgstr "annuler"
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Annuler"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 53377a2..66da0d3 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,139 +2,215 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Bedrijf"
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr "Vanaf datum"
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Regels"
#, fuzzy
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Status"
#, fuzzy
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr "Tot datum"
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr ""
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr "Vanaf datum"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr "Tot datum"
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "Producten"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Boekingen"
#, fuzzy
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Producten"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Hoeveelheid"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Decimalen eenheid"
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr ""
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Boeking"
#, fuzzy
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr ""
@@ -159,127 +235,114 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr ""
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr ""
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Klaar"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Concept"
-
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Annuleren"
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Klaar"
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Concept"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr ""
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Annuleren"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Bevestig"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Terug naar concept"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
-msgid "Complete"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
-msgid "Choose Dates"
-msgstr ""
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Annuleren"
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 20f8a67..b8a185c 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,138 +2,214 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:stock.forecast.complete:0"
+msgctxt "error:stock.forecast.complete:"
msgid "\"From Date\" should be smaller than \"To Date\"!"
msgstr ""
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be greater than the minimal quantity!"
msgstr ""
#, fuzzy
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Line quantity must be positive!"
msgstr "Кол-во должно быть положительным"
-msgctxt "error:stock.forecast.line:0"
+msgctxt "error:stock.forecast.line:"
msgid "Product must be unique by forcast!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
msgid "\"To Date\" must be greater than \"From Date\"!"
msgstr ""
-msgctxt "error:stock.forecast:0"
+msgctxt "error:stock.forecast:"
+msgid "Forecast \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.forecast:"
msgid ""
"You can not create forecasts for the same locations with overlapping dates"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast,company:0"
+msgctxt "field:stock.forecast,company:"
msgid "Company"
msgstr "Учет.орг."
-msgctxt "field:stock.forecast,destination:0"
+msgctxt "field:stock.forecast,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
msgid "Destination"
msgstr ""
-msgctxt "field:stock.forecast,from_date:0"
+msgctxt "field:stock.forecast,from_date:"
msgid "From Date"
msgstr ""
+msgctxt "field:stock.forecast,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast,lines:0"
+msgctxt "field:stock.forecast,lines:"
msgid "Lines"
msgstr "Строки"
#, fuzzy
-msgctxt "field:stock.forecast,rec_name:0"
+msgctxt "field:stock.forecast,rec_name:"
msgid "Name"
msgstr "Наименование"
#, fuzzy
-msgctxt "field:stock.forecast,state:0"
+msgctxt "field:stock.forecast,state:"
msgid "State"
msgstr "Статус"
-msgctxt "field:stock.forecast,to_date:0"
+msgctxt "field:stock.forecast,to_date:"
msgid "To Date"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast,warehouse:0"
+msgctxt "field:stock.forecast,warehouse:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgctxt "field:stock.forecast,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
msgid "From Date"
msgstr ""
-msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgctxt "field:stock.forecast.complete.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
msgid "To Date"
msgstr ""
+msgctxt "field:stock.forecast.complete.choose,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.complete.choose,products:0"
+msgctxt "field:stock.forecast.complete.choose,products:"
msgid "Products"
msgstr "ТМЦ"
-msgctxt "field:stock.forecast.line,forecast:0"
+msgctxt "field:stock.forecast.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgctxt "field:stock.forecast.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
msgid "Minimal Qty"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line,moves:0"
+msgctxt "field:stock.forecast.line,moves:"
msgid "Moves"
msgstr "Перемещения"
#, fuzzy
-msgctxt "field:stock.forecast.line,product:0"
+msgctxt "field:stock.forecast.line,product:"
msgid "Product"
msgstr "Товарно материальные ценности (ТМЦ)"
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
#, fuzzy
-msgctxt "field:stock.forecast.line,quantity:0"
+msgctxt "field:stock.forecast.line,quantity:"
msgid "Quantity"
msgstr "Кол-во"
-msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgctxt "field:stock.forecast.line,quantity_executed:"
msgid "Quantity Executed"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line,rec_name:0"
+msgctxt "field:stock.forecast.line,rec_name:"
msgid "Name"
msgstr "Наименование"
#, fuzzy
-msgctxt "field:stock.forecast.line,unit_digits:0"
+msgctxt "field:stock.forecast.line,unit_digits:"
msgid "Unit Digits"
msgstr "Группа цифр"
#, fuzzy
-msgctxt "field:stock.forecast.line,uom:0"
+msgctxt "field:stock.forecast.line,uom:"
msgid "UOM"
msgstr "Ед.изм."
-msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgctxt "field:stock.forecast.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
msgid "Forecast Line"
msgstr ""
#, fuzzy
-msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgctxt "field:stock.forecast.line-stock.move,move:"
msgid "Move"
msgstr "Перемещение"
#, fuzzy
-msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgctxt "field:stock.forecast.line-stock.move,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:stock.forecast.line-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
msgctxt "model:ir.action,name:act_forecast_form"
msgid "Forecasts"
msgstr ""
@@ -158,127 +234,114 @@ msgctxt "model:res.group,name:group_stock_forecast"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast,name:0"
+msgctxt "model:stock.forecast,name:"
msgid "Stock Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.ask,name:0"
-msgid "Forecast Complete Ask"
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.complete.choose,name:0"
-msgid "Forecast Complete Choose"
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
msgstr ""
-msgctxt "model:stock.forecast.line,name:0"
+msgctxt "model:stock.forecast.line,name:"
msgid "Stock Forecast Line"
msgstr ""
-msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgctxt "model:stock.forecast.line-stock.move,name:"
msgid "ForecastLine - Move"
msgstr ""
-msgctxt "model:workflow,name:wkf_forecast"
-msgid "Forecast"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_cancel"
-msgid "Cancel"
-msgstr "Отменить"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_done"
-msgid "Done"
-msgstr "Выполнено"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:forecast_act_draft"
-msgid "Draft"
-msgstr "Черновик"
-
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Cancel"
msgstr "Отменить"
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Done"
msgstr "Выполнено"
#, fuzzy
-msgctxt "selection:stock.forecast,state:0"
+msgctxt "selection:stock.forecast,state:"
msgid "Draft"
msgstr "Черновик"
-msgctxt "view:stock.forecast.complete.ask:0"
+msgctxt "view:stock.forecast.complete.ask:"
msgid "Choose dates"
msgstr ""
-msgctxt "view:stock.forecast.complete.choose:0"
+msgctxt "view:stock.forecast.complete.choose:"
msgid "Choose products"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Line"
msgstr ""
-msgctxt "view:stock.forecast.line:0"
+msgctxt "view:stock.forecast.line:"
msgid "Forecast Lines"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Add forecast line based on past data."
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Cancel"
msgstr "Отменить"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Complete Forecast"
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Confirm"
msgstr "Подтверждать"
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecast"
msgstr ""
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Forecasts"
msgstr ""
#, fuzzy
-msgctxt "view:stock.forecast:0"
+msgctxt "view:stock.forecast:"
msgid "Reset to Draft"
msgstr "Сброс в черновики"
-msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
-msgid "Complete"
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
-msgid "cancel"
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
-msgid "Choose Dates"
-msgstr ""
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Отменить"
-msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
-msgid "Choose products"
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
msgid "Complete"
msgstr ""
-msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
msgid "cancel"
msgstr ""
diff --git a/setup.py b/setup.py
index 89a6751..608f511 100644
--- a/setup.py
+++ b/setup.py
@@ -12,7 +12,7 @@ minor_version = int(minor_version)
requires = ['python-dateutil']
for dep in info.get('depends', []):
- if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+ if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
(dep, major_version, minor_version, major_version,
minor_version + 1))
diff --git a/tests/__init__.py b/tests/__init__.py
index 6a7efbf..00ff08d 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
#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 test_stock_forecast import suite
+from .test_stock_forecast import suite
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 9217e2e..695c77a 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -2,7 +2,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-import sys, os
+import sys
+import os
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
'..', '..', '..', '..', '..', 'trytond')))
if os.path.isdir(DIR):
@@ -71,11 +72,12 @@ class StockForecastTestCase(unittest.TestCase):
unit_id, = self.uom.search([('name', '=', 'Unit')])
product_id = self.product.create({
'name': 'Test create_moves',
- 'type': 'stockable',
+ 'type': 'goods',
'category': category_id,
'cost_price_method': 'fixed',
'default_uom': unit_id,
'list_price': Decimal('1'),
+ 'cost_price': Decimal(0),
})
customer_id, = self.location.search([('code', '=', 'CUS')])
warehouse_id, = self.location.search([('code', '=', 'WH')])
@@ -104,7 +106,7 @@ class StockForecastTestCase(unittest.TestCase):
),
],
})
- self.forecast.workflow_trigger_validate(forecast_id, 'done')
+ self.forecast.confirm([forecast_id])
self.forecast.create_moves([forecast_id])
forecast = self.forecast.browse(forecast_id)
@@ -141,6 +143,7 @@ class StockForecastTestCase(unittest.TestCase):
self.assertEqual(len(line.moves), 4)
self.assertEqual(sum(move.quantity for move in line.moves), 8)
+
def suite():
suite = trytond.tests.test_tryton.suite()
from trytond.modules.company.tests import test_company
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 52bb79a..892310c 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 2.2.1
+Version: 2.4.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index b063521..1191bb2 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -13,8 +13,10 @@ setup.py
./tests/test_stock_forecast.py
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_ES.po
locale/fr_FR.po
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 1e670c5..45fa6eb 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_stock >= 2.2, < 2.3
-trytond_product >= 2.2, < 2.3
-trytond_company >= 2.2, < 2.3
-trytond >= 2.2, < 2.3
\ No newline at end of file
+trytond_stock >= 2.4, < 2.5
+trytond_product >= 2.4, < 2.5
+trytond_company >= 2.4, < 2.5
+trytond >= 2.4, < 2.5
\ No newline at end of file
commit fb606dc6bad7143fe8731e4c403784a83fbefd85
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Dec 26 13:35:54 2011 +0100
Adding upstream version 2.2.1.
diff --git a/CHANGELOG b/CHANGELOG
index 5e55ec8..229540b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.2.1 - 2011-12-26
+* Bug fixes (see mercurial logs for details)
+
Version 2.2.0 - 2011-10-25
* Bug fixes (see mercurial logs for details)
* Forecast creates draft moves only on demand
diff --git a/PKG-INFO b/PKG-INFO
index e8530e1..6109463 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond_stock_forecast
-Version: 2.2.0
+Version: 2.2.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index 5bc832d..c652929 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '2.2.0',
+ 'version': '2.2.1',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 6d013cc..9217e2e 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -64,7 +64,7 @@ class StockForecastTestCase(unittest.TestCase):
'''
Test create_moves.
'''
- with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ with Transaction().start(DB_NAME, USER, context=CONTEXT):
category_id = self.category.create({
'name': 'Test create_moves',
})
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 0eb8196..52bb79a 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond-stock-forecast
-Version: 2.2.0
+Version: 2.2.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
commit a80cb5a55a593b6c32c3da9b5c9462ba0a285620
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 16:21:26 2011 +0100
Adding upstream version 2.2.0.
diff --git a/CHANGELOG b/CHANGELOG
index f4c91ab..5e55ec8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
-Version 2.0.1 - 2011-10-01
+Version 2.2.0 - 2011-10-25
* Bug fixes (see mercurial logs for details)
+* Forecast creates draft moves only on demand
+* Forecast works at warehouse level
+* Allow 'production' as destination
Version 2.0.0 - 2011-04-27
* Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index dcb2afa..32879df 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,5 +6,5 @@ include CHANGELOG
include LICENSE
include *.xml
include *.odt
-include *.csv
+include locale/*.po
include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index 35390dc..e8530e1 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 2.0.1
+Version: 2.2.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
@@ -17,18 +17,21 @@ Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index bea216c..5bc832d 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '2.0.1',
+ 'version': '2.2.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -20,7 +20,7 @@ spread homogeneously across the period. Those moves will allow other
process to take forecasts into account.
''',
'description_bg_BG':'''Предоставя модел за "прогнозиране" при управление на инвентазирация
- - Формата за "Прогноза" позволява да се зададат очакваните движения на наличност
+ - Формата за "Прогноза" позволява да се зададат очакваните движения на наличност
към клиенти в бъдещ период. Помощник позволява да се изчислят очакваните
количества отчитайки периоди в миналто. След потвърждаване на формата, съответните
движения биват създадени и разпределени равномерно за периода. Тези движения
@@ -75,10 +75,13 @@ prévisions.
'forecast.xml',
],
'translation': [
- 'bg_BG.csv',
- 'de_DE.csv',
- 'es_CO.csv',
- 'es_ES.csv',
- 'fr_FR.csv',
+ 'locale/cs_CZ.po',
+ 'locale/bg_BG.po',
+ 'locale/de_DE.po',
+ 'locale/es_CO.po',
+ 'locale/es_ES.po',
+ 'locale/fr_FR.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/bg_BG.csv b/bg_BG.csv
deleted file mode 100644
index fc61797..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,66 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","Стойността на ""До дата"" трябва да е по-голяма от тази на ""От дата""!",0
-error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Не може да създавате прогнози за еднао и също местонахиждение за припокриващи се периоди,0
-error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","Стойността на ""От дата"" трябва да е по-малка от тази на ""До дата""!",0
-error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,Количество на ред трябва да е по-голямо от минималното количество!,0
-error,stock.forecast.line,0,Line quantity must be positive!,Количеството на реда трябва да е положително число!,0
-error,stock.forecast.line,0,Product must be unique by forcast!,Продукта трябва да уникален по прогноза!,0
-field,"stock.forecast,company",0,Company,Фирма,0
-field,"stock.forecast,destination",0,Destination,Местонахождение-цел,0
-field,"stock.forecast,from_date",0,From Date,От дата,0
-field,"stock.forecast,lines",0,Lines,Редове,0
-field,"stock.forecast,location",0,Location,Местоположение,0
-field,"stock.forecast,rec_name",0,Name,Име,0
-field,"stock.forecast,state",0,State,Състояние,0
-field,"stock.forecast,to_date",0,To Date,До дата,0
-field,"stock.forecast.complete.ask,from_date",0,From Date,От дата,0
-field,"stock.forecast.complete.ask,to_date",0,To Date,До дата,0
-field,"stock.forecast.complete.choose,products",0,Products,Продукти,0
-field,"stock.forecast.line,forecast",0,Forecast,Прогноза,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,"Мин, к-во",0
-field,"stock.forecast.line,moves",0,Moves,Движения,0
-field,"stock.forecast.line,product",0,Product,Продукт,0
-field,"stock.forecast.line,quantity",0,Quantity,Количество,0
-field,"stock.forecast.line,rec_name",0,Name,Име,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Десетични единици,0
-field,"stock.forecast.line,uom",0,UOM,Мер. ед.,0
-field,"stock.forecast.line-stock.move,line",0,Forecast Line,Ред от прогноза,0
-field,"stock.forecast.line-stock.move,move",0,Move,Движение,0
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Име,0
-model,"ir.action,name",act_forecast_form,Forecasts,Прогнози,0
-model,"ir.action,name",act_forecast_form2,Forecasts,Прогнози,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Проект на прогноза,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Изготвяне на прогноза,0
-model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Прогнози,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Проект на прогноза,0
-model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Нова прогноза,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Прогноза за наличност,0
-model,"stock.forecast,name",0,Stock Forecast,Прогноза за наличност,0
-model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Запитване за изготвяне на прогноза,0
-model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Изготвяне на прогноза - Избор,0
-model,"stock.forecast.line,name",0,Stock Forecast Line,Ред от прогноза за наличност,0
-model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Ред от прогноза - Движение,0
-model,"workflow,name",wkf_forecast,Forecast,Прогноза,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Отказ,0
-model,"workflow.activity,name",forecast_act_done,Done,Приключен,0
-model,"workflow.activity,name",forecast_act_draft,Draft,Проект,0
-selection,"stock.forecast,state",0,Cancel,Отказ,0
-selection,"stock.forecast,state",0,Done,Приключен,0
-selection,"stock.forecast,state",0,Draft,Проект,0
-view,stock.forecast,0,Add forecast line based on past data.,Добавяне на ред от прогноза въз основа на минали данни,0
-view,stock.forecast,0,Cancel,Отказ,0
-view,stock.forecast,0,Complete Forecast,Изготвяне на прогноза,0
-view,stock.forecast,0,Confirm,Потвърждаване,0
-view,stock.forecast,0,Forecast,Прогноза,0
-view,stock.forecast,0,Forecasts,Прогнози,0
-view,stock.forecast,0,Reset to Draft,Изпращане в проект,0
-view,stock.forecast.complete.ask,0,Choose dates,Избор на дати,0
-view,stock.forecast.complete.choose,0,Choose products,Избор на продукти,0
-view,stock.forecast.line,0,Forecast Line,Ред от прогноза,0
-view,stock.forecast.line,0,Forecast Lines,Редове от прогноза,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Пълен,0
-wizard_button,"stock.forecast.complete,choose,end",0,cancel,Отказ,0
-wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Избор на дати,0
-wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Избор на продукти,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Пълен,0
-wizard_button,"stock.forecast.complete,init,end",0,cancel,Отказ,0
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index 1e0fc90..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,66 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""Bis Datum"" muss größer sein als ""Von Datum""",0
-error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Bei Bedarfsermittlungen für den selben Lagerort darf sich das Datum nicht überschneiden!,0
-error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","""Von Datum"" muss kleiner als ""Bis Datum"" sein!",0
-error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,Anzahl der Position muss größer als die Minimalanzahl sein!,0
-error,stock.forecast.line,0,Line quantity must be positive!,Anzahl der Position muss positiv sein!,0
-error,stock.forecast.line,0,Product must be unique by forcast!,Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!,0
-field,"stock.forecast,company",0,Company,Unternehmen,0
-field,"stock.forecast,destination",0,Destination,Bestimmungsort,0
-field,"stock.forecast,from_date",0,From Date,Von Datum,0
-field,"stock.forecast,lines",0,Lines,Positionen,0
-field,"stock.forecast,location",0,Location,Lagerort,0
-field,"stock.forecast,rec_name",0,Name,Name,0
-field,"stock.forecast,state",0,State,Status,0
-field,"stock.forecast,to_date",0,To Date,Bis Datum,0
-field,"stock.forecast.complete.ask,from_date",0,From Date,Von Datum,0
-field,"stock.forecast.complete.ask,to_date",0,To Date,Bis Datum,0
-field,"stock.forecast.complete.choose,products",0,Products,Artikel,0
-field,"stock.forecast.line,forecast",0,Forecast,Bedarfsermittlung,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Minimale Anzahl,0
-field,"stock.forecast.line,moves",0,Moves,Bewegungen,0
-field,"stock.forecast.line,product",0,Product,Artikel,0
-field,"stock.forecast.line,quantity",0,Quantity,Anzahl,0
-field,"stock.forecast.line,rec_name",0,Name,Name,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
-field,"stock.forecast.line,uom",0,UOM,Maßeinheit,0
-field,"stock.forecast.line-stock.move,line",0,Forecast Line,Position Bedarfsermittlung,0
-field,"stock.forecast.line-stock.move,move",0,Move,Bewegung,0
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Name,0
-model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
-model,"ir.action,name",act_forecast_form2,Forecasts,Bedarfsermittlung,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe Bedarfsermittlung,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
-model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe Bedarfsermittlung,0
-model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Neue Bedarfsermittlung,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Lager Bedarfsermittlung,0
-model,"stock.forecast,name",0,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
-model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Bedarfsermittlung Durchführen Nachfrage,0
-model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Bedarfsermittlung Durchführen Auswahl,0
-model,"stock.forecast.line,name",0,Stock Forecast Line,Position Bedarfsermittlung Lagerhaltung,0
-model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Position Bedarfsermittlung - Bewegung,0
-model,"workflow,name",wkf_forecast,Forecast,Bedarfsermittlung,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Annullieren,0
-model,"workflow.activity,name",forecast_act_done,Done,Erledigt,0
-model,"workflow.activity,name",forecast_act_draft,Draft,Entwurf,0
-selection,"stock.forecast,state",0,Cancel,Annulliert,0
-selection,"stock.forecast,state",0,Done,Erledigt,0
-selection,"stock.forecast,state",0,Draft,Entwurf,0
-view,stock.forecast,0,Add forecast line based on past data.,Erstelle Bedarfspositionen basierend auf den Werten aus der Vergangenheit,0
-view,stock.forecast,0,Cancel,Annullieren,0
-view,stock.forecast,0,Complete Forecast,Bedarfsermittlung durchführen,0
-view,stock.forecast,0,Confirm,Bestätigen,0
-view,stock.forecast,0,Forecast,Bedarfsermittlung,0
-view,stock.forecast,0,Forecasts,Bedarfsermittlung,0
-view,stock.forecast,0,Reset to Draft,Auf Entwurf zurücksetzen,0
-view,stock.forecast.complete.ask,0,Choose dates,Auswahl Datum,0
-view,stock.forecast.complete.choose,0,Choose products,Auswahl Artikel,0
-view,stock.forecast.line,0,Forecast Line,Position Bedarfsermittlung,0
-view,stock.forecast.line,0,Forecast Lines,Positionen Bedarfsermittlung,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Durchführen,0
-wizard_button,"stock.forecast.complete,choose,end",0,cancel,Abbrechen,0
-wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Auswahl Datum,0
-wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Auswahl Artikel,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Durchführen,0
-wizard_button,"stock.forecast.complete,init,end",0,cancel,Abbrechen,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index 56f7497..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,66 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""Hasta la Fecha"" debe ser mayor que ""Desde la Fecha""",0
-error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,No puede crear proyecciones para la misma localización con fechas sobrepuestas,0
-error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","¡""Desde la Fecha"" puede ser menor que ""A la Fecha""!",0
-error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,¡La cantidad por línea debe ser mayor que la mínima cantidad!,0
-error,stock.forecast.line,0,Line quantity must be positive!,La línea de cantidad debe ser positiva!,0
-error,stock.forecast.line,0,Product must be unique by forcast!,¡El producto debe ser único por proyección!,0
-field,"stock.forecast,company",0,Company,Compañía,0
-field,"stock.forecast.complete.ask,from_date",0,From Date,Fecha Inicial,0
-field,"stock.forecast.complete.ask,to_date",0,To Date,A la Fecha,0
-field,"stock.forecast.complete.choose,products",0,Products,Productos,0
-field,"stock.forecast,destination",0,Destination,Destino,0
-field,"stock.forecast,from_date",0,From Date,Fecha Inicial,0
-field,"stock.forecast.line,forecast",0,Forecast,Proyección,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad Mínima,0
-field,"stock.forecast.line,moves",0,Moves,Movimientos,0
-field,"stock.forecast.line,product",0,Product,Productos,0
-field,"stock.forecast.line,quantity",0,Quantity,Cantidad,0
-field,"stock.forecast.line,rec_name",0,Name,Nombre de Contacto,0
-field,"stock.forecast,lines",0,Lines,Líneas de Inventario,0
-field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de Proyección,0
-field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,0
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
-field,"stock.forecast.line,uom",0,UOM,UDM,0
-field,"stock.forecast,location",0,Location,Lugar,0
-field,"stock.forecast,rec_name",0,Name,Nombre,0
-field,"stock.forecast,state",0,State,Estado,0
-field,"stock.forecast,to_date",0,To Date,A la Fecha,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Proyección Completa,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Proyección de Pruebas,0
-model,"ir.action,name",act_forecast_form,Forecasts,Proyecciones,0
-model,"ir.action,name",act_forecast_form2,Forecasts,Proyecciones,1
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Proyección de Pruebas,0
-model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Proyecciones,0
-model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Nueva Proyección,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Proyección de Almacén,0
-model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Pregunta de Proyección Completa,0
-model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Escojencia de Proyección Completa,0
-model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de Proyección de Alamacén,0
-model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Línea de Proyección - Mover,0
-model,"stock.forecast,name",0,Stock Forecast,Proyección de Almacén,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,0
-model,"workflow.activity,name",forecast_act_done,Done,Hecho,0
-model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,0
-model,"workflow,name",wkf_forecast,Forecast,Proyección,0
-selection,"stock.forecast,state",0,Cancel,Cancelar,0
-selection,"stock.forecast,state",0,Done,Hecho,0
-selection,"stock.forecast,state",0,Draft,Borrador,0
-view,stock.forecast,0,Add forecast line based on past data.,Adicione líneas de proyecciones basadas en fechas pasadas.,0
-view,stock.forecast,0,Cancel,Cancelar,0
-view,stock.forecast,0,Complete Forecast,Proyección Completa,0
-view,stock.forecast,0,Confirm,Confirmar,0
-view,stock.forecast,0,Forecast,Proyección,0
-view,stock.forecast,0,Forecasts,Proyecciones,0
-view,stock.forecast,0,Reset to Draft,Revertir a Borrador,0
-view,stock.forecast.complete.ask,0,Choose dates,Escoja fechas,0
-view,stock.forecast.complete.choose,0,Choose products,Escoja productos,0
-view,stock.forecast.line,0,Forecast Line,Línea de Proyección,0
-view,stock.forecast.line,0,Forecast Lines,Líneas de Proyección,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,0
-wizard_button,"stock.forecast.complete,choose,end",0,cancel,cancelar,0
-wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Escoja fechas,0
-wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Escoja productos,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,0
-wizard_button,"stock.forecast.complete,init,end",0,cancel,cancelar,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 706d40c..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,62 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!",«Hasta la fecha» debe ser más reciente que «Desde la fecha»,0
-error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,No puede crear previsiones para las mísmas ubicaciones con fechas solapadas,0
-error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!",«Desde la fecha» debe ser anterior a «Hasta la fecha»,0
-error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,La línea cantidad debe ser mayor que la cantidad mínima,0
-error,stock.forecast.line,0,Line quantity must be positive!,La cantidad de la línea debe ser positiva,0
-error,stock.forecast.line,0,Product must be unique by forcast!,El producto debe ser único por previsión,0
-field,"stock.forecast,company",0,Company,Empresa,0
-field,"stock.forecast.complete.ask,from_date",0,From Date,Desde la fecha,0
-field,"stock.forecast.complete.ask,to_date",0,To Date,Hasta la fecha,0
-field,"stock.forecast.complete.choose,products",0,Products,Productos,0
-field,"stock.forecast,destination",0,Destination,Destino,0
-field,"stock.forecast,from_date",0,From Date,Desde la fecha,0
-field,"stock.forecast.line,forecast",0,Forecast,Previsión,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad mínima,0
-field,"stock.forecast.line,moves",0,Moves,Movimientos,0
-field,"stock.forecast.line,product",0,Product,Producto,0
-field,"stock.forecast.line,quantity",0,Quantity,Cantidad,0
-field,"stock.forecast.line,rec_name",0,Name,Nombre,0
-field,"stock.forecast,lines",0,Lines,Líneas,0
-field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de previsión,0
-field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,0
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Decimales de la unidad,0
-field,"stock.forecast.line,uom",0,UOM,UdM,0
-field,"stock.forecast,location",0,Location,Ubicación,0
-field,"stock.forecast,rec_name",0,Name,Nombre,0
-field,"stock.forecast,state",0,State,Estado,0
-field,"stock.forecast,to_date",0,To Date,Hasta la fecha,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Previsión completa,0
-model,"ir.action,name",act_forecast_form,Forecasts,Previsión,0
-model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Previsiones,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Previsión de existéncias,0
-model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Pedir previsión completa,0
-model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Elegir previsión completa,0
-model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de previsión de existencias,0
-model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,LineaPrevisión - Movimiento,0
-model,"stock.forecast,name",0,Stock Forecast,Previsión de existencias,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,0
-model,"workflow.activity,name",forecast_act_done,Done,Terminada,0
-model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,0
-model,"workflow,name",wkf_forecast,Forecast,Previsión,0
-selection,"stock.forecast,state",0,Cancel,Cancelar,0
-selection,"stock.forecast,state",0,Done,Terminada,0
-selection,"stock.forecast,state",0,Draft,Borrador,0
-view,stock.forecast,0,Add forecast line based on past data.,Añadir línea de previsión en base a datos anteriores.,0
-view,stock.forecast,0,Cancel,Cancelar,0
-view,stock.forecast,0,Complete Forecast,Previsión completa,0
-view,stock.forecast,0,Confirm,Confirmar,0
-view,stock.forecast,0,Forecast,Previsión,0
-view,stock.forecast,0,Forecasts,Previsiones,0
-view,stock.forecast,0,Reset to Draft,Restablecer a borrador,0
-view,stock.forecast.complete.ask,0,Choose dates,Elegir fechas,0
-view,stock.forecast.complete.choose,0,Choose products,Elegir productos,0
-view,stock.forecast.line,0,Forecast Line,Línea de previsión,0
-view,stock.forecast.line,0,Forecast Lines,Líneas de previsión,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,0
-wizard_button,"stock.forecast.complete,choose,end",0,cancel,cancelar,0
-wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Elegir fechas,0
-wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Elegir productos,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,0
-wizard_button,"stock.forecast.complete,init,end",0,cancel,cancelar,0
diff --git a/forecast.py b/forecast.py
index 6909623..34c0148 100644
--- a/forecast.py
+++ b/forecast.py
@@ -1,44 +1,53 @@
#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 __future__ import with_statement
import datetime
import time
from dateutil.relativedelta import relativedelta
+import itertools
from trytond.model import ModelView, ModelWorkflow, ModelSQL, fields
from trytond.wizard import Wizard
from trytond.pyson import Not, Equal, Eval, Or, Bool
from trytond.backend import TableHandler
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.tools import reduce_ids
STATES = {
'readonly': Not(Equal(Eval('state'), 'draft')),
}
+DEPENDS = ['state']
class Forecast(ModelWorkflow, ModelSQL, ModelView):
"Stock Forecast"
_name = "stock.forecast"
_description = __doc__
- _rec_name = 'location'
+ _rec_name = 'warehouse'
- location = fields.Many2One(
+ warehouse = fields.Many2One(
'stock.location', 'Location', required=True,
- domain=[('type', '=', 'storage')], states={
+ domain=[('type', '=', 'warehouse')], states={
'readonly': Or(Not(Equal(Eval('state'), 'draft')),
Bool(Eval('lines'))),
- })
+ },
+ depends=['state', 'lines'])
destination = fields.Many2One(
'stock.location', 'Destination', required=True,
- domain=[('type', '=', 'customer')], states=STATES)
- from_date = fields.Date('From Date', required=True, states=STATES)
- to_date = fields.Date('To Date', required=True, states=STATES)
+ domain=[('type', 'in', ['customer', 'production'])], states=STATES,
+ depends=DEPENDS)
+ from_date = fields.Date('From Date', required=True, states=STATES,
+ depends=DEPENDS)
+ to_date = fields.Date('To Date', required=True, states=STATES,
+ depends=DEPENDS)
lines = fields.One2Many(
- 'stock.forecast.line', 'forecast', 'Lines', states=STATES)
+ 'stock.forecast.line', 'forecast', 'Lines', states=STATES,
+ depends=DEPENDS)
company = fields.Many2One(
'company.company', 'Company', required=True, states={
'readonly': Or(Not(Equal(Eval('state'), 'draft')),
Bool(Eval('lines'))),
- })
+ },
+ depends=['state', 'lines'])
state = fields.Selection([
('draft', 'Draft'),
('done', 'Done'),
@@ -63,21 +72,53 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
'locations with overlapping dates'
})
self._order.insert(0, ('from_date', 'DESC'))
- self._order.insert(1, ('location', 'ASC'))
+ self._order.insert(1, ('warehouse', 'ASC'))
def init(self, module_name):
+ location_obj = Pool().get('stock.location')
cursor = Transaction().cursor
+
+ table = TableHandler(cursor, self, module_name)
+ migrate_warehouse = (not table.column_exist('warehouse')
+ and table.column_exist('location'))
+
super(Forecast, self).init(module_name)
# Add index on create_date
table = TableHandler(cursor, self, module_name)
table.index_action('create_date', action='add')
+ if migrate_warehouse:
+ location2warehouse = {}
+ def find_warehouse(location):
+ if location.type == 'warehouse':
+ return location.id
+ elif location.parent:
+ return find_warehouse(location.parent)
+ cursor.execute('SELECT id, location FROM "%s"' % self._table)
+ for forecast_id, location_id in cursor.fetchall():
+ warehouse_id = location_id # default fallback
+ if location_id in location2warehouse:
+ warehouse_id = location2warehouse[location_id]
+ else:
+ location = location_obj.browse(location_id)
+ warehouse_id = find_warehouse(location) or location_id
+ location2warehouse[location_id] = warehouse_id
+ cursor.execute('UPDATE "%s" SET warehouse = %%s '
+ 'WHERE id = %%s' % self._table, (warehouse_id, forecast_id))
+ table.not_null_action('warehouse',
+ action=self.warehouse.required and 'add' or 'remove')
+ table.drop_column('location', True)
+
+ # Migration from 2.0 delete stock moves
+ forecast_ids = self.search([])
+ self.delete_moves(forecast_ids)
+
def default_state(self):
return 'draft'
def default_destination(self):
- location_obj = self.pool.get('stock.location')
+ location_obj = Pool().get('stock.location')
location_ids = location_obj.search(
self.destination.domain)
if len(location_ids) == 1:
@@ -97,7 +138,7 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
'WHERE ((from_date <= %s AND to_date >= %s) ' \
'OR (from_date <= %s AND to_date >= %s) ' \
'OR (from_date >= %s AND to_date <= %s)) ' \
- 'AND location = %s ' \
+ 'AND warehouse = %s ' \
'AND destination = %s ' \
'AND state = \'done\' ' \
'AND company = %s '
@@ -105,7 +146,7 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
(forecast.from_date, forecast.from_date,
forecast.to_date, forecast.to_date,
forecast.from_date, forecast.to_date,
- forecast.location.id, forecast.destination.id,
+ forecast.warehouse.id, forecast.destination.id,
forecast.company.id, forecast.id))
rowcount = cursor.rowcount
if rowcount == -1 or rowcount is None:
@@ -118,32 +159,42 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
self.workflow_trigger_create(ids)
return True
- def set_state_draft(self, forecast_id):
- line_obj = self.pool.get("stock.forecast.line")
- forecast = self.browse(forecast_id)
- if forecast.state == "done":
- line_obj.cancel_moves(forecast.lines)
- self.write(forecast_id, {
+ def wkf_draft(self, forecast):
+ self.write(forecast.id, {
'state': 'draft',
})
- def set_state_cancel(self, forecast_id):
- self.write(forecast_id, {
+ def wkf_cancel(self, forecast):
+ self.write(forecast.id, {
'state': 'cancel',
})
- def set_state_done(self, forecast_id):
- line_obj = self.pool.get('stock.forecast.line')
- forecast = self.browse(forecast_id)
-
- for line in forecast.lines:
- line_obj.create_moves(line)
- self.write(forecast_id, {
+ def wkf_done(self, forecast):
+ self.write(forecast.id, {
'state': 'done',
})
+ def create_moves(self, forecast_ids):
+ 'Create stock moves for the forecast ids'
+ line_obj = Pool().get('stock.forecast.line')
+
+ forecasts = self.browse(forecast_ids)
+ for forecast in forecasts:
+ if forecast.state == 'done':
+ for line in forecast.lines:
+ line_obj.create_moves(line)
+
+ def delete_moves(self, forecast_ids):
+ 'Delete stock moves for the forecast ids'
+ line_obj = Pool().get('stock.forecast.line')
+
+ forecasts = self.browse(forecast_ids)
+ for forecast in forecasts:
+ for line in forecast.lines:
+ line_obj.delete_moves(line)
+
def copy(self, ids, default=None):
- line_obj = self.pool.get('stock.forecast.line')
+ line_obj = Pool().get('stock.forecast.line')
int_id = False
if isinstance(ids, (int, long)):
@@ -179,22 +230,25 @@ class ForecastLine(ModelSQL, ModelView):
product = fields.Many2One('product.product', 'Product', required=True,
domain=[('type', '=', 'stockable')], on_change=['product'])
- uom = fields.Many2One(
- 'product.uom', 'UOM', required=True,
+ uom = fields.Many2One('product.uom', 'UOM', required=True,
domain=[
('category', '=',
(Eval('product'), 'product.default_uom.category')),
- ], on_change=['uom'])
+ ], on_change=['uom'], depends=['product'])
unit_digits = fields.Function(fields.Integer('Unit Digits'),
'get_unit_digits')
quantity = fields.Float('Quantity', digits=(16, Eval('unit_digits', 2)),
- required=True)
+ required=True, depends=['unit_digits'])
minimal_quantity = fields.Float('Minimal Qty',
- digits=(16, Eval('unit_digits', 2)), required=True)
+ digits=(16, Eval('unit_digits', 2)), required=True,
+ depends=['unit_digits'])
moves = fields.Many2Many('stock.forecast.line-stock.move',
'line', 'move','Moves', readonly=True)
forecast = fields.Many2One(
- 'stock.forecast', 'Forecast', required=True, ondelete='CASCADE',)
+ 'stock.forecast', 'Forecast', required=True, ondelete='CASCADE')
+ quantity_executed = fields.Function(fields.Float('Quantity Executed',
+ digits=(16, Eval('unit_digits', 2)), depends=['unit_digits']),
+ 'get_quantity_executed')
def __init__(self):
super(ForecastLine, self).__init__()
@@ -215,7 +269,7 @@ class ForecastLine(ModelSQL, ModelView):
return 1.0
def on_change_product(self, vals):
- product_obj = self.pool.get('product.product')
+ product_obj = Pool().get('product.product')
res = {}
res['unit_digits'] = 2
if vals.get('product'):
@@ -226,7 +280,7 @@ class ForecastLine(ModelSQL, ModelView):
return res
def on_change_uom(self, vals):
- uom_obj = self.pool.get('product.uom')
+ uom_obj = Pool().get('product.uom')
res = {}
res['unit_digits'] = 2
if vals.get('uom'):
@@ -240,6 +294,51 @@ class ForecastLine(ModelSQL, ModelView):
res[line.id] = line.product.default_uom.digits
return res
+ def get_quantity_executed(self, ids, name):
+ cursor = Transaction().cursor
+ move_obj = Pool().get('stock.move')
+ location_obj = Pool().get('stock.location')
+ uom_obj = Pool().get('product.uom')
+ forecast_obj = Pool().get('stock.forecast')
+ line_move_obj = Pool().get('stock.forecast.line-stock.move')
+
+ result = dict((x, 0) for x in ids)
+ lines = self.browse(ids)
+ key = lambda line: line.forecast.id
+ lines.sort(key=key)
+ for forecast_id, lines in itertools.groupby(lines, key):
+ forecast = forecast_obj.browse(forecast_id)
+ product2line = dict((line.product.id, line) for line in lines)
+ product_ids = product2line.keys()
+ for i in range(0, len(product_ids), cursor.IN_MAX):
+ sub_ids = product_ids[i:i + cursor.IN_MAX]
+ red_sql, red_ids = reduce_ids('product', sub_ids)
+ cursor.execute('SELECT m.product, '
+ 'SUM(m.internal_quantity) AS quantity '
+ 'FROM "' + move_obj._table + '" AS m '
+ 'JOIN "' + location_obj._table + '" AS fl '
+ 'ON m.from_location = fl.id '
+ 'JOIN "' + location_obj._table + '" AS tl '
+ 'ON m.to_location = tl.id '
+ 'LEFT JOIN "' + line_move_obj._table + '" AS lm '
+ 'ON m.id = lm.move '
+ 'WHERE ' + red_sql + ' '
+ 'AND fl.left >= %s AND fl.right <= %s '
+ 'AND tl.left >= %s AND tl.right <= %s '
+ 'AND m.state != %s '
+ 'AND COALESCE(m.effective_date, m.planned_date) >= %s '
+ 'AND COALESCE(m.effective_date, m.planned_date) <= %s '
+ 'AND lm.id IS NULL '
+ 'GROUP BY m.product',
+ red_ids + [forecast.warehouse.left, forecast.warehouse.right,
+ forecast.destination.left, forecast.destination.right,
+ 'cancel', forecast.from_date, forecast.to_date])
+ for product_id, quantity in cursor.fetchall():
+ line = product2line[product_id]
+ result[line.id] = uom_obj.compute_qty(
+ line.product.default_uom, quantity, line.uom)
+ return result
+
def copy(self, ids, default=None):
if default is None:
default = {}
@@ -248,16 +347,30 @@ class ForecastLine(ModelSQL, ModelView):
return super(ForecastLine, self).copy(ids, default=default)
def create_moves(self, line):
- move_obj = self.pool.get('stock.move')
- uom_obj = self.pool.get('product.uom')
- delta = line.forecast.to_date - line.forecast.from_date
+ 'Create stock moves for the forecast line'
+ move_obj = Pool().get('stock.move')
+ uom_obj = Pool().get('product.uom')
+ date_obj = Pool().get('ir.date')
+
+ assert not line.moves
+
+ today = date_obj.today()
+ from_date = line.forecast.from_date
+ if from_date < today:
+ from_date = today
+ to_date = line.forecast.to_date
+ if to_date < today:
+ return
+
+ delta = to_date - from_date
delta = delta.days + 1
- nb_packet = int(line.quantity/line.minimal_quantity)
+ nb_packet = int((line.quantity - line.quantity_executed)
+ / line.minimal_quantity)
distribution = self.distribute(delta, nb_packet)
unit_price = False
if line.forecast.destination.type == 'customer':
unit_price = line.product.list_price
- unit_price = uom_obj.compute_price(line.product.default_uom,
+ unit_price = uom_obj.compute_price(line.product.default_uom,
unit_price, line.uom)
moves = []
@@ -265,26 +378,27 @@ class ForecastLine(ModelSQL, ModelView):
if qty == 0.0:
continue
mid = move_obj.create({
- 'from_location': line.forecast.location.id,
+ 'from_location': line.forecast.warehouse.storage_location.id,
'to_location': line.forecast.destination.id,
'product': line.product.id,
'uom': line.uom.id,
'quantity': qty * line.minimal_quantity,
- 'planned_date': line.forecast.from_date + datetime.timedelta(day),
+ 'planned_date': (line.forecast.from_date
+ + datetime.timedelta(day)),
'company': line.forecast.company.id,
'currency':line.forecast.company.currency.id,
'unit_price': unit_price,
})
- moves.append(('add',mid))
- self.write(line.id, {'moves': moves})
+ moves.append(mid)
+ self.write(line.id, {'moves': [('set', moves)]})
- def cancel_moves(self, lines):
- move_obj = self.pool.get('stock.move')
- move_obj.write([m.id for l in lines for m in l.moves],
- {'state': 'cancel'})
- move_obj.delete([m.id for l in lines for m in l.moves])
+ def delete_moves(self, line):
+ 'Delete stock moves of the forecast line'
+ move_obj = Pool().get('stock.move')
+ move_obj.delete([m.id for m in line.moves])
def distribute(self, delta, qty):
+ 'Distribute qty over delta'
range_delta = range(delta)
a = {}.fromkeys(range_delta, 0)
while qty > 0:
@@ -394,7 +508,7 @@ class ForecastComplete(Wizard):
"""
Forecast dates shifted by one year.
"""
- forecast_obj = self.pool.get('stock.forecast')
+ forecast_obj = Pool().get('stock.forecast')
forecast = forecast_obj.browse(data['id'])
res = {}
@@ -403,8 +517,8 @@ class ForecastComplete(Wizard):
return res
def _get_product_quantity(self, data):
- forecast_obj = self.pool.get('stock.forecast')
- product_obj = self.pool.get('product.product')
+ forecast_obj = Pool().get('stock.forecast')
+ product_obj = Pool().get('product.product')
forecast = forecast_obj.browse(data['id'])
if data['form']['from_date'] > data['form']['to_date']:
self.raise_user_error('from_to_date')
@@ -413,7 +527,7 @@ class ForecastComplete(Wizard):
stock_destination=[forecast.destination.id],
stock_date_start=data['form']['from_date'],
stock_date_end=data['form']['to_date']):
- return product_obj.products_by_location([forecast.location.id],
+ return product_obj.products_by_location([forecast.warehouse.id],
with_childs=True, skip_zero=False)
def _set_default_products(self, data):
@@ -430,9 +544,10 @@ class ForecastComplete(Wizard):
return data['form']
def _complete(self, data):
- forecast_obj = self.pool.get('stock.forecast')
- forecast_line_obj = self.pool.get('stock.forecast.line')
- product_obj = self.pool.get('product.product')
+ pool = Pool()
+ forecast_obj = pool.get('stock.forecast')
+ forecast_line_obj = pool.get('stock.forecast.line')
+ product_obj = pool.get('product.product')
prod2line = {}
forecast_line_ids = forecast_line_obj.search([
@@ -452,7 +567,8 @@ class ForecastComplete(Wizard):
else:
products = None
- for (_, product), qty in pbl.iteritems():
+ for key, qty in pbl.iteritems():
+ _, product = key
if products and product not in products:
continue
if -qty <= 0:
diff --git a/forecast.xml b/forecast.xml
index 897f20b..28f4db8 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -6,14 +6,17 @@ this repository contains the full copyright notices and license terms. -->
<record model="res.group" id="group_stock_forecast">
<field name="name">Stock Forecast</field>
</record>
- <record model="res.user" id="res.user_admin">
- <field name="groups"
- eval="[('add', ref('group_stock_forecast'))]"/>
+ <record model="res.user-res.group"
+ id="user_admin_group_stock_forecast">
+ <field name="user" ref="res.user_admin"/>
+ <field name="group" ref="group_stock_forecast"/>
</record>
- <record model="res.user" id="res.user_trigger">
- <field name="groups"
- eval="[('add', ref('group_stock_forecast'))]"/>
+ <record model="res.user-res.group"
+ id="user_trigger_group_stock_forecast">
+ <field name="user" ref="res.user_trigger"/>
+ <field name="group" ref="group_stock_forecast"/>
</record>
+
<record model="ir.action.wizard" id="wizard_forecast_complete">
<field name="name">Complete Forecast</field>
<field name="wiz_name">stock.forecast.complete</field>
@@ -26,8 +29,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Forecast" col="4">
- <label name="location"/>
- <field name="location"/>
+ <label name="warehouse"/>
+ <field name="warehouse"/>
<label name="destination"/>
<field name="destination"/>
<label name="from_date"/>
@@ -71,12 +74,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Forecasts">
- <field name="location" select="1"/>
- <field name="state" select="1"/>
+ <field name="warehouse"/>
+ <field name="state"/>
<field name="from_date"/>
<field name="to_date"/>
- <field name="company" select="2"/>
- <field name="create_date" tree_invisible="1" select="2"/>
+ <field name="company"/>
+ <field name="create_date" tree_invisible="1"/>
</tree>
]]>
</field>
@@ -84,7 +87,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_forecast_form">
<field name="name">Forecasts</field>
<field name="res_model">stock.forecast</field>
- <field name="search_value">{'create_date': ['between', Date(delta_years=-2)]}</field>
+ <field name="search_value">[('create_date', '>=', DateTime(hour=0, minute=0, second=0, microsecond=0, delta_years=-2))]</field>
</record>
<record model="ir.action.act_window.view"
id="act_forecast_form_view1">
@@ -101,26 +104,6 @@ this repository contains the full copyright notices and license terms. -->
<menuitem parent="stock.menu_stock" sequence="50"
action="act_forecast_form" id="menu_forecast_form"/>
- <record model="ir.action.act_window" id="act_forecast_form2">
- <field name="name">Forecasts</field>
- <field name="res_model">stock.forecast</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_forecast_form2_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="forecast_view_form"/>
- <field name="act_window" ref="act_forecast_form2"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_forecast_form2_view2">
- <field name="sequence" eval="20"/>
- <field name="view" ref="forecast_view_tree"/>
- <field name="act_window" ref="act_forecast_form2"/>
- </record>
- <menuitem name="New Forecast" parent="menu_forecast_form"
- action="act_forecast_form2" id="menu_forecast_form_new"
- sequence="10"/>
-
<record model="ir.action.act_window" id="act_forecast_form_draft">
<field name="name">Draft Forecasts</field>
<field name="res_model">stock.forecast</field>
@@ -158,7 +141,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="minimal_quantity"/>
<label name="uom"/>
<field name="uom"/>
- <separator name="moves" colspan="4"/>
+ <label name="quantity_executed"/>
+ <field name="quantity_executed"/>
<field name="moves" colspan="4"/>
<field name="unit_digits" invisible="1" colspan="4"/>
</form>
@@ -171,11 +155,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Forecast Lines" editable="bottom">
- <field name="product" select="1"/>
- <field name="quantity" select="1"/>
- <field name="minimal_quantity" select="2"/>
- <field name="uom" select="1"/>
- <field name="forecast" select="2"/>
+ <field name="product"/>
+ <field name="quantity"/>
+ <field name="minimal_quantity"/>
+ <field name="uom"/>
+ <field name="quantity_executed"/>
+ <field name="forecast"/>
<field name="unit_digits" tree_invisible="1"/>
</tree>
]]>
@@ -191,23 +176,20 @@ this repository contains the full copyright notices and license terms. -->
<record model="workflow.activity" id="forecast_act_draft">
<field name="workflow" ref="wkf_forecast"/>
<field name="flow_start">True</field>
- <field name="kind">function</field>
- <field name="action">set_state_draft()</field>
+ <field name="method">wkf_draft</field>
<field name="name">Draft</field>
</record>
<record model="workflow.activity" id="forecast_act_cancel">
<field name="workflow" ref="wkf_forecast"/>
<field name="flow_stop">True</field>
<field name="name">Cancel</field>
- <field name="kind">function</field>
- <field name="action">set_state_cancel()</field>
+ <field name="method">wkf_cancel</field>
</record>
<record model="workflow.activity" id="forecast_act_done">
<field name="workflow" ref="wkf_forecast"/>
<field name="flow_stop">True</field>
<field name="name">Done</field>
- <field name="kind">function</field>
- <field name="action">set_state_done()</field>
+ <field name="method">wkf_done</field>
</record>
<record model="workflow.transition"
id="forecast_trans_draft_cancel">
@@ -229,7 +211,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="Choose dates" col="2">
+ <form string="Choose dates">
<label name="from_date"/>
<field name="from_date"/>
<label name="to_date"/>
@@ -244,8 +226,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Choose products" col="1" >
- <separator name="products"/>
- <field name="products" width="600" height="300"/>
+ <field name="products"/>
</form>
]]>
</field>
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index cddf51a..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,66 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""À la date"" doit être plus grande que «De la date"" !",0
-error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des dates qui se chevauchent,0
-error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","""De la date"" devrait être plus petit que ""À la date"" !",0
-error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,La quantité de ligne doit être supérieure à la quantité minimale !,0
-error,stock.forecast.line,0,Line quantity must be positive!,Les quantités sur les lignes doivent être positives!,0
-error,stock.forecast.line,0,Product must be unique by forcast!,Le produit doit être unique par prévision !,0
-field,"stock.forecast,company",0,Company,Société,0
-field,"stock.forecast,destination",0,Destination,Destination,0
-field,"stock.forecast,from_date",0,From Date,Date de début,0
-field,"stock.forecast,lines",0,Lines,Lignes,0
-field,"stock.forecast,location",0,Location,Emplacement,0
-field,"stock.forecast,rec_name",0,Name,Nom,0
-field,"stock.forecast,state",0,State,État,0
-field,"stock.forecast,to_date",0,To Date,Date de fin,0
-field,"stock.forecast.complete.ask,from_date",0,From Date,Date de début,0
-field,"stock.forecast.complete.ask,to_date",0,To Date,Date de fin,0
-field,"stock.forecast.complete.choose,products",0,Products,Produits,0
-field,"stock.forecast.line,forecast",0,Forecast,Prévision,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Qté minimale,0
-field,"stock.forecast.line,moves",0,Moves,Mouvements,0
-field,"stock.forecast.line,product",0,Product,Produit,0
-field,"stock.forecast.line,quantity",0,Quantity,Quantité,0
-field,"stock.forecast.line,rec_name",0,Name,Nom,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
-field,"stock.forecast.line,uom",0,UOM,UDM,0
-field,"stock.forecast.line-stock.move,line",0,Forecast Line,Ligne de prévision,0
-field,"stock.forecast.line-stock.move,move",0,Move,Mouvement,0
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Nom,0
-model,"ir.action,name",act_forecast_form,Forecasts,Prévisions,0
-model,"ir.action,name",act_forecast_form2,Forecasts,Prévisions,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Completer les prévisions,0
-model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Prévisions,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
-model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Nouvelle prévision,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Stock prévisionnel,0
-model,"stock.forecast,name",0,Stock Forecast,Stock prévisionnel,0
-model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Completer la prévision - Demander,0
-model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Completer la prévision - Choisir,0
-model,"stock.forecast.line,name",0,Stock Forecast Line,Ligne de prévision de stock,0
-model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Ligne de prévision - Mouvement,0
-model,"workflow,name",wkf_forecast,Forecast,Prévision,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Annuler,0
-model,"workflow.activity,name",forecast_act_done,Done,Fait,0
-model,"workflow.activity,name",forecast_act_draft,Draft,Brouillon,0
-selection,"stock.forecast,state",0,Cancel,Annuler,0
-selection,"stock.forecast,state",0,Done,Fait,0
-selection,"stock.forecast,state",0,Draft,Brouillon,0
-view,stock.forecast,0,Add forecast line based on past data.,Ajouter la ligne des prévisions fondées sur des données historiques.,0
-view,stock.forecast,0,Cancel,Annuler,0
-view,stock.forecast,0,Complete Forecast,Completer la prévision,0
-view,stock.forecast,0,Confirm,Confirmer,0
-view,stock.forecast,0,Forecast,Prévision,0
-view,stock.forecast,0,Forecasts,Prévisions,0
-view,stock.forecast,0,Reset to Draft,Remettre en brouillon,0
-view,stock.forecast.complete.ask,0,Choose dates,Choisir les dates,0
-view,stock.forecast.complete.choose,0,Choose products,Choisissez les produits,0
-view,stock.forecast.line,0,Forecast Line,Ligne de prévision,0
-view,stock.forecast.line,0,Forecast Lines,Lignes de prévision,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Achevé,0
-wizard_button,"stock.forecast.complete,choose,end",0,cancel,annuler,0
-wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Choisissez les dates,0
-wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Choisissez les produits,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Achevé,0
-wizard_button,"stock.forecast.complete,init,end",0,cancel,annuler,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..862604c
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,263 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "Стойността на \"От дата\" трябва да е по-малка от тази на \"До дата\"!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "Количество на ред трябва да е по-голямо от минималното количество!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "Количеството на реда трябва да е положително число!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr "Продукта трябва да уникален по прогноза!"
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "Стойността на \"До дата\" трябва да е по-голяма от тази на \"От дата\"!"
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"Не може да създавате прогнози за еднао и също местонахиждение за "
+"припокриващи се периоди"
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr "Местонахождение-цел"
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "От дата"
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "До дата"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "От дата"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "До дата"
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr "Прогноза"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr "Мин, к-во"
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "Мер. ед."
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr "Ред от прогноза"
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Прогнози"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Проект на прогноза"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Прогнози"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Проект на прогноза"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Прогноза за наличност"
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr "Прогноза за наличност"
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr "Запитване за изготвяне на прогноза"
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr "Изготвяне на прогноза - Избор"
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr "Ред от прогноза за наличност"
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr "Ред от прогноза - Движение"
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr "Прогноза"
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr "Избор на дати"
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr "Избор на продукти"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr "Ред от прогноза"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr "Редове от прогноза"
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr "Добавяне на ред от прогноза въз основа на минали данни"
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Потвърждаване"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr "Прогноза"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr "Прогнози"
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Изпращане в проект"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr "Пълен"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr "Избор на дати"
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr "Избор на продукти"
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr "Пълен"
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr "Отказ"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..9fdf985
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,260 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr ""
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..70e5a68
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,263 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "\"Von Datum\" muss kleiner als \"Bis Datum\" sein!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "Anzahl der Position muss größer als die Minimalanzahl sein!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "Anzahl der Position muss positiv sein!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr "Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!"
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "\"Bis Datum\" muss größer sein als \"Von Datum\""
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"Bei Bedarfsermittlungen für den selben Lagerort darf sich das Datum nicht "
+"überschneiden!"
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr "Bestimmungsort"
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "Von Datum"
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "Bis Datum"
+
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "Von Datum"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "Bis Datum"
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr "Bedarfsermittlung"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr "Minimale Anzahl"
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr "Anzahl ausgeführt"
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Anzahl Stellen"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr "Position Bedarfsermittlung"
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Bewegung"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Bedarfsermittlung"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Entwürfe Bedarfsermittlung"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Bedarfsermittlung durchführen"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Bedarfsermittlung"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Entwürfe Bedarfsermittlung"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Lager Bedarfsermittlung"
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr "Bedarfsermittlung Lagerhaltung"
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr "Bedarfsermittlung Durchführen Nachfrage"
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr "Bedarfsermittlung Durchführen Auswahl"
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr "Position Bedarfsermittlung Lagerhaltung"
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr "Position Bedarfsermittlung - Bewegung"
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr "Bedarfsermittlung"
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr "Auswahl Datum"
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr "Auswahl Artikel"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr "Position Bedarfsermittlung"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr "Positionen Bedarfsermittlung"
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr ""
+"Erstelle Bedarfspositionen basierend auf den Werten aus der Vergangenheit"
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr "Bedarfsermittlung durchführen"
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Bestätigen"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr "Bedarfsermittlung"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr "Bedarfsermittlung"
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Auf Entwurf zurücksetzen"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr "Durchführen"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr "Auswahl Datum"
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr "Auswahl Artikel"
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr "Durchführen"
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr "Abbrechen"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..c8ab340
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,263 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "¡\"Desde la Fecha\" puede ser menor que \"A la Fecha\"!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "¡La cantidad por línea debe ser mayor que la mínima cantidad!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "La línea de cantidad debe ser positiva!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr "¡El producto debe ser único por proyección!"
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "\"Hasta la Fecha\" debe ser mayor que \"Desde la Fecha\""
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"No puede crear proyecciones para la misma localización con fechas "
+"sobrepuestas"
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr "Destino"
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "Fecha Inicial"
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Líneas de Inventario"
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "A la Fecha"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "Fecha Inicial"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "A la Fecha"
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr "Proyección"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr "Cantidad Mínima"
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Productos"
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Dígitos Unitarios"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr "Línea de Proyección"
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Proyecciones"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Proyección de Pruebas"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Proyección Completa"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Proyecciones"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Proyección de Pruebas"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Proyección de Almacén"
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr "Proyección de Almacén"
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr "Pregunta de Proyección Completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr "Escojencia de Proyección Completa"
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr "Línea de Proyección de Alamacén"
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr "Línea de Proyección - Mover"
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr "Proyección"
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr "Escoja fechas"
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr "Escoja productos"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr "Línea de Proyección"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr "Líneas de Proyección"
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr "Adicione líneas de proyecciones basadas en fechas pasadas."
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr "Proyección Completa"
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr "Proyección"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr "Proyecciones"
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Revertir a Borrador"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr "cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr "Escoja fechas"
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr "Escoja productos"
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr "cancelar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..8ca1394
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,262 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "«Desde la fecha» debe ser anterior a «Hasta la fecha»"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "La línea cantidad debe ser mayor que la cantidad mínima"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "La cantidad de la línea debe ser positiva"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr "El producto debe ser único por previsión"
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "«Hasta la fecha» debe ser más reciente que «Desde la fecha»"
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"No puede crear previsiones para las mísmas ubicaciones con fechas solapadas"
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr "Destino"
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr "Cantidad mínima"
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Decimales de la unidad"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr "Línea de previsión"
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Previsión"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Previsión de existéncias"
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr "Previsión de existencias"
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr "Pedir previsión completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr "Elegir previsión completa"
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr "Línea de previsión de existencias"
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr "LineaPrevisión - Movimiento"
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr "Elegir fechas"
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr "Elegir productos"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr "Línea de previsión"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr "Líneas de previsión"
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr "Añadir línea de previsión en base a datos anteriores."
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Restablecer a borrador"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr "cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr "Elegir fechas"
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr "Elegir productos"
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr "Completo"
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr "cancelar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..f03bbbb
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,262 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr "\"De la date\" devrait être plus petit que \"À la date\" !"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr "La quantité de ligne doit être supérieure à la quantité minimale !"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "Les quantités sur les lignes doivent être positives!"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr "Le produit doit être unique par prévision !"
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr "\"À la date\" doit être plus grande que «De la date\" !"
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+"Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des"
+" dates qui se chevauchent"
+
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr "Destination"
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "Date de début"
+
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "Date de fin"
+
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "Date de début"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "Date de fin"
+
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr "Prévision"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr "Qté minimale"
+
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr "Quantité exécutée"
+
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr "Ligne de prévision"
+
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Prévisions en brouillon"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Completer les prévisions"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr "Prévisions en brouillon"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock prévisionnel"
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr "Stock prévisionnel"
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr "Completer la prévision - Demander"
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr "Completer la prévision - Choisir"
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr "Ligne de prévision de stock"
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr "Ligne de prévision - Mouvement"
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr "Prévision"
+
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr "Choisir les dates"
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr "Choisissez les produits"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr "Ligne de prévision"
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr "Lignes de prévision"
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
+
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr "Completer la prévision"
+
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr "Prévision"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Remettre en brouillon"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr "Achevé"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr "annuler"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr "Choisissez les dates"
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr "Choisissez les produits"
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr "Achevé"
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr "annuler"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..53377a2
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,285 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr "Vanaf datum"
+
+#, fuzzy
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Regels"
+
+#, fuzzy
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Status"
+
+#, fuzzy
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr "Tot datum"
+
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr "Vanaf datum"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr "Tot datum"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Producten"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Boeking"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Klaar"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Klaar"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr ""
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Bevestig"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Terug naar concept"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..20f8a67
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,284 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:stock.forecast.complete:0"
+msgid "\"From Date\" should be smaller than \"To Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be greater than the minimal quantity!"
+msgstr ""
+
+#, fuzzy
+msgctxt "error:stock.forecast.line:0"
+msgid "Line quantity must be positive!"
+msgstr "Кол-во должно быть положительным"
+
+msgctxt "error:stock.forecast.line:0"
+msgid "Product must be unique by forcast!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid "\"To Date\" must be greater than \"From Date\"!"
+msgstr ""
+
+msgctxt "error:stock.forecast:0"
+msgid ""
+"You can not create forecasts for the same locations with overlapping dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,company:0"
+msgid "Company"
+msgstr "Учет.орг."
+
+msgctxt "field:stock.forecast,destination:0"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:0"
+msgid "From Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,lines:0"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "field:stock.forecast,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:stock.forecast,state:0"
+msgid "State"
+msgstr "Статус"
+
+msgctxt "field:stock.forecast,to_date:0"
+msgid "To Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:0"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:0"
+msgid "To Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.choose,products:0"
+msgid "Products"
+msgstr "ТМЦ"
+
+msgctxt "field:stock.forecast.line,forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:0"
+msgid "Minimal Qty"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,moves:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,product:0"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,quantity:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.forecast.line,quantity_executed:0"
+msgid "Quantity Executed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Группа цифр"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,uom:0"
+msgid "UOM"
+msgstr "Ед.изм."
+
+msgctxt "field:stock.forecast.line-stock.move,line:0"
+msgid "Forecast Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,move:0"
+msgid "Move"
+msgstr "Перемещение"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form_draft"
+msgid "Draft Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:0"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:0"
+msgid "Forecast Complete Ask"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:0"
+msgid "Forecast Complete Choose"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:0"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:0"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "model:workflow,name:wkf_forecast"
+msgid "Forecast"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_cancel"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_done"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:forecast_act_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:0"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "view:stock.forecast.complete.ask:0"
+msgid "Choose dates"
+msgstr ""
+
+msgctxt "view:stock.forecast.complete.choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "view:stock.forecast.line:0"
+msgid "Forecast Lines"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "view:stock.forecast:0"
+msgid "Complete Forecast"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Confirm"
+msgstr "Подтверждать"
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "view:stock.forecast:0"
+msgid "Forecasts"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:0"
+msgid "Reset to Draft"
+msgstr "Сброс в черновики"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:0"
+msgid "cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,init:0"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,choose:0"
+msgid "Choose products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,complete:0"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,init,end:0"
+msgid "cancel"
+msgstr ""
diff --git a/setup.py b/setup.py
index 5fa9e7c..89a6751 100644
--- a/setup.py
+++ b/setup.py
@@ -37,18 +37,21 @@ setup(name='trytond_stock_forecast',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
+ 'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Financial and Insurance Industry',
'Intended Audience :: Legal Industry',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
+ 'Natural Language :: Russian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 5c46d25..6d013cc 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -4,13 +4,18 @@
import sys, os
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
- '..', '..', '..', '..', '..', 'trytond')))
+ '..', '..', '..', '..', '..', 'trytond')))
if os.path.isdir(DIR):
sys.path.insert(0, os.path.dirname(DIR))
import unittest
+from decimal import Decimal
+import datetime
+from dateutil.relativedelta import relativedelta
import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view
+from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, test_view,\
+ test_depends
+from trytond.transaction import Transaction
class StockForecastTestCase(unittest.TestCase):
@@ -20,6 +25,15 @@ class StockForecastTestCase(unittest.TestCase):
def setUp(self):
trytond.tests.test_tryton.install_module('stock_forecast')
+ self.category = POOL.get('product.category')
+ self.uom = POOL.get('product.uom')
+ self.product = POOL.get('product.product')
+ self.location = POOL.get('stock.location')
+ self.company = POOL.get('company.company')
+ self.user = POOL.get('res.user')
+ self.forecast = POOL.get('stock.forecast')
+ self.line = POOL.get('stock.forecast.line')
+ self.move = POOL.get('stock.move')
def test0005views(self):
'''
@@ -27,10 +41,114 @@ class StockForecastTestCase(unittest.TestCase):
'''
test_view('stock_forecast')
+ def test0006depends(self):
+ '''
+ Test depends.
+ '''
+ test_depends()
+
+ def test0020distribute(self):
+ '''
+ Test distribute.
+ '''
+ for values, result in (
+ ((1, 5), {0: 5}),
+ ((4, 8), {0: 2, 1: 2, 2: 2, 3: 2}),
+ ((2, 5), {0: 2, 1: 3}),
+ ((10, 4), {0: 0, 1: 1, 2: 0, 3: 1, 4: 0,
+ 5: 0, 6: 1, 7: 0, 8: 1, 9: 0}),
+ ):
+ self.assertEqual(self.line.distribute(*values), result)
+
+ def test0030create_moves(self):
+ '''
+ Test create_moves.
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ category_id = self.category.create({
+ 'name': 'Test create_moves',
+ })
+ unit_id, = self.uom.search([('name', '=', 'Unit')])
+ product_id = self.product.create({
+ 'name': 'Test create_moves',
+ 'type': 'stockable',
+ 'category': category_id,
+ 'cost_price_method': 'fixed',
+ 'default_uom': unit_id,
+ 'list_price': Decimal('1'),
+ })
+ customer_id, = self.location.search([('code', '=', 'CUS')])
+ warehouse_id, = self.location.search([('code', '=', 'WH')])
+ storage_id, = self.location.search([('code', '=', 'STO')])
+ company_id, = self.company.search([('name', '=', 'B2CK')])
+ self.user.write(USER, {
+ 'main_company': company_id,
+ 'company': company_id,
+ })
+
+ today = datetime.date.today()
+
+ forecast_id = self.forecast.create({
+ 'warehouse': warehouse_id,
+ 'destination': customer_id,
+ 'from_date': today + relativedelta(months=1, day=1),
+ 'to_date': today + relativedelta(months=1, day=20),
+ 'company': company_id,
+ 'lines': [
+ ('create', {
+ 'product': product_id,
+ 'quantity': 10,
+ 'uom': unit_id,
+ 'minimal_quantity': 2,
+ },
+ ),
+ ],
+ })
+ self.forecast.workflow_trigger_validate(forecast_id, 'done')
+
+ self.forecast.create_moves([forecast_id])
+ forecast = self.forecast.browse(forecast_id)
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 0)
+ self.assertEqual(len(line.moves), 5)
+ self.assertEqual(sum(move.quantity for move in line.moves), 10)
+
+ self.forecast.delete_moves([forecast_id])
+ forecast = self.forecast.browse(forecast_id)
+ line, = forecast.lines
+ self.assertEqual(len(line.moves), 0)
+
+ company = self.company.browse(company_id)
+ self.move.create({
+ 'from_location': storage_id,
+ 'to_location': customer_id,
+ 'product': product_id,
+ 'uom': unit_id,
+ 'quantity': 2,
+ 'planned_date': today + relativedelta(months=1, day=5),
+ 'company': company_id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ })
+ forecast = self.forecast.browse(forecast_id)
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 2)
+
+ self.forecast.create_moves([forecast_id])
+ forecast = self.forecast.browse(forecast_id)
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 2)
+ self.assertEqual(len(line.moves), 4)
+ self.assertEqual(sum(move.quantity for move in line.moves), 8)
+
def suite():
suite = trytond.tests.test_tryton.suite()
+ from trytond.modules.company.tests import test_company
+ for test in test_company.suite():
+ if test not in suite:
+ suite.addTest(test)
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
- StockForecastTestCase))
+ StockForecastTestCase))
return suite
if __name__ == '__main__':
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 744c85d..0eb8196 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 2.0.1
+Version: 2.2.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
@@ -17,18 +17,21 @@ Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index fae6c6b..b063521 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -4,12 +4,7 @@ INSTALL
LICENSE
MANIFEST.in
README
-bg_BG.csv
-de_DE.csv
-es_CO.csv
-es_ES.csv
forecast.xml
-fr_FR.csv
setup.py
./__init__.py
./__tryton__.py
@@ -17,6 +12,14 @@ setup.py
./tests/__init__.py
./tests/test_stock_forecast.py
doc/index.rst
+locale/bg_BG.po
+locale/cs_CZ.po
+locale/de_DE.po
+locale/es_CO.po
+locale/es_ES.po
+locale/fr_FR.po
+locale/nl_NL.po
+locale/ru_RU.po
trytond_stock_forecast.egg-info/PKG-INFO
trytond_stock_forecast.egg-info/SOURCES.txt
trytond_stock_forecast.egg-info/dependency_links.txt
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index d1b97cc..1e670c5 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_stock >= 2.0, < 2.1
-trytond_product >= 2.0, < 2.1
-trytond_company >= 2.0, < 2.1
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond_stock >= 2.2, < 2.3
+trytond_product >= 2.2, < 2.3
+trytond_company >= 2.2, < 2.3
+trytond >= 2.2, < 2.3
\ No newline at end of file
commit 44265f879e800947cbb56311ea204f5e26c653e8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 3 14:16:00 2011 +0200
Adding upstream version 2.0.1.
diff --git a/CHANGELOG b/CHANGELOG
index 663b1f8..f4c91ab 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.1 - 2011-10-01
+* Bug fixes (see mercurial logs for details)
+
Version 2.0.0 - 2011-04-27
* Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 1d53ed8..35390dc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 2.0.0
+Version: 2.0.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index 0aae814..bea216c 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '2.0.0',
+ 'version': '2.0.1',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/forecast.py b/forecast.py
index 311fb74..6909623 100644
--- a/forecast.py
+++ b/forecast.py
@@ -100,13 +100,17 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
'AND location = %s ' \
'AND destination = %s ' \
'AND state = \'done\' ' \
+ 'AND company = %s '
'AND id != %s',
(forecast.from_date, forecast.from_date,
forecast.to_date, forecast.to_date,
forecast.from_date, forecast.to_date,
forecast.location.id, forecast.destination.id,
- forecast.id))
- if cursor.rowcount:
+ forecast.company.id, forecast.id))
+ rowcount = cursor.rowcount
+ if rowcount == -1 or rowcount is None:
+ rowcount = len(cursor.fetchall())
+ if rowcount:
return False
return True
@@ -268,7 +272,7 @@ class ForecastLine(ModelSQL, ModelView):
'quantity': qty * line.minimal_quantity,
'planned_date': line.forecast.from_date + datetime.timedelta(day),
'company': line.forecast.company.id,
- 'currency':line.forecast.company.currency,
+ 'currency':line.forecast.company.currency.id,
'unit_price': unit_price,
})
moves.append(('add',mid))
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 7475557..744c85d 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 2.0.0
+Version: 2.0.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
commit f64d5ae68faa56470c816a40f5644d9ecec75c3c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 19:13:07 2011 +0200
Adding upstream version 2.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 8f6a910..663b1f8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
Version 1.8.0 - 2010-11-01
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index cca7db9..3d2324b 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2010 Cédric Krier.
-Copyright (C) 2008-2010 Bertrand Chenal.
-Copyright (C) 2008-2010 B2CK SPRL.
+Copyright (C) 2008-2011 Cédric Krier.
+Copyright (C) 2008-2011 Bertrand Chenal.
+Copyright (C) 2008-2011 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 1d8cfc4..1d53ed8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 1.8.0
+Version: 2.0.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
@@ -22,10 +22,13 @@ Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index da5c7ca..0aae814 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,11 +2,12 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'Stock Forecast',
+ 'name_bg_BG': 'Прогнозиране на наличност',
'name_de_DE': 'Lagerverwaltung Bedarfsermittlung',
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '1.8.0',
+ 'version': '2.0.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -18,6 +19,13 @@ past. Once the form confirmed, the corresponding moves are created and
spread homogeneously across the period. Those moves will allow other
process to take forecasts into account.
''',
+ 'description_bg_BG':'''Предоставя модел за "прогнозиране" при управление на инвентазирация
+ - Формата за "Прогноза" позволява да се зададат очакваните движения на наличност
+ към клиенти в бъдещ период. Помощник позволява да се изчислят очакваните
+ количества отчитайки периоди в миналто. След потвърждаване на формата, съответните
+ движения биват създадени и разпределени равномерно за периода. Тези движения
+ позволяват на други процеси да вземат предвид тези прогнози.
+''',
'description_de_DE':'''Bedarfsermittlung für die Lagerverwaltung
- Fügt das Modell "Vorhersage" zur Lagerverwaltung hinzu.
- Das Formular "Bedarfsermittlung" ermöglicht die Erstellung von zu
@@ -67,6 +75,7 @@ prévisions.
'forecast.xml',
],
'translation': [
+ 'bg_BG.csv',
'de_DE.csv',
'es_CO.csv',
'es_ES.csv',
diff --git a/bg_BG.csv b/bg_BG.csv
new file mode 100644
index 0000000..fc61797
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,66 @@
+type,name,res_id,src,value,fuzzy
+error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","Стойността на ""До дата"" трябва да е по-голяма от тази на ""От дата""!",0
+error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Не може да създавате прогнози за еднао и също местонахиждение за припокриващи се периоди,0
+error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","Стойността на ""От дата"" трябва да е по-малка от тази на ""До дата""!",0
+error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,Количество на ред трябва да е по-голямо от минималното количество!,0
+error,stock.forecast.line,0,Line quantity must be positive!,Количеството на реда трябва да е положително число!,0
+error,stock.forecast.line,0,Product must be unique by forcast!,Продукта трябва да уникален по прогноза!,0
+field,"stock.forecast,company",0,Company,Фирма,0
+field,"stock.forecast,destination",0,Destination,Местонахождение-цел,0
+field,"stock.forecast,from_date",0,From Date,От дата,0
+field,"stock.forecast,lines",0,Lines,Редове,0
+field,"stock.forecast,location",0,Location,Местоположение,0
+field,"stock.forecast,rec_name",0,Name,Име,0
+field,"stock.forecast,state",0,State,Състояние,0
+field,"stock.forecast,to_date",0,To Date,До дата,0
+field,"stock.forecast.complete.ask,from_date",0,From Date,От дата,0
+field,"stock.forecast.complete.ask,to_date",0,To Date,До дата,0
+field,"stock.forecast.complete.choose,products",0,Products,Продукти,0
+field,"stock.forecast.line,forecast",0,Forecast,Прогноза,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,"Мин, к-во",0
+field,"stock.forecast.line,moves",0,Moves,Движения,0
+field,"stock.forecast.line,product",0,Product,Продукт,0
+field,"stock.forecast.line,quantity",0,Quantity,Количество,0
+field,"stock.forecast.line,rec_name",0,Name,Име,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Десетични единици,0
+field,"stock.forecast.line,uom",0,UOM,Мер. ед.,0
+field,"stock.forecast.line-stock.move,line",0,Forecast Line,Ред от прогноза,0
+field,"stock.forecast.line-stock.move,move",0,Move,Движение,0
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Име,0
+model,"ir.action,name",act_forecast_form,Forecasts,Прогнози,0
+model,"ir.action,name",act_forecast_form2,Forecasts,Прогнози,0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Проект на прогноза,0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Изготвяне на прогноза,0
+model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Прогнози,0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Проект на прогноза,0
+model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Нова прогноза,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Прогноза за наличност,0
+model,"stock.forecast,name",0,Stock Forecast,Прогноза за наличност,0
+model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Запитване за изготвяне на прогноза,0
+model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Изготвяне на прогноза - Избор,0
+model,"stock.forecast.line,name",0,Stock Forecast Line,Ред от прогноза за наличност,0
+model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Ред от прогноза - Движение,0
+model,"workflow,name",wkf_forecast,Forecast,Прогноза,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Отказ,0
+model,"workflow.activity,name",forecast_act_done,Done,Приключен,0
+model,"workflow.activity,name",forecast_act_draft,Draft,Проект,0
+selection,"stock.forecast,state",0,Cancel,Отказ,0
+selection,"stock.forecast,state",0,Done,Приключен,0
+selection,"stock.forecast,state",0,Draft,Проект,0
+view,stock.forecast,0,Add forecast line based on past data.,Добавяне на ред от прогноза въз основа на минали данни,0
+view,stock.forecast,0,Cancel,Отказ,0
+view,stock.forecast,0,Complete Forecast,Изготвяне на прогноза,0
+view,stock.forecast,0,Confirm,Потвърждаване,0
+view,stock.forecast,0,Forecast,Прогноза,0
+view,stock.forecast,0,Forecasts,Прогнози,0
+view,stock.forecast,0,Reset to Draft,Изпращане в проект,0
+view,stock.forecast.complete.ask,0,Choose dates,Избор на дати,0
+view,stock.forecast.complete.choose,0,Choose products,Избор на продукти,0
+view,stock.forecast.line,0,Forecast Line,Ред от прогноза,0
+view,stock.forecast.line,0,Forecast Lines,Редове от прогноза,0
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Пълен,0
+wizard_button,"stock.forecast.complete,choose,end",0,cancel,Отказ,0
+wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Избор на дати,0
+wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Избор на продукти,0
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Пълен,0
+wizard_button,"stock.forecast.complete,init,end",0,cancel,Отказ,0
diff --git a/de_DE.csv b/de_DE.csv
index 9c5d2a8..1e0fc90 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -29,10 +29,10 @@ field,"stock.forecast.line-stock.move,move",0,Move,Bewegung,0
field,"stock.forecast.line-stock.move,rec_name",0,Name,Name,0
model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
model,"ir.action,name",act_forecast_form2,Forecasts,Bedarfsermittlung,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe Bedarfsermittlung,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe Bedarfsermittlung,0
model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Neue Bedarfsermittlung,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Lager Bedarfsermittlung,0
model,"stock.forecast,name",0,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
diff --git a/forecast.xml b/forecast.xml
index 5179de4..897f20b 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -84,7 +84,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_forecast_form">
<field name="name">Forecasts</field>
<field name="res_model">stock.forecast</field>
- <field name="view_type">form</field>
<field name="search_value">{'create_date': ['between', Date(delta_years=-2)]}</field>
</record>
<record model="ir.action.act_window.view"
@@ -105,7 +104,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_forecast_form2">
<field name="name">Forecasts</field>
<field name="res_model">stock.forecast</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_forecast_form2_view1">
@@ -126,7 +124,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_forecast_form_draft">
<field name="name">Draft Forecasts</field>
<field name="res_model">stock.forecast</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_forecast_form_draft_view1">
diff --git a/setup.py b/setup.py
index f3642e5..5fa9e7c 100644
--- a/setup.py
+++ b/setup.py
@@ -42,12 +42,15 @@ setup(name='trytond_stock_forecast',
'Intended Audience :: Legal Industry',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'Natural Language :: Bulgarian',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2.5',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
],
license='GPL-3',
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 031b4a1..7475557 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 1.8.0
+Version: 2.0.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
@@ -22,10 +22,13 @@ Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index 2e8de0c..fae6c6b 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -4,6 +4,7 @@ INSTALL
LICENSE
MANIFEST.in
README
+bg_BG.csv
de_DE.csv
es_CO.csv
es_ES.csv
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 4a37690..d1b97cc 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_stock >= 1.8, < 1.9
-trytond_product >= 1.8, < 1.9
-trytond_company >= 1.8, < 1.9
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond_stock >= 2.0, < 2.1
+trytond_product >= 2.0, < 2.1
+trytond_company >= 2.0, < 2.1
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit 2ae762bb26ac38101e456dbd084f238862635551
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Nov 4 20:12:34 2010 +0100
Adding upstream version 1.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index df6494e..8f6a910 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
Version 1.6.0 - 2010-05-12
* Bug fixes (see mercurial logs for details)
* Add default search value on forecast
diff --git a/INSTALL b/INSTALL
index 5b2915b..cd44bde 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_stock_forecast
Prerequisites
-------------
- * Python 2.4 or later (http://www.python.org/)
+ * Python 2.5 or later (http://www.python.org/)
* python-dateutil (http://labix.org/python-dateutil)
* trytond (http://www.tryton.org/)
* trytond_product (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index ead1146..1d8cfc4 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 1.6.0
+Version: 1.8.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index 93b6fe0..da5c7ca 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '1.6.0',
+ 'version': '1.8.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index e7c80d5..9c5d2a8 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -6,49 +6,49 @@ error,stock.forecast.line,0,Line quantity must be greater than the minimal quant
error,stock.forecast.line,0,Line quantity must be positive!,Anzahl der Position muss positiv sein!,0
error,stock.forecast.line,0,Product must be unique by forcast!,Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!,0
field,"stock.forecast,company",0,Company,Unternehmen,0
+field,"stock.forecast,destination",0,Destination,Bestimmungsort,0
+field,"stock.forecast,from_date",0,From Date,Von Datum,0
+field,"stock.forecast,lines",0,Lines,Positionen,0
+field,"stock.forecast,location",0,Location,Lagerort,0
+field,"stock.forecast,rec_name",0,Name,Name,0
+field,"stock.forecast,state",0,State,Status,0
+field,"stock.forecast,to_date",0,To Date,Bis Datum,0
field,"stock.forecast.complete.ask,from_date",0,From Date,Von Datum,0
field,"stock.forecast.complete.ask,to_date",0,To Date,Bis Datum,0
field,"stock.forecast.complete.choose,products",0,Products,Artikel,0
-field,"stock.forecast,destination",0,Destination,Bestimmungsort,0
-field,"stock.forecast,from_date",0,From Date,Von Datum,0
field,"stock.forecast.line,forecast",0,Forecast,Bedarfsermittlung,0
field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Minimale Anzahl,0
field,"stock.forecast.line,moves",0,Moves,Bewegungen,0
field,"stock.forecast.line,product",0,Product,Artikel,0
field,"stock.forecast.line,quantity",0,Quantity,Anzahl,0
field,"stock.forecast.line,rec_name",0,Name,Name,0
-field,"stock.forecast,lines",0,Lines,Positionen,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
+field,"stock.forecast.line,uom",0,UOM,Maßeinheit,0
field,"stock.forecast.line-stock.move,line",0,Forecast Line,Position Bedarfsermittlung,0
field,"stock.forecast.line-stock.move,move",0,Move,Bewegung,0
field,"stock.forecast.line-stock.move,rec_name",0,Name,Name,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
-field,"stock.forecast.line,uom",0,UOM,Maßeinheit,0
-field,"stock.forecast,location",0,Location,Lagerort,0
-field,"stock.forecast,rec_name",0,Name,Name,0
-field,"stock.forecast,state",0,State,Status,0
-field,"stock.forecast,to_date",0,To Date,Bis Datum,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
model,"ir.action,name",act_forecast_form2,Forecasts,Bedarfsermittlung,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Neue Bedarfsermittlung,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Lager Bedarfsermittlung,0
+model,"stock.forecast,name",0,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Bedarfsermittlung Durchführen Nachfrage,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Bedarfsermittlung Durchführen Auswahl,0
model,"stock.forecast.line,name",0,Stock Forecast Line,Position Bedarfsermittlung Lagerhaltung,0
model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Position Bedarfsermittlung - Bewegung,0
-model,"stock.forecast,name",0,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Abbrechen,0
+model,"workflow,name",wkf_forecast,Forecast,Bedarfsermittlung,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Annullieren,0
model,"workflow.activity,name",forecast_act_done,Done,Erledigt,0
model,"workflow.activity,name",forecast_act_draft,Draft,Entwurf,0
-model,"workflow,name",wkf_forecast,Forecast,Bedarfsermittlung,0
-selection,"stock.forecast,state",0,Cancel,Abbrechen,0
+selection,"stock.forecast,state",0,Cancel,Annulliert,0
selection,"stock.forecast,state",0,Done,Erledigt,0
selection,"stock.forecast,state",0,Draft,Entwurf,0
view,stock.forecast,0,Add forecast line based on past data.,Erstelle Bedarfspositionen basierend auf den Werten aus der Vergangenheit,0
-view,stock.forecast,0,Cancel,Abbrechen,0
+view,stock.forecast,0,Cancel,Annullieren,0
view,stock.forecast,0,Complete Forecast,Bedarfsermittlung durchführen,0
view,stock.forecast,0,Confirm,Bestätigen,0
view,stock.forecast,0,Forecast,Bedarfsermittlung,0
diff --git a/forecast.py b/forecast.py
index 8c780ae..311fb74 100644
--- a/forecast.py
+++ b/forecast.py
@@ -1,12 +1,14 @@
#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 __future__ import with_statement
+import datetime
+import time
+from dateutil.relativedelta import relativedelta
from trytond.model import ModelView, ModelWorkflow, ModelSQL, fields
from trytond.wizard import Wizard
from trytond.pyson import Not, Equal, Eval, Or, Bool
from trytond.backend import TableHandler
-import datetime
-import time
-from dateutil.relativedelta import relativedelta
+from trytond.transaction import Transaction
STATES = {
'readonly': Not(Equal(Eval('state'), 'draft')),
@@ -63,33 +65,31 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
self._order.insert(0, ('from_date', 'DESC'))
self._order.insert(1, ('location', 'ASC'))
- def init(self, cursor, module_name):
- super(Forecast, self).init(cursor, module_name)
+ def init(self, module_name):
+ cursor = Transaction().cursor
+ super(Forecast, self).init(module_name)
# Add index on create_date
table = TableHandler(cursor, self, module_name)
table.index_action('create_date', action='add')
- def default_state(self, cursor, user, context=None):
+ def default_state(self):
return 'draft'
- def default_destination(self, cursor, user, context=None):
+ def default_destination(self):
location_obj = self.pool.get('stock.location')
- location_ids = location_obj.search(cursor, user,
- self.destination.domain, context=context)
+ location_ids = location_obj.search(
+ self.destination.domain)
if len(location_ids) == 1:
return location_ids[0]
return False
- def default_company(self, cursor, user, context=None):
- if context is None:
- context = {}
- if context.get('company'):
- return context['company']
- return False
+ def default_company(self):
+ return Transaction().context.get('company') or False
- def check_date_overlap(self, cursor, user, ids):
- for forecast in self.browse(cursor, user, ids):
+ def check_date_overlap(self, ids):
+ cursor = Transaction().cursor
+ for forecast in self.browse(ids):
if forecast.state != 'done':
continue
cursor.execute('SELECT id ' \
@@ -110,34 +110,35 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
return False
return True
- def button_draft(self, cursor, user, ids, context=None):
- self.workflow_trigger_create(cursor, user, ids, context=context)
+ def button_draft(self, ids):
+ self.workflow_trigger_create(ids)
return True
- def set_state_draft(self, cursor, user, forecast_id, context=None):
+ def set_state_draft(self, forecast_id):
line_obj = self.pool.get("stock.forecast.line")
- forecast = self.browse(cursor, user, forecast_id, context=context)
+ forecast = self.browse(forecast_id)
if forecast.state == "done":
- line_obj.cancel_moves(cursor, user, forecast.lines, context=context)
- self.write(cursor, user, forecast_id, {
+ line_obj.cancel_moves(forecast.lines)
+ self.write(forecast_id, {
'state': 'draft',
- }, context=context)
+ })
- def set_state_cancel(self, cursor, user, forecast_id, context=None):
- self.write(cursor, user, forecast_id, {
+ def set_state_cancel(self, forecast_id):
+ self.write(forecast_id, {
'state': 'cancel',
- }, context=context)
+ })
- def set_state_done(self, cursor, user, forecast_id, context=None):
+ def set_state_done(self, forecast_id):
line_obj = self.pool.get('stock.forecast.line')
- forecast = self.browse(cursor, user, forecast_id, context=context)
+ forecast = self.browse(forecast_id)
for line in forecast.lines:
- line_obj.create_moves(cursor, user, line, context=context)
- self.write(
- cursor, user, forecast_id, {'state': 'done',}, context=context)
+ line_obj.create_moves(line)
+ self.write(forecast_id, {
+ 'state': 'done',
+ })
- def copy(self, cursor, user, ids, default=None, context=None):
+ def copy(self, ids, default=None):
line_obj = self.pool.get('stock.forecast.line')
int_id = False
@@ -151,13 +152,12 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
default['lines'] = False
new_ids = []
- for forecast in self.browse(cursor, user, ids, context=context):
- new_id = super(Forecast, self).copy(cursor, user, forecast.id,
- default=default, context=context)
- line_obj.copy(cursor, user, [x.id for x in forecast.lines],
+ for forecast in self.browse(ids):
+ new_id = super(Forecast, self).copy(forecast.id, default=default)
+ line_obj.copy([x.id for x in forecast.lines],
default={
'forecast': new_id,
- }, context=context)
+ })
new_ids.append(new_id)
if int_id:
@@ -204,91 +204,83 @@ class ForecastLine(ModelSQL, ModelView):
'Product must be unique by forcast!'),
]
- def default_unit_digits(self, cursor, user, context=None):
+ def default_unit_digits(self):
return 2
- def default_minimal_quantity(self, cursor, user, context=None):
+ def default_minimal_quantity(self):
return 1.0
- def on_change_product(self, cursor, user, vals, context=None):
+ def on_change_product(self, vals):
product_obj = self.pool.get('product.product')
res = {}
res['unit_digits'] = 2
if vals.get('product'):
- product = product_obj.browse(cursor, user, vals['product'],
- context=context)
+ product = product_obj.browse(vals['product'])
res['uom'] = product.default_uom.id
res['uom.rec_name'] = product.default_uom.rec_name
res['unit_digits'] = product.default_uom.digits
return res
- def on_change_uom(self, cursor, user, vals, context=None):
+ def on_change_uom(self, vals):
uom_obj = self.pool.get('product.uom')
res = {}
res['unit_digits'] = 2
if vals.get('uom'):
- uom = uom_obj.browse(cursor, user, vals['uom'], context=context)
+ uom = uom_obj.browse(vals['uom'])
res['unit_digits'] = uom.digits
return res
- def get_unit_digits(self, cursor, user, ids, name, context=None):
+ def get_unit_digits(self, ids, name):
res = {}
- for line in self.browse(cursor, user, ids, context=context):
+ for line in self.browse(ids):
res[line.id] = line.product.default_uom.digits
return res
- def copy(self, cursor, user, ids, default=None, context=None):
+ def copy(self, ids, default=None):
if default is None:
default = {}
default = default.copy()
default['moves'] = False
- return super(ForecastLine, self).copy(cursor, user, ids,
- default=default, context=context)
+ return super(ForecastLine, self).copy(ids, default=default)
- def create_moves(self, cursor, user, line, context=None):
+ def create_moves(self, line):
move_obj = self.pool.get('stock.move')
uom_obj = self.pool.get('product.uom')
delta = line.forecast.to_date - line.forecast.from_date
delta = delta.days + 1
nb_packet = int(line.quantity/line.minimal_quantity)
- distribution = self.distribute(
- cursor, user, delta, nb_packet, context=context)
+ distribution = self.distribute(delta, nb_packet)
unit_price = False
if line.forecast.destination.type == 'customer':
unit_price = line.product.list_price
- unit_price = uom_obj.compute_price(
- cursor, user, line.product.default_uom, unit_price, line.uom,
- context=context)
+ unit_price = uom_obj.compute_price(line.product.default_uom,
+ unit_price, line.uom)
moves = []
for day, qty in distribution.iteritems():
if qty == 0.0:
continue
- mid = move_obj.create(
- cursor, user,
- {'from_location': line.forecast.location.id,
- 'to_location': line.forecast.destination.id,
- 'product': line.product.id,
- 'uom': line.uom.id,
- 'quantity': qty * line.minimal_quantity,
- 'planned_date': line.forecast.from_date + datetime.timedelta(day),
- 'company': line.forecast.company.id,
- 'currency':line.forecast.company.currency,
- 'unit_price': unit_price,
- },
- context=context)
+ mid = move_obj.create({
+ 'from_location': line.forecast.location.id,
+ 'to_location': line.forecast.destination.id,
+ 'product': line.product.id,
+ 'uom': line.uom.id,
+ 'quantity': qty * line.minimal_quantity,
+ 'planned_date': line.forecast.from_date + datetime.timedelta(day),
+ 'company': line.forecast.company.id,
+ 'currency':line.forecast.company.currency,
+ 'unit_price': unit_price,
+ })
moves.append(('add',mid))
- self.write(cursor, user, line.id, {'moves': moves}, context=context)
+ self.write(line.id, {'moves': moves})
- def cancel_moves(self, cursor, user, lines, context=None):
+ def cancel_moves(self, lines):
move_obj = self.pool.get('stock.move')
- move_obj.write(
- cursor, user, [m.id for l in lines for m in l.moves], {'state': 'cancel'},
- context=context)
- move_obj.delete(
- cursor, user, [m.id for l in lines for m in l.moves], context=context)
+ move_obj.write([m.id for l in lines for m in l.moves],
+ {'state': 'cancel'})
+ move_obj.delete([m.id for l in lines for m in l.moves])
- def distribute(self, cursor, user, delta, qty, context=None):
+ def distribute(self, delta, qty):
range_delta = range(delta)
a = {}.fromkeys(range_delta, 0)
while qty > 0:
@@ -394,39 +386,38 @@ class ForecastComplete(Wizard):
})
- def _set_default_dates(self, cursor, user, data, context=None):
+ def _set_default_dates(self, data):
"""
Forecast dates shifted by one year.
"""
forecast_obj = self.pool.get('stock.forecast')
- forecast = forecast_obj.browse(cursor, user, data['id'], context=context)
+ forecast = forecast_obj.browse(data['id'])
res = {}
for field in ("to_date", "from_date"):
res[field] = forecast[field] - relativedelta(years=1)
return res
- def _get_product_quantity(self, cursor, user, data, context=None):
+ def _get_product_quantity(self, data):
forecast_obj = self.pool.get('stock.forecast')
product_obj = self.pool.get('product.product')
- forecast = forecast_obj.browse(cursor, user, data['id'], context=context)
+ forecast = forecast_obj.browse(data['id'])
if data['form']['from_date'] > data['form']['to_date']:
- self.raise_user_error(cursor, 'from_to_date', context=context)
- local_context = context and context.copy() or {}
- local_context['stock_destinations'] = [forecast.destination.id]
- local_context['stock_date_start'] = data['form']['from_date']
- local_context['stock_date_end'] = data['form']['to_date']
+ self.raise_user_error('from_to_date')
- return product_obj.products_by_location(
- cursor, user, [forecast.location.id], with_childs=True,
- skip_zero=False, context=local_context)
+ with Transaction().set_context(
+ stock_destination=[forecast.destination.id],
+ stock_date_start=data['form']['from_date'],
+ stock_date_end=data['form']['to_date']):
+ return product_obj.products_by_location([forecast.location.id],
+ with_childs=True, skip_zero=False)
- def _set_default_products(self, cursor, user, data, context=None):
+ def _set_default_products(self, data):
"""
Collect products for which there is an outgoing stream between
the given location and the destination.
"""
- pbl = self._get_product_quantity(cursor, user, data, context=context)
+ pbl = self._get_product_quantity(data)
products = []
for (_, product), qty in pbl.iteritems():
if qty < 0:
@@ -434,23 +425,22 @@ class ForecastComplete(Wizard):
data['form'].update({'products': products})
return data['form']
- def _complete(self, cursor, user, data, context=None):
+ def _complete(self, data):
forecast_obj = self.pool.get('stock.forecast')
forecast_line_obj = self.pool.get('stock.forecast.line')
product_obj = self.pool.get('product.product')
prod2line = {}
- forecast_line_ids = forecast_line_obj.search(
- cursor, user, [('forecast', '=', data['id'])], context=context)
- for forecast_line in forecast_line_obj.browse(
- cursor, user, forecast_line_ids, context=context):
+ forecast_line_ids = forecast_line_obj.search([
+ ('forecast', '=', data['id']),
+ ])
+ for forecast_line in forecast_line_obj.browse(forecast_line_ids):
prod2line[forecast_line.product.id] = forecast_line.id
- pbl = self._get_product_quantity(cursor, user, data, context=context)
+ pbl = self._get_product_quantity(data)
product_ids = [x[1] for x in pbl]
prod2uom = {}
- for product in product_obj.browse(cursor, user, product_ids,
- context=context):
+ for product in product_obj.browse(product_ids):
prod2uom[product.id] = product.default_uom.id
if data['form'].get('products'):
@@ -464,25 +454,21 @@ class ForecastComplete(Wizard):
if -qty <= 0:
continue
if product in prod2line:
- forecast_line_obj.write(
- cursor, user, prod2line[product],
- {'product': product,
- 'quantity': -qty,
- 'uom': prod2uom[product],
- 'forecast': data['id'],
- 'minimal_quantity': min(1, -qty),
- },
- context=context)
+ forecast_line_obj.write(prod2line[product],{
+ 'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': data['id'],
+ 'minimal_quantity': min(1, -qty),
+ })
else:
- forecast_line_obj.create(
- cursor, user,
- {'product': product,
- 'quantity': -qty,
- 'uom': prod2uom[product],
- 'forecast': data['id'],
- 'minimal_quantity': min(1, -qty),
- },
- context=context)
+ forecast_line_obj.create({
+ 'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': data['id'],
+ 'minimal_quantity': min(1, -qty),
+ })
return {}
ForecastComplete()
diff --git a/forecast.xml b/forecast.xml
index 6e56bf3..5179de4 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -10,6 +10,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="groups"
eval="[('add', ref('group_stock_forecast'))]"/>
</record>
+ <record model="res.user" id="res.user_trigger">
+ <field name="groups"
+ eval="[('add', ref('group_stock_forecast'))]"/>
+ </record>
<record model="ir.action.wizard" id="wizard_forecast_complete">
<field name="name">Complete Forecast</field>
<field name="wiz_name">stock.forecast.complete</field>
diff --git a/fr_FR.csv b/fr_FR.csv
index 55b8fd0..cddf51a 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -6,44 +6,44 @@ error,stock.forecast.line,0,Line quantity must be greater than the minimal quant
error,stock.forecast.line,0,Line quantity must be positive!,Les quantités sur les lignes doivent être positives!,0
error,stock.forecast.line,0,Product must be unique by forcast!,Le produit doit être unique par prévision !,0
field,"stock.forecast,company",0,Company,Société,0
+field,"stock.forecast,destination",0,Destination,Destination,0
+field,"stock.forecast,from_date",0,From Date,Date de début,0
+field,"stock.forecast,lines",0,Lines,Lignes,0
+field,"stock.forecast,location",0,Location,Emplacement,0
+field,"stock.forecast,rec_name",0,Name,Nom,0
+field,"stock.forecast,state",0,State,État,0
+field,"stock.forecast,to_date",0,To Date,Date de fin,0
field,"stock.forecast.complete.ask,from_date",0,From Date,Date de début,0
field,"stock.forecast.complete.ask,to_date",0,To Date,Date de fin,0
field,"stock.forecast.complete.choose,products",0,Products,Produits,0
-field,"stock.forecast,destination",0,Destination,Destination,0
-field,"stock.forecast,from_date",0,From Date,Date de début,0
field,"stock.forecast.line,forecast",0,Forecast,Prévision,0
field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Qté minimale,0
field,"stock.forecast.line,moves",0,Moves,Mouvements,0
field,"stock.forecast.line,product",0,Product,Produit,0
field,"stock.forecast.line,quantity",0,Quantity,Quantité,0
field,"stock.forecast.line,rec_name",0,Name,Nom,0
-field,"stock.forecast,lines",0,Lines,Lignes,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
+field,"stock.forecast.line,uom",0,UOM,UDM,0
field,"stock.forecast.line-stock.move,line",0,Forecast Line,Ligne de prévision,0
field,"stock.forecast.line-stock.move,move",0,Move,Mouvement,0
field,"stock.forecast.line-stock.move,rec_name",0,Name,Nom,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
-field,"stock.forecast.line,uom",0,UOM,UDM,0
-field,"stock.forecast,location",0,Location,Emplacement,0
-field,"stock.forecast,rec_name",0,Name,Nom,0
-field,"stock.forecast,state",0,State,État,0
-field,"stock.forecast,to_date",0,To Date,Date de fin,0
-model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Completer les prévisions,0
-model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
model,"ir.action,name",act_forecast_form,Forecasts,Prévisions,0
model,"ir.action,name",act_forecast_form2,Forecasts,Prévisions,0
-model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Completer les prévisions,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Prévisions,0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Nouvelle prévision,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Stock prévisionnel,0
+model,"stock.forecast,name",0,Stock Forecast,Stock prévisionnel,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Completer la prévision - Demander,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Completer la prévision - Choisir,0
model,"stock.forecast.line,name",0,Stock Forecast Line,Ligne de prévision de stock,0
model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Ligne de prévision - Mouvement,0
-model,"stock.forecast,name",0,Stock Forecast,Stock prévisionnel,0
+model,"workflow,name",wkf_forecast,Forecast,Prévision,0
model,"workflow.activity,name",forecast_act_cancel,Cancel,Annuler,0
model,"workflow.activity,name",forecast_act_done,Done,Fait,0
model,"workflow.activity,name",forecast_act_draft,Draft,Brouillon,0
-model,"workflow,name",wkf_forecast,Forecast,Prévision,0
selection,"stock.forecast,state",0,Cancel,Annuler,0
selection,"stock.forecast,state",0,Done,Fait,0
selection,"stock.forecast,state",0,Draft,Brouillon,0
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 6e39563..5c46d25 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -25,7 +25,7 @@ class StockForecastTestCase(unittest.TestCase):
'''
Test views.
'''
- self.assertRaises(Exception, test_view('stock_forecast'))
+ test_view('stock_forecast')
def suite():
suite = trytond.tests.test_tryton.suite()
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 39dcd42..031b4a1 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 1.6.0
+Version: 1.8.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 416df7b..4a37690 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,5 +1,5 @@
python-dateutil
-trytond_stock >= 1.6, < 1.7
-trytond_product >= 1.6, < 1.7
-trytond_company >= 1.6, < 1.7
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond_stock >= 1.8, < 1.9
+trytond_product >= 1.8, < 1.9
+trytond_company >= 1.8, < 1.9
+trytond >= 1.8, < 1.9
\ No newline at end of file
commit 2a636db7542ad64c1c000976a9d815739f740c8e
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu May 13 11:29:56 2010 +0200
Adding upstream version 1.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index 8b08f3a..df6494e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,7 @@
-Version 1.4.1- 2010-03-31
+Version 1.6.0 - 2010-05-12
* Bug fixes (see mercurial logs for details)
+* Add default search value on forecast
+* Remove egenix-mx-base and replace it by python-dateutil
Version 1.4.0 - 2009-10-19
* Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index abd192d..5b2915b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -5,7 +5,7 @@ Prerequisites
-------------
* Python 2.4 or later (http://www.python.org/)
- * egenix-mx-base (http://www.egenix.com/products/python/)
+ * python-dateutil (http://labix.org/python-dateutil)
* trytond (http://www.tryton.org/)
* trytond_product (http://www.tryton.org/)
* trytond_stock (http://www.tryton.org/)
diff --git a/MANIFEST.in b/MANIFEST.in
index 8b45b8a..dcb2afa 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -8,4 +8,3 @@ include *.xml
include *.odt
include *.csv
include doc/*
-include tests/*
diff --git a/PKG-INFO b/PKG-INFO
index 1c9efec..ead1146 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 1.4.1
+Version: 1.6.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index b106a62..93b6fe0 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '1.4.1',
+ 'version': '1.6.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index b6b0a74..e7c80d5 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -28,8 +28,12 @@ field,"stock.forecast,rec_name",0,Name,Name,0
field,"stock.forecast,state",0,State,Status,0
field,"stock.forecast,to_date",0,To Date,Bis Datum,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
+model,"ir.action,name",act_forecast_form2,Forecasts,Bedarfsermittlung,0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Entwürfe (Bedarfsermittlung),0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
+model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Neue Bedarfsermittlung,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Lager Bedarfsermittlung,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Bedarfsermittlung Durchführen Nachfrage,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Bedarfsermittlung Durchführen Auswahl,0
diff --git a/es_CO.csv b/es_CO.csv
index f21dfec..56f7497 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -28,8 +28,12 @@ field,"stock.forecast,rec_name",0,Name,Nombre,0
field,"stock.forecast,state",0,State,Estado,0
field,"stock.forecast,to_date",0,To Date,A la Fecha,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Proyección Completa,0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Proyección de Pruebas,0
model,"ir.action,name",act_forecast_form,Forecasts,Proyecciones,0
+model,"ir.action,name",act_forecast_form2,Forecasts,Proyecciones,1
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Proyección de Pruebas,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Proyecciones,0
+model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Nueva Proyección,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Proyección de Almacén,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Pregunta de Proyección Completa,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Escojencia de Proyección Completa,0
diff --git a/forecast.py b/forecast.py
index 1c50962..8c780ae 100644
--- a/forecast.py
+++ b/forecast.py
@@ -2,11 +2,14 @@
#this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, ModelWorkflow, ModelSQL, fields
from trytond.wizard import Wizard
+from trytond.pyson import Not, Equal, Eval, Or, Bool
+from trytond.backend import TableHandler
import datetime
-import mx.DateTime
+import time
+from dateutil.relativedelta import relativedelta
STATES = {
- 'readonly': "state != 'draft'",
+ 'readonly': Not(Equal(Eval('state'), 'draft')),
}
@@ -19,7 +22,8 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
location = fields.Many2One(
'stock.location', 'Location', required=True,
domain=[('type', '=', 'storage')], states={
- 'readonly': "state != 'draft' or bool(lines)",
+ 'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+ Bool(Eval('lines'))),
})
destination = fields.Many2One(
'stock.location', 'Destination', required=True,
@@ -30,7 +34,8 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
'stock.forecast.line', 'forecast', 'Lines', states=STATES)
company = fields.Many2One(
'company.company', 'Company', required=True, states={
- 'readonly': "state != 'draft' or bool(lines)",
+ 'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+ Bool(Eval('lines'))),
})
state = fields.Selection([
('draft', 'Draft'),
@@ -58,6 +63,13 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
self._order.insert(0, ('from_date', 'DESC'))
self._order.insert(1, ('location', 'ASC'))
+ def init(self, cursor, module_name):
+ super(Forecast, self).init(cursor, module_name)
+
+ # Add index on create_date
+ table = TableHandler(cursor, self, module_name)
+ table.index_action('create_date', action='add')
+
def default_state(self, cursor, user, context=None):
return 'draft'
@@ -70,7 +82,6 @@ class Forecast(ModelWorkflow, ModelSQL, ModelView):
return False
def default_company(self, cursor, user, context=None):
- company_obj = self.pool.get('company.company')
if context is None:
context = {}
if context.get('company'):
@@ -166,13 +177,16 @@ class ForecastLine(ModelSQL, ModelView):
domain=[('type', '=', 'stockable')], on_change=['product'])
uom = fields.Many2One(
'product.uom', 'UOM', required=True,
- domain=["('category', '=', (product, 'product.default_uom.category'))"],
- on_change=['uom'])
- unit_digits = fields.Function('get_unit_digits', type='integer',
- string='Unit Digits')
- quantity = fields.Float('Quantity', digits="(16, unit_digits)", required=True)
- minimal_quantity = fields.Float(
- 'Minimal Qty', digits="(16, unit_digits)", required=True)
+ domain=[
+ ('category', '=',
+ (Eval('product'), 'product.default_uom.category')),
+ ], on_change=['uom'])
+ unit_digits = fields.Function(fields.Integer('Unit Digits'),
+ 'get_unit_digits')
+ quantity = fields.Float('Quantity', digits=(16, Eval('unit_digits', 2)),
+ required=True)
+ minimal_quantity = fields.Float('Minimal Qty',
+ digits=(16, Eval('unit_digits', 2)), required=True)
moves = fields.Many2Many('stock.forecast.line-stock.move',
'line', 'move','Moves', readonly=True)
forecast = fields.Many2One(
@@ -196,9 +210,8 @@ class ForecastLine(ModelSQL, ModelView):
def default_minimal_quantity(self, cursor, user, context=None):
return 1.0
- def on_change_product(self, cursor, user, ids, vals, context=None):
+ def on_change_product(self, cursor, user, vals, context=None):
product_obj = self.pool.get('product.product')
- uom_obj = self.pool.get('product.uom')
res = {}
res['unit_digits'] = 2
if vals.get('product'):
@@ -209,7 +222,7 @@ class ForecastLine(ModelSQL, ModelView):
res['unit_digits'] = product.default_uom.digits
return res
- def on_change_uom(self, cursor, user, ids, vals, context=None):
+ def on_change_uom(self, cursor, user, vals, context=None):
uom_obj = self.pool.get('product.uom')
res = {}
res['unit_digits'] = 2
@@ -218,7 +231,7 @@ class ForecastLine(ModelSQL, ModelView):
res['unit_digits'] = uom.digits
return res
- def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+ def get_unit_digits(self, cursor, user, ids, name, context=None):
res = {}
for line in self.browse(cursor, user, ids, context=context):
res[line.id] = line.product.default_uom.digits
@@ -390,10 +403,7 @@ class ForecastComplete(Wizard):
res = {}
for field in ("to_date", "from_date"):
- date = mx.DateTime.strptime(str(forecast[field]), '%Y-%m-%d')
- new_date = date - mx.DateTime.RelativeDateTime(years=1)
- res[field] = datetime.date(new_date.year, new_date.month,
- new_date.day)
+ res[field] = forecast[field] - relativedelta(years=1)
return res
def _get_product_quantity(self, cursor, user, data, context=None):
diff --git a/forecast.xml b/forecast.xml
index 5936842..6e56bf3 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -34,7 +34,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="company"/>
<button string="Complete Forecast" type="action"
name="%(wizard_forecast_complete)d"
- states="{'readonly': '''state != 'draft' '''}"
+ states="{'readonly': Not(Equal(Eval('state'), 'draft'))}"
colspan="2"
help="Add forecast line based on past data."/>
<field name="lines" colspan="4"/>
@@ -45,15 +45,15 @@ this repository contains the full copyright notices and license terms. -->
<button string="Reset to Draft"
name="button_draft"
type="object"
- states="{'invisible': '''state == 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ states="{'invisible': Equal(Eval('state'), 'draft'), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
icon="tryton-clear"/>
<button string="Cancel"
name="cancel"
- states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
icon="tryton-cancel"/>
<button string="Confirm"
name="done"
- states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Not(In(%(group_stock_forecast)d, Eval('groups', [])))}"
icon="tryton-ok"/>
</group>
</group>
@@ -72,6 +72,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="from_date"/>
<field name="to_date"/>
<field name="company" select="2"/>
+ <field name="create_date" tree_invisible="1" select="2"/>
</tree>
]]>
</field>
@@ -80,6 +81,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Forecasts</field>
<field name="res_model">stock.forecast</field>
<field name="view_type">form</field>
+ <field name="search_value">{'create_date': ['between', Date(delta_years=-2)]}</field>
</record>
<record model="ir.action.act_window.view"
id="act_forecast_form_view1">
@@ -96,6 +98,48 @@ this repository contains the full copyright notices and license terms. -->
<menuitem parent="stock.menu_stock" sequence="50"
action="act_forecast_form" id="menu_forecast_form"/>
+ <record model="ir.action.act_window" id="act_forecast_form2">
+ <field name="name">Forecasts</field>
+ <field name="res_model">stock.forecast</field>
+ <field name="view_type">form</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form2_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="forecast_view_form"/>
+ <field name="act_window" ref="act_forecast_form2"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form2_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="forecast_view_tree"/>
+ <field name="act_window" ref="act_forecast_form2"/>
+ </record>
+ <menuitem name="New Forecast" parent="menu_forecast_form"
+ action="act_forecast_form2" id="menu_forecast_form_new"
+ sequence="10"/>
+
+ <record model="ir.action.act_window" id="act_forecast_form_draft">
+ <field name="name">Draft Forecasts</field>
+ <field name="res_model">stock.forecast</field>
+ <field name="view_type">form</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form_draft_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="forecast_view_tree"/>
+ <field name="act_window" ref="act_forecast_form_draft"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form_draft_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="forecast_view_form"/>
+ <field name="act_window" ref="act_forecast_form_draft"/>
+ </record>
+ <menuitem parent="menu_forecast_form"
+ action="act_forecast_form_draft" id="menu_forecast_form_draft"
+ sequence="20"/>
+
<record model="ir.ui.view" id="forecast_line_view_form">
<field name="model">stock.forecast.line</field>
<field name="type">form</field>
diff --git a/fr_FR.csv b/fr_FR.csv
index a4db12c..55b8fd0 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -28,8 +28,12 @@ field,"stock.forecast,rec_name",0,Name,Nom,0
field,"stock.forecast,state",0,State,État,0
field,"stock.forecast,to_date",0,To Date,Date de fin,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Completer les prévisions,0
+model,"ir.action,name",act_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
model,"ir.action,name",act_forecast_form,Forecasts,Prévisions,0
+model,"ir.action,name",act_forecast_form2,Forecasts,Prévisions,0
+model,"ir.ui.menu,name",menu_forecast_form_draft,Draft Forecasts,Prévisions en brouillon,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Prévisions,0
+model,"ir.ui.menu,name",menu_forecast_form_new,New Forecast,Nouvelle prévision,0
model,"res.group,name",group_stock_forecast,Stock Forecast,Stock prévisionnel,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Completer la prévision - Demander,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Completer la prévision - Choisir,0
diff --git a/setup.py b/setup.py
index 1c5e350..f3642e5 100644
--- a/setup.py
+++ b/setup.py
@@ -2,19 +2,22 @@
#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 setuptools import setup, find_packages
+from setuptools import setup
import re
-info = eval(file('__tryton__.py').read())
+info = eval(open('__tryton__.py').read())
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
-requires = ['egenix-mx-base']
+requires = ['python-dateutil']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
- requires.append('trytond_' + dep)
-
-major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
-requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+ requires.append('trytond_%s >= %s.%s, < %s.%s' %
+ (dep, major_version, minor_version, major_version,
+ minor_version + 1))
+requires.append('trytond >= %s.%s, < %s.%s' %
+ (major_version, minor_version, major_version, minor_version + 1))
setup(name='trytond_stock_forecast',
version=info.get('version', '0.0.1'),
@@ -25,6 +28,7 @@ setup(name='trytond_stock_forecast',
package_dir={'trytond.modules.stock_forecast': '.'},
packages=[
'trytond.modules.stock_forecast',
+ 'trytond.modules.stock_forecast.tests',
],
package_data={
'trytond.modules.stock_forecast': info.get('xml', []) \
@@ -53,4 +57,6 @@ setup(name='trytond_stock_forecast',
[trytond.modules]
stock_forecast = trytond.modules.stock_forecast
""",
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
)
diff --git a/tests/__init__.py b/tests/__init__.py
index 8d43eeb..6a7efbf 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
#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 test_stock_forecast import *
+from test_stock_forecast import suite
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
index 5a6c119..6e39563 100644
--- a/tests/test_stock_forecast.py
+++ b/tests/test_stock_forecast.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
import unittest
import trytond.tests.test_tryton
-from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+from trytond.tests.test_tryton import test_view
class StockForecastTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class StockForecastTestCase(unittest.TestCase):
self.assertRaises(Exception, test_view('stock_forecast'))
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(StockForecastTestCase)
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ StockForecastTestCase))
+ return suite
if __name__ == '__main__':
- suiteTrytond = trytond.tests.test_tryton.suite()
- suiteStockForecast = suite()
- alltests = unittest.TestSuite([suiteTrytond, suiteStockForecast])
- unittest.TextTestRunner(verbosity=2).run(alltests)
- SOCK.disconnect()
+ unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index 9d0a517..39dcd42 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 1.4.1
+Version: 1.6.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index 7974eaa..2e8de0c 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -13,9 +13,9 @@ setup.py
./__init__.py
./__tryton__.py
./forecast.py
+./tests/__init__.py
+./tests/test_stock_forecast.py
doc/index.rst
-tests/__init__.py
-tests/test_stock_forecast.py
trytond_stock_forecast.egg-info/PKG-INFO
trytond_stock_forecast.egg-info/SOURCES.txt
trytond_stock_forecast.egg-info/dependency_links.txt
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 23c0f93..416df7b 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -1,6 +1,5 @@
-egenix-mx-base
-trytond_stock
-trytond_product
-trytond_company
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+python-dateutil
+trytond_stock >= 1.6, < 1.7
+trytond_product >= 1.6, < 1.7
+trytond_company >= 1.6, < 1.7
+trytond >= 1.6, < 1.7
\ No newline at end of file
commit c9ead6d95de9936c3a46240942f1de3b03a5510f
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Mar 31 23:55:25 2010 +0200
Adding upstream version 1.4.1.
diff --git a/CHANGELOG b/CHANGELOG
index 1066ae9..8b08f3a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.1- 2010-03-31
+* Bug fixes (see mercurial logs for details)
+
Version 1.4.0 - 2009-10-19
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 4451df9..cca7db9 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2009 Cédric Krier.
-Copyright (C) 2008-2009 Bertrand Chenal.
-Copyright (C) 2008-2009 B2CK SPRL.
+Copyright (C) 2008-2010 Cédric Krier.
+Copyright (C) 2008-2010 Bertrand Chenal.
+Copyright (C) 2008-2010 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index b5ef165..1c9efec 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 1.4.0
+Version: 1.4.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index ab4cf45..b106a62 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
'name_es_CO': 'Previsión de existencias',
'name_es_ES': 'Previsión de existencias',
'name_fr_FR': 'Prévision de stock',
- 'version': '1.4.0',
+ 'version': '1.4.1',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/forecast.py b/forecast.py
index a0ef07d..1c50962 100644
--- a/forecast.py
+++ b/forecast.py
@@ -166,7 +166,8 @@ class ForecastLine(ModelSQL, ModelView):
domain=[('type', '=', 'stockable')], on_change=['product'])
uom = fields.Many2One(
'product.uom', 'UOM', required=True,
- domain=["('category', '=', (product, 'product.default_uom.category'))"])
+ domain=["('category', '=', (product, 'product.default_uom.category'))"],
+ on_change=['uom'])
unit_digits = fields.Function('get_unit_digits', type='integer',
string='Unit Digits')
quantity = fields.Float('Quantity', digits="(16, unit_digits)", required=True)
@@ -208,6 +209,15 @@ class ForecastLine(ModelSQL, ModelView):
res['unit_digits'] = product.default_uom.digits
return res
+ def on_change_uom(self, cursor, user, ids, vals, context=None):
+ uom_obj = self.pool.get('product.uom')
+ res = {}
+ res['unit_digits'] = 2
+ if vals.get('uom'):
+ uom = uom_obj.browse(cursor, user, vals['uom'], context=context)
+ res['unit_digits'] = uom.digits
+ return res
+
def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
res = {}
for line in self.browse(cursor, user, ids, context=context):
diff --git a/setup.py b/setup.py
index 88a74c8..1c5e350 100644
--- a/setup.py
+++ b/setup.py
@@ -48,4 +48,9 @@ setup(name='trytond_stock_forecast',
],
license='GPL-3',
install_requires=requires,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_forecast = trytond.modules.stock_forecast
+ """,
)
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index e133d69..9d0a517 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 1.4.0
+Version: 1.4.1
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index b232846..7974eaa 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -19,5 +19,7 @@ tests/test_stock_forecast.py
trytond_stock_forecast.egg-info/PKG-INFO
trytond_stock_forecast.egg-info/SOURCES.txt
trytond_stock_forecast.egg-info/dependency_links.txt
+trytond_stock_forecast.egg-info/entry_points.txt
+trytond_stock_forecast.egg-info/not-zip-safe
trytond_stock_forecast.egg-info/requires.txt
trytond_stock_forecast.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_stock_forecast.egg-info/entry_points.txt b/trytond_stock_forecast.egg-info/entry_points.txt
new file mode 100644
index 0000000..c013e9e
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+ [trytond.modules]
+ stock_forecast = trytond.modules.stock_forecast
+
\ No newline at end of file
diff --git a/trytond_stock_forecast.egg-info/not-zip-safe b/trytond_stock_forecast.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
commit f735f2c2393624ee435904f1da53b74c42408f13
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Oct 19 22:37:40 2009 +0200
Adding upstream version 1.4.0.
diff --git a/CHANGELOG b/CHANGELOG
index 46e7dba..1066ae9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,2 +1,5 @@
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+
Version 1.2.0 - 2009-08-10
* Initial release
diff --git a/MANIFEST.in b/MANIFEST.in
index dcb2afa..8b45b8a 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -8,3 +8,4 @@ include *.xml
include *.odt
include *.csv
include doc/*
+include tests/*
diff --git a/PKG-INFO b/PKG-INFO
index 114aadb..b5ef165 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_stock_forecast
-Version: 1.2.0
+Version: 1.4.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/__tryton__.py b/__tryton__.py
index 85fa15a..ab4cf45 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,11 +2,11 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'Stock Forecast',
- 'name_fr_FR': 'Prévision de stock',
'name_de_DE': 'Lagerverwaltung Bedarfsermittlung',
- 'name_es_ES': 'Previsión de existencias',
'name_es_CO': 'Previsión de existencias',
- 'version': '1.2.0',
+ 'name_es_ES': 'Previsión de existencias',
+ 'name_fr_FR': 'Prévision de stock',
+ 'version': '1.4.0',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -18,15 +18,6 @@ past. Once the form confirmed, the corresponding moves are created and
spread homogeneously across the period. Those moves will allow other
process to take forecasts into account.
''',
- 'description_fr_FR':'''Fournit le modèle "Prévision" dans la gestion des stocks.
-Le formulaire de prévision permet de définir les mouvements attendus
-vers les clients pour n'importe quelle période dans le futur. Un
-wizard permet de calculer les quantités attendues en fonction d'une
-période dans le passé. A la validation du formulaire, les mouvements
-correspondants sont créés et répartis sur la période donnée. Ces
-mouvement permettent aux autres processus de prendre en compte les
-prévisions.
-''',
'description_de_DE':'''Bedarfsermittlung für die Lagerverwaltung
- Fügt das Modell "Vorhersage" zur Lagerverwaltung hinzu.
- Das Formular "Bedarfsermittlung" ermöglicht die Erstellung von zu
@@ -38,15 +29,6 @@ prévisions.
Lagerbewegungen ermöglichen die Berücksichtigung von Vorhersagen in
den anderen Prozessen der Lagerverwaltung.
''',
- 'description_es_ES': '''Provee el modelo de «Previsión» en la gestión de inventarios.
-El formulario de previsión permite definir los movimientos de existencias
-planificados hacia los clientes en cualquier periodo de tiempo en el futuro.
-Un asistente permite calcular las cantidades esperadas respecto a un periodo
-en el pasado. Una vez el formulario se confirma, los movimientos
-correspondientes se crean y se distribuyen homogeneamente a lo largo del
-periodo. Dichos movimientos permitirá a otros procesos tener en cuenta
-previsiones.
-''',
'description_es_CO': '''Provee el modelo de «Previsión» en la gestión de
inventarios.
El formulario de previsión permite definir los movimientos de existencias
@@ -56,6 +38,23 @@ anterior. Cuando se confirma, los movimientos correspondientes se crean
y se distribuyen homogeneamente en el período. Tales movimientos permitirá
a otros procesos hacer previsiones.
''',
+ 'description_es_ES': '''Provee el modelo de «Previsión» en la gestión de inventarios.
+El formulario de previsión permite definir los movimientos de existencias
+planificados hacia los clientes en cualquier periodo de tiempo en el futuro.
+Un asistente permite calcular las cantidades esperadas respecto a un periodo
+en el pasado. Una vez el formulario se confirma, los movimientos
+correspondientes se crean y se distribuyen homogeneamente a lo largo del
+periodo. Dichos movimientos permitirá a otros procesos tener en cuenta las previsiones.
+''',
+ 'description_fr_FR':'''Fournit le modèle "Prévision" dans la gestion des stocks.
+Le formulaire de prévision permet de définir les mouvements attendus
+vers les clients pour n'importe quelle période dans le futur. Un
+wizard permet de calculer les quantités attendues en fonction d'une
+période dans le passé. A la validation du formulaire, les mouvements
+correspondants sont créés et répartis sur la période donnée. Ces
+mouvement permettent aux autres processus de prendre en compte les
+prévisions.
+''',
'depends': [
'ir',
'res',
@@ -68,9 +67,9 @@ a otros procesos hacer previsiones.
'forecast.xml',
],
'translation': [
- 'fr_FR.csv',
'de_DE.csv',
- 'es_ES.csv',
'es_CO.csv',
+ 'es_ES.csv',
+ 'fr_FR.csv',
],
}
diff --git a/de_DE.csv b/de_DE.csv
index dc28bd1..b6b0a74 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -30,7 +30,7 @@ field,"stock.forecast,to_date",0,To Date,Bis Datum,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
-model,"res.group,name",group_stock_forecast,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Lager Bedarfsermittlung,0
model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Bedarfsermittlung Durchführen Nachfrage,0
model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Bedarfsermittlung Durchführen Auswahl,0
model,"stock.forecast.line,name",0,Stock Forecast Line,Position Bedarfsermittlung Lagerhaltung,0
diff --git a/es_CO.csv b/es_CO.csv
index b57275b..f21dfec 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -3,30 +3,30 @@ error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""Hast
error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,No puede crear proyecciones para la misma localización con fechas sobrepuestas,0
error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","¡""Desde la Fecha"" puede ser menor que ""A la Fecha""!",0
error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,¡La cantidad por línea debe ser mayor que la mínima cantidad!,0
-error,stock.forecast.line,0,Line quantity must be positive!,La línea de cantidad debe ser positiva!,1
+error,stock.forecast.line,0,Line quantity must be positive!,La línea de cantidad debe ser positiva!,0
error,stock.forecast.line,0,Product must be unique by forcast!,¡El producto debe ser único por proyección!,0
-field,"stock.forecast,company",0,Company,Compañía,1
-field,"stock.forecast.complete.ask,from_date",0,From Date,Fecha Inicial,1
-field,"stock.forecast.complete.ask,to_date",0,To Date,A la Fecha,1
-field,"stock.forecast.complete.choose,products",0,Products,Productos,1
+field,"stock.forecast,company",0,Company,Compañía,0
+field,"stock.forecast.complete.ask,from_date",0,From Date,Fecha Inicial,0
+field,"stock.forecast.complete.ask,to_date",0,To Date,A la Fecha,0
+field,"stock.forecast.complete.choose,products",0,Products,Productos,0
field,"stock.forecast,destination",0,Destination,Destino,0
-field,"stock.forecast,from_date",0,From Date,Fecha Inicial,1
+field,"stock.forecast,from_date",0,From Date,Fecha Inicial,0
field,"stock.forecast.line,forecast",0,Forecast,Proyección,0
field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad Mínima,0
-field,"stock.forecast.line,moves",0,Moves,Movimientos,1
-field,"stock.forecast.line,product",0,Product,Productos,1
-field,"stock.forecast.line,quantity",0,Quantity,Cantidad,1
-field,"stock.forecast.line,rec_name",0,Name,Nombre de Contacto,1
-field,"stock.forecast,lines",0,Lines,Líneas de Inventario,1
+field,"stock.forecast.line,moves",0,Moves,Movimientos,0
+field,"stock.forecast.line,product",0,Product,Productos,0
+field,"stock.forecast.line,quantity",0,Quantity,Cantidad,0
+field,"stock.forecast.line,rec_name",0,Name,Nombre de Contacto,0
+field,"stock.forecast,lines",0,Lines,Líneas de Inventario,0
field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de Proyección,0
-field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,1
-field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre de Contacto,1
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,1
-field,"stock.forecast.line,uom",0,UOM,UDM,1
-field,"stock.forecast,location",0,Location,Lugar,1
-field,"stock.forecast,rec_name",0,Name,Nombre de Contacto,1
-field,"stock.forecast,state",0,State,Estado,1
-field,"stock.forecast,to_date",0,To Date,A la Fecha,1
+field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,0
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
+field,"stock.forecast.line,uom",0,UOM,UDM,0
+field,"stock.forecast,location",0,Location,Lugar,0
+field,"stock.forecast,rec_name",0,Name,Nombre,0
+field,"stock.forecast,state",0,State,Estado,0
+field,"stock.forecast,to_date",0,To Date,A la Fecha,0
model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Proyección Completa,0
model,"ir.action,name",act_forecast_form,Forecasts,Proyecciones,0
model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Proyecciones,0
@@ -36,27 +36,27 @@ model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Escojenci
model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de Proyección de Alamacén,0
model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Línea de Proyección - Mover,0
model,"stock.forecast,name",0,Stock Forecast,Proyección de Almacén,0
-model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,1
-model,"workflow.activity,name",forecast_act_done,Done,Hecho,1
-model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,1
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,0
+model,"workflow.activity,name",forecast_act_done,Done,Hecho,0
+model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,0
model,"workflow,name",wkf_forecast,Forecast,Proyección,0
-selection,"stock.forecast,state",0,Cancel,Cancelar,1
-selection,"stock.forecast,state",0,Done,Hecho,1
-selection,"stock.forecast,state",0,Draft,Borrador,1
+selection,"stock.forecast,state",0,Cancel,Cancelar,0
+selection,"stock.forecast,state",0,Done,Hecho,0
+selection,"stock.forecast,state",0,Draft,Borrador,0
view,stock.forecast,0,Add forecast line based on past data.,Adicione líneas de proyecciones basadas en fechas pasadas.,0
-view,stock.forecast,0,Cancel,Cancelar,1
+view,stock.forecast,0,Cancel,Cancelar,0
view,stock.forecast,0,Complete Forecast,Proyección Completa,0
-view,stock.forecast,0,Confirm,Confirmar,1
+view,stock.forecast,0,Confirm,Confirmar,0
view,stock.forecast,0,Forecast,Proyección,0
view,stock.forecast,0,Forecasts,Proyecciones,0
-view,stock.forecast,0,Reset to Draft,Revertir a Borrador,1
+view,stock.forecast,0,Reset to Draft,Revertir a Borrador,0
view,stock.forecast.complete.ask,0,Choose dates,Escoja fechas,0
view,stock.forecast.complete.choose,0,Choose products,Escoja productos,0
view,stock.forecast.line,0,Forecast Line,Línea de Proyección,0
view,stock.forecast.line,0,Forecast Lines,Líneas de Proyección,0
-wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,1
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,0
wizard_button,"stock.forecast.complete,choose,end",0,cancel,cancelar,0
wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Escoja fechas,0
wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Escoja productos,0
-wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,1
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,0
wizard_button,"stock.forecast.complete,init,end",0,cancel,cancelar,0
diff --git a/es_ES.csv b/es_ES.csv
index 219d264..706d40c 100644
--- a/es_ES.csv
+++ b/es_ES.csv
@@ -12,7 +12,7 @@ field,"stock.forecast.complete.choose,products",0,Products,Productos,0
field,"stock.forecast,destination",0,Destination,Destino,0
field,"stock.forecast,from_date",0,From Date,Desde la fecha,0
field,"stock.forecast.line,forecast",0,Forecast,Previsión,0
-field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad Mínima,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad mínima,0
field,"stock.forecast.line,moves",0,Moves,Movimientos,0
field,"stock.forecast.line,product",0,Product,Producto,0
field,"stock.forecast.line,quantity",0,Quantity,Cantidad,0
@@ -21,7 +21,7 @@ field,"stock.forecast,lines",0,Lines,Líneas,0
field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de previsión,0
field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,0
field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre,0
-field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Decimales de la unidad,0
field,"stock.forecast.line,uom",0,UOM,UdM,0
field,"stock.forecast,location",0,Location,Ubicación,0
field,"stock.forecast,rec_name",0,Name,Nombre,0
@@ -37,11 +37,11 @@ model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de previsión de e
model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,LineaPrevisión - Movimiento,0
model,"stock.forecast,name",0,Stock Forecast,Previsión de existencias,0
model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,0
-model,"workflow.activity,name",forecast_act_done,Done,Hecho,0
+model,"workflow.activity,name",forecast_act_done,Done,Terminada,0
model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,0
model,"workflow,name",wkf_forecast,Forecast,Previsión,0
selection,"stock.forecast,state",0,Cancel,Cancelar,0
-selection,"stock.forecast,state",0,Done,Hecho,0
+selection,"stock.forecast,state",0,Done,Terminada,0
selection,"stock.forecast,state",0,Draft,Borrador,0
view,stock.forecast,0,Add forecast line based on past data.,Añadir línea de previsión en base a datos anteriores.,0
view,stock.forecast,0,Cancel,Cancelar,0
diff --git a/forecast.py b/forecast.py
index c3f2424..a0ef07d 100644
--- a/forecast.py
+++ b/forecast.py
@@ -166,7 +166,7 @@ class ForecastLine(ModelSQL, ModelView):
domain=[('type', '=', 'stockable')], on_change=['product'])
uom = fields.Many2One(
'product.uom', 'UOM', required=True,
- domain="[('category', '=', (product, 'product.default_uom.category'))]")
+ domain=["('category', '=', (product, 'product.default_uom.category'))"])
unit_digits = fields.Function('get_unit_digits', type='integer',
string='Unit Digits')
quantity = fields.Float('Quantity', digits="(16, unit_digits)", required=True)
diff --git a/forecast.xml b/forecast.xml
index 65032a6..5936842 100644
--- a/forecast.xml
+++ b/forecast.xml
@@ -140,7 +140,7 @@ this repository contains the full copyright notices and license terms. -->
<!-- Workflow forecast -->
<record model="workflow" id="wkf_forecast">
<field name="name">Forecast</field>
- <field name="osv">stock.forecast</field>
+ <field name="model">stock.forecast</field>
<field name="on_create">True</field>
</record>
<record model="workflow.activity" id="forecast_act_draft">
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..8d43eeb
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+#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 test_stock_forecast import *
diff --git a/tests/test_stock_forecast.py b/tests/test_stock_forecast.py
new file mode 100644
index 0000000..5a6c119
--- /dev/null
+++ b/tests/test_stock_forecast.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import sys, os
+DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
+ '..', '..', '..', '..', '..', 'trytond')))
+if os.path.isdir(DIR):
+ sys.path.insert(0, os.path.dirname(DIR))
+
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+
+
+class StockForecastTestCase(unittest.TestCase):
+ '''
+ Test StockForecast module.
+ '''
+
+ def setUp(self):
+ trytond.tests.test_tryton.install_module('stock_forecast')
+
+ def test0005views(self):
+ '''
+ Test views.
+ '''
+ self.assertRaises(Exception, test_view('stock_forecast'))
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(StockForecastTestCase)
+
+if __name__ == '__main__':
+ suiteTrytond = trytond.tests.test_tryton.suite()
+ suiteStockForecast = suite()
+ alltests = unittest.TestSuite([suiteTrytond, suiteStockForecast])
+ unittest.TextTestRunner(verbosity=2).run(alltests)
+ SOCK.disconnect()
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
index e2a4b72..e133d69 100644
--- a/trytond_stock_forecast.egg-info/PKG-INFO
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-stock-forecast
-Version: 1.2.0
+Version: 1.4.0
Summary: Provide the "Forecast" model in Inventory Management.
The Forecast form allow to define the expected stock movement towards
customers in any period of time in the future. A wizard allow to
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
index b9fa36f..b232846 100644
--- a/trytond_stock_forecast.egg-info/SOURCES.txt
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -14,6 +14,8 @@ setup.py
./__tryton__.py
./forecast.py
doc/index.rst
+tests/__init__.py
+tests/test_stock_forecast.py
trytond_stock_forecast.egg-info/PKG-INFO
trytond_stock_forecast.egg-info/SOURCES.txt
trytond_stock_forecast.egg-info/dependency_links.txt
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
index 406df12..23c0f93 100644
--- a/trytond_stock_forecast.egg-info/requires.txt
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -2,5 +2,5 @@ egenix-mx-base
trytond_stock
trytond_product
trytond_company
-trytond >= 1.2
-trytond < 1.3
\ No newline at end of file
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
commit 9989308683df6fe53f2576498ce7681e1da703e2
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Aug 10 20:44:10 2009 +0200
Adding upstream version 1.2.0.
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..46e7dba
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,2 @@
+Version 1.2.0 - 2009-08-10
+* Initial release
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..4451df9
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2008-2009 Cédric Krier.
+Copyright (C) 2008-2009 Bertrand Chenal.
+Copyright (C) 2008-2009 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..abd192d
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,33 @@
+Installing trytond_stock_forecast
+=================================
+
+Prerequisites
+-------------
+
+ * Python 2.4 or later (http://www.python.org/)
+ * egenix-mx-base (http://www.egenix.com/products/python/)
+ * trytond (http://www.tryton.org/)
+ * trytond_product (http://www.tryton.org/)
+ * trytond_stock (http://www.tryton.org/)
+ * trytond_company (http://www.tryton.org/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked a trytond_stock_forecast source release, enter the
+directory where the archive was unpacked, and run:
+
+ python setup.py install
+
+Note that you may need administrator/root privileges for this step, as
+this command will by default attempt to install module to the Python
+site-packages directory on your system.
+
+For advanced options, please refer to the easy_install and/or the distutils
+documentation:
+
+ http://peak.telecommunity.com/DevCenter/EasyInstall
+ http://docs.python.org/inst/inst.html
+
+To use without installation, extract the archive into ``trytond/modules`` with
+the directory name stock_forecast.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..dcb2afa
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,10 @@
+include INSTALL
+include README
+include TODO
+include COPYRIGHT
+include CHANGELOG
+include LICENSE
+include *.xml
+include *.odt
+include *.csv
+include doc/*
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..114aadb
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,31 @@
+Metadata-Version: 1.0
+Name: trytond_stock_forecast
+Version: 1.2.0
+Summary: Provide the "Forecast" model in Inventory Management.
+The Forecast form allow to define the expected stock movement towards
+customers in any period of time in the future. A wizard allow to
+compute the expected quantities with respect to a period in the
+past. Once the form confirmed, the corresponding moves are created and
+spread homogeneously across the period. Those moves will allow other
+process to take forecasts into account.
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/README b/README
new file mode 100644
index 0000000..9a2018b
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_stock_forecast
+=====================
+
+The stock_forecast module of the Tryton application platform.
+See __tryton__.py
+
+Installing
+----------
+
+See INSTALL
+
+Support
+-------
+
+If you encounter any problems with Tryton, please don't hesitate to ask
+questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+License
+-------
+
+See LICENSE
+
+Copyright
+---------
+
+See COPYRIGHT
+
+
+For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..cf92f4b
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,4 @@
+#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 forecast import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..85fa15a
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,76 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+{
+ 'name': 'Stock Forecast',
+ 'name_fr_FR': 'Prévision de stock',
+ 'name_de_DE': 'Lagerverwaltung Bedarfsermittlung',
+ 'name_es_ES': 'Previsión de existencias',
+ 'name_es_CO': 'Previsión de existencias',
+ 'version': '1.2.0',
+ 'author': 'B2CK',
+ 'email': 'info at b2ck.com',
+ 'website': 'http://www.tryton.org/',
+ 'description': '''Provide the "Forecast" model in Inventory Management.
+The Forecast form allow to define the expected stock movement towards
+customers in any period of time in the future. A wizard allow to
+compute the expected quantities with respect to a period in the
+past. Once the form confirmed, the corresponding moves are created and
+spread homogeneously across the period. Those moves will allow other
+process to take forecasts into account.
+''',
+ 'description_fr_FR':'''Fournit le modèle "Prévision" dans la gestion des stocks.
+Le formulaire de prévision permet de définir les mouvements attendus
+vers les clients pour n'importe quelle période dans le futur. Un
+wizard permet de calculer les quantités attendues en fonction d'une
+période dans le passé. A la validation du formulaire, les mouvements
+correspondants sont créés et répartis sur la période donnée. Ces
+mouvement permettent aux autres processus de prendre en compte les
+prévisions.
+''',
+ 'description_de_DE':'''Bedarfsermittlung für die Lagerverwaltung
+ - Fügt das Modell "Vorhersage" zur Lagerverwaltung hinzu.
+ - Das Formular "Bedarfsermittlung" ermöglicht die Erstellung von zu
+ erwartenden Lagerbewegungen zu Kunden in einem beliebigen Zeitraum in der
+ Zukunft. Ein Wizard ermöglicht die Berechnung der zu erwartenden
+ Bewegungen auf der Grundlage eines Zeitraumes in der Vergangenheit. Bei
+ Bestätigung des Formulars werden die entsprechenden Lagerbewegungen
+ erzeugt und über den entsprechenden Zeitraum gleichmässig verteilt. Diese
+ Lagerbewegungen ermöglichen die Berücksichtigung von Vorhersagen in
+ den anderen Prozessen der Lagerverwaltung.
+''',
+ 'description_es_ES': '''Provee el modelo de «Previsión» en la gestión de inventarios.
+El formulario de previsión permite definir los movimientos de existencias
+planificados hacia los clientes en cualquier periodo de tiempo en el futuro.
+Un asistente permite calcular las cantidades esperadas respecto a un periodo
+en el pasado. Una vez el formulario se confirma, los movimientos
+correspondientes se crean y se distribuyen homogeneamente a lo largo del
+periodo. Dichos movimientos permitirá a otros procesos tener en cuenta
+previsiones.
+''',
+ 'description_es_CO': '''Provee el modelo de «Previsión» en la gestión de
+inventarios.
+El formulario de previsión permite definir los movimientos de existencias
+planificados hacia los clientes en cualquier período de tiempo en el futuro.
+Un asistente permite calcular las cantidades esperadas respecto a un período
+anterior. Cuando se confirma, los movimientos correspondientes se crean
+y se distribuyen homogeneamente en el período. Tales movimientos permitirá
+a otros procesos hacer previsiones.
+''',
+ 'depends': [
+ 'ir',
+ 'res',
+ 'workflow',
+ 'stock',
+ 'product',
+ 'company',
+ ],
+ 'xml': [
+ 'forecast.xml',
+ ],
+ 'translation': [
+ 'fr_FR.csv',
+ 'de_DE.csv',
+ 'es_ES.csv',
+ 'es_CO.csv',
+ ],
+}
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..dc28bd1
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,62 @@
+type,name,res_id,src,value,fuzzy
+error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""Bis Datum"" muss größer sein als ""Von Datum""",0
+error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Bei Bedarfsermittlungen für den selben Lagerort darf sich das Datum nicht überschneiden!,0
+error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","""Von Datum"" muss kleiner als ""Bis Datum"" sein!",0
+error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,Anzahl der Position muss größer als die Minimalanzahl sein!,0
+error,stock.forecast.line,0,Line quantity must be positive!,Anzahl der Position muss positiv sein!,0
+error,stock.forecast.line,0,Product must be unique by forcast!,Ein Artikel kann nur in einer Bedarfsermittlung vorkommen!,0
+field,"stock.forecast,company",0,Company,Unternehmen,0
+field,"stock.forecast.complete.ask,from_date",0,From Date,Von Datum,0
+field,"stock.forecast.complete.ask,to_date",0,To Date,Bis Datum,0
+field,"stock.forecast.complete.choose,products",0,Products,Artikel,0
+field,"stock.forecast,destination",0,Destination,Bestimmungsort,0
+field,"stock.forecast,from_date",0,From Date,Von Datum,0
+field,"stock.forecast.line,forecast",0,Forecast,Bedarfsermittlung,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Minimale Anzahl,0
+field,"stock.forecast.line,moves",0,Moves,Bewegungen,0
+field,"stock.forecast.line,product",0,Product,Artikel,0
+field,"stock.forecast.line,quantity",0,Quantity,Anzahl,0
+field,"stock.forecast.line,rec_name",0,Name,Name,0
+field,"stock.forecast,lines",0,Lines,Positionen,0
+field,"stock.forecast.line-stock.move,line",0,Forecast Line,Position Bedarfsermittlung,0
+field,"stock.forecast.line-stock.move,move",0,Move,Bewegung,0
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Name,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
+field,"stock.forecast.line,uom",0,UOM,Maßeinheit,0
+field,"stock.forecast,location",0,Location,Lagerort,0
+field,"stock.forecast,rec_name",0,Name,Name,0
+field,"stock.forecast,state",0,State,Status,0
+field,"stock.forecast,to_date",0,To Date,Bis Datum,0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Bedarfsermittlung durchführen,0
+model,"ir.action,name",act_forecast_form,Forecasts,Bedarfsermittlung,0
+model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Bedarfsermittlung,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
+model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Bedarfsermittlung Durchführen Nachfrage,0
+model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Bedarfsermittlung Durchführen Auswahl,0
+model,"stock.forecast.line,name",0,Stock Forecast Line,Position Bedarfsermittlung Lagerhaltung,0
+model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Position Bedarfsermittlung - Bewegung,0
+model,"stock.forecast,name",0,Stock Forecast,Bedarfsermittlung Lagerhaltung,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Abbrechen,0
+model,"workflow.activity,name",forecast_act_done,Done,Erledigt,0
+model,"workflow.activity,name",forecast_act_draft,Draft,Entwurf,0
+model,"workflow,name",wkf_forecast,Forecast,Bedarfsermittlung,0
+selection,"stock.forecast,state",0,Cancel,Abbrechen,0
+selection,"stock.forecast,state",0,Done,Erledigt,0
+selection,"stock.forecast,state",0,Draft,Entwurf,0
+view,stock.forecast,0,Add forecast line based on past data.,Erstelle Bedarfspositionen basierend auf den Werten aus der Vergangenheit,0
+view,stock.forecast,0,Cancel,Abbrechen,0
+view,stock.forecast,0,Complete Forecast,Bedarfsermittlung durchführen,0
+view,stock.forecast,0,Confirm,Bestätigen,0
+view,stock.forecast,0,Forecast,Bedarfsermittlung,0
+view,stock.forecast,0,Forecasts,Bedarfsermittlung,0
+view,stock.forecast,0,Reset to Draft,Auf Entwurf zurücksetzen,0
+view,stock.forecast.complete.ask,0,Choose dates,Auswahl Datum,0
+view,stock.forecast.complete.choose,0,Choose products,Auswahl Artikel,0
+view,stock.forecast.line,0,Forecast Line,Position Bedarfsermittlung,0
+view,stock.forecast.line,0,Forecast Lines,Positionen Bedarfsermittlung,0
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Durchführen,0
+wizard_button,"stock.forecast.complete,choose,end",0,cancel,Abbrechen,0
+wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Auswahl Datum,0
+wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Auswahl Artikel,0
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Durchführen,0
+wizard_button,"stock.forecast.complete,init,end",0,cancel,Abbrechen,0
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..df1bb5a
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,50 @@
+Stock Forecast Module
+#####################
+
+The stock forecast module provide a simple way to create stock moves
+toward customers with a date in the future. This allow other stock
+mecanism to anticipate customer demand.
+
+
+Forecast
+********
+
+The forecast form contains:
+
+ - A location from which the products will leave.
+ - A destination (which is a customer location).
+ - Two dates defining a period in the future.
+ - A company
+ - A list of forcast lines with:
+
+ - A product
+ - A quantity which represent the total demand for the period
+ - A minimal quantity for each move.
+ - A unit of measure.
+
+The "Complete Forecast" button allow to auto-complete forecast lines
+based on previous stock output for dates in the past.
+
+
+Forecast States
+^^^^^^^^^^^^^^^
+
+Draft
+
+ It is the initial state and the state used for edition. No moves are
+ linked to the forecast lines
+
+Done
+
+ Once in state done, moves are created for each forecast line:
+
+ - They are spread homogeneously between the two dates of the
+ forecast.
+
+ - Move quantities are bigger or equal to the minimal quantity set
+ on the forecast line.
+
+Cancel
+
+ On a cancelled forecast all existing moves are cancelled and the form
+ is readonly.
\ No newline at end of file
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..b57275b
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,62 @@
+type,name,res_id,src,value,fuzzy
+error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""Hasta la Fecha"" debe ser mayor que ""Desde la Fecha""",0
+error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,No puede crear proyecciones para la misma localización con fechas sobrepuestas,0
+error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","¡""Desde la Fecha"" puede ser menor que ""A la Fecha""!",0
+error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,¡La cantidad por línea debe ser mayor que la mínima cantidad!,0
+error,stock.forecast.line,0,Line quantity must be positive!,La línea de cantidad debe ser positiva!,1
+error,stock.forecast.line,0,Product must be unique by forcast!,¡El producto debe ser único por proyección!,0
+field,"stock.forecast,company",0,Company,Compañía,1
+field,"stock.forecast.complete.ask,from_date",0,From Date,Fecha Inicial,1
+field,"stock.forecast.complete.ask,to_date",0,To Date,A la Fecha,1
+field,"stock.forecast.complete.choose,products",0,Products,Productos,1
+field,"stock.forecast,destination",0,Destination,Destino,0
+field,"stock.forecast,from_date",0,From Date,Fecha Inicial,1
+field,"stock.forecast.line,forecast",0,Forecast,Proyección,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad Mínima,0
+field,"stock.forecast.line,moves",0,Moves,Movimientos,1
+field,"stock.forecast.line,product",0,Product,Productos,1
+field,"stock.forecast.line,quantity",0,Quantity,Cantidad,1
+field,"stock.forecast.line,rec_name",0,Name,Nombre de Contacto,1
+field,"stock.forecast,lines",0,Lines,Líneas de Inventario,1
+field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de Proyección,0
+field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,1
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre de Contacto,1
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,1
+field,"stock.forecast.line,uom",0,UOM,UDM,1
+field,"stock.forecast,location",0,Location,Lugar,1
+field,"stock.forecast,rec_name",0,Name,Nombre de Contacto,1
+field,"stock.forecast,state",0,State,Estado,1
+field,"stock.forecast,to_date",0,To Date,A la Fecha,1
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Proyección Completa,0
+model,"ir.action,name",act_forecast_form,Forecasts,Proyecciones,0
+model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Proyecciones,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Proyección de Almacén,0
+model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Pregunta de Proyección Completa,0
+model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Escojencia de Proyección Completa,0
+model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de Proyección de Alamacén,0
+model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Línea de Proyección - Mover,0
+model,"stock.forecast,name",0,Stock Forecast,Proyección de Almacén,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,1
+model,"workflow.activity,name",forecast_act_done,Done,Hecho,1
+model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,1
+model,"workflow,name",wkf_forecast,Forecast,Proyección,0
+selection,"stock.forecast,state",0,Cancel,Cancelar,1
+selection,"stock.forecast,state",0,Done,Hecho,1
+selection,"stock.forecast,state",0,Draft,Borrador,1
+view,stock.forecast,0,Add forecast line based on past data.,Adicione líneas de proyecciones basadas en fechas pasadas.,0
+view,stock.forecast,0,Cancel,Cancelar,1
+view,stock.forecast,0,Complete Forecast,Proyección Completa,0
+view,stock.forecast,0,Confirm,Confirmar,1
+view,stock.forecast,0,Forecast,Proyección,0
+view,stock.forecast,0,Forecasts,Proyecciones,0
+view,stock.forecast,0,Reset to Draft,Revertir a Borrador,1
+view,stock.forecast.complete.ask,0,Choose dates,Escoja fechas,0
+view,stock.forecast.complete.choose,0,Choose products,Escoja productos,0
+view,stock.forecast.line,0,Forecast Line,Línea de Proyección,0
+view,stock.forecast.line,0,Forecast Lines,Líneas de Proyección,0
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,1
+wizard_button,"stock.forecast.complete,choose,end",0,cancel,cancelar,0
+wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Escoja fechas,0
+wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Escoja productos,0
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,1
+wizard_button,"stock.forecast.complete,init,end",0,cancel,cancelar,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..219d264
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,62 @@
+type,name,res_id,src,value,fuzzy
+error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!",«Hasta la fecha» debe ser más reciente que «Desde la fecha»,0
+error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,No puede crear previsiones para las mísmas ubicaciones con fechas solapadas,0
+error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!",«Desde la fecha» debe ser anterior a «Hasta la fecha»,0
+error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,La línea cantidad debe ser mayor que la cantidad mínima,0
+error,stock.forecast.line,0,Line quantity must be positive!,La cantidad de la línea debe ser positiva,0
+error,stock.forecast.line,0,Product must be unique by forcast!,El producto debe ser único por previsión,0
+field,"stock.forecast,company",0,Company,Empresa,0
+field,"stock.forecast.complete.ask,from_date",0,From Date,Desde la fecha,0
+field,"stock.forecast.complete.ask,to_date",0,To Date,Hasta la fecha,0
+field,"stock.forecast.complete.choose,products",0,Products,Productos,0
+field,"stock.forecast,destination",0,Destination,Destino,0
+field,"stock.forecast,from_date",0,From Date,Desde la fecha,0
+field,"stock.forecast.line,forecast",0,Forecast,Previsión,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Cantidad Mínima,0
+field,"stock.forecast.line,moves",0,Moves,Movimientos,0
+field,"stock.forecast.line,product",0,Product,Producto,0
+field,"stock.forecast.line,quantity",0,Quantity,Cantidad,0
+field,"stock.forecast.line,rec_name",0,Name,Nombre,0
+field,"stock.forecast,lines",0,Lines,Líneas,0
+field,"stock.forecast.line-stock.move,line",0,Forecast Line,Línea de previsión,0
+field,"stock.forecast.line-stock.move,move",0,Move,Movimiento,0
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Nombre,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
+field,"stock.forecast.line,uom",0,UOM,UdM,0
+field,"stock.forecast,location",0,Location,Ubicación,0
+field,"stock.forecast,rec_name",0,Name,Nombre,0
+field,"stock.forecast,state",0,State,Estado,0
+field,"stock.forecast,to_date",0,To Date,Hasta la fecha,0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Previsión completa,0
+model,"ir.action,name",act_forecast_form,Forecasts,Previsión,0
+model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Previsiones,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Previsión de existéncias,0
+model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Pedir previsión completa,0
+model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Elegir previsión completa,0
+model,"stock.forecast.line,name",0,Stock Forecast Line,Línea de previsión de existencias,0
+model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,LineaPrevisión - Movimiento,0
+model,"stock.forecast,name",0,Stock Forecast,Previsión de existencias,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Cancelar,0
+model,"workflow.activity,name",forecast_act_done,Done,Hecho,0
+model,"workflow.activity,name",forecast_act_draft,Draft,Borrador,0
+model,"workflow,name",wkf_forecast,Forecast,Previsión,0
+selection,"stock.forecast,state",0,Cancel,Cancelar,0
+selection,"stock.forecast,state",0,Done,Hecho,0
+selection,"stock.forecast,state",0,Draft,Borrador,0
+view,stock.forecast,0,Add forecast line based on past data.,Añadir línea de previsión en base a datos anteriores.,0
+view,stock.forecast,0,Cancel,Cancelar,0
+view,stock.forecast,0,Complete Forecast,Previsión completa,0
+view,stock.forecast,0,Confirm,Confirmar,0
+view,stock.forecast,0,Forecast,Previsión,0
+view,stock.forecast,0,Forecasts,Previsiones,0
+view,stock.forecast,0,Reset to Draft,Restablecer a borrador,0
+view,stock.forecast.complete.ask,0,Choose dates,Elegir fechas,0
+view,stock.forecast.complete.choose,0,Choose products,Elegir productos,0
+view,stock.forecast.line,0,Forecast Line,Línea de previsión,0
+view,stock.forecast.line,0,Forecast Lines,Líneas de previsión,0
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Completo,0
+wizard_button,"stock.forecast.complete,choose,end",0,cancel,cancelar,0
+wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Elegir fechas,0
+wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Elegir productos,0
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Completo,0
+wizard_button,"stock.forecast.complete,init,end",0,cancel,cancelar,0
diff --git a/forecast.py b/forecast.py
new file mode 100644
index 0000000..c3f2424
--- /dev/null
+++ b/forecast.py
@@ -0,0 +1,468 @@
+#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.model import ModelView, ModelWorkflow, ModelSQL, fields
+from trytond.wizard import Wizard
+import datetime
+import mx.DateTime
+
+STATES = {
+ 'readonly': "state != 'draft'",
+}
+
+
+class Forecast(ModelWorkflow, ModelSQL, ModelView):
+ "Stock Forecast"
+ _name = "stock.forecast"
+ _description = __doc__
+ _rec_name = 'location'
+
+ location = fields.Many2One(
+ 'stock.location', 'Location', required=True,
+ domain=[('type', '=', 'storage')], states={
+ 'readonly': "state != 'draft' or bool(lines)",
+ })
+ destination = fields.Many2One(
+ 'stock.location', 'Destination', required=True,
+ domain=[('type', '=', 'customer')], states=STATES)
+ from_date = fields.Date('From Date', required=True, states=STATES)
+ to_date = fields.Date('To Date', required=True, states=STATES)
+ lines = fields.One2Many(
+ 'stock.forecast.line', 'forecast', 'Lines', states=STATES)
+ company = fields.Many2One(
+ 'company.company', 'Company', required=True, states={
+ 'readonly': "state != 'draft' or bool(lines)",
+ })
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('done', 'Done'),
+ ('cancel', 'Cancel'),
+ ], 'State', readonly=True, select=1)
+
+ def __init__(self):
+ super(Forecast, self).__init__()
+ self._rpc.update({
+ 'button_draft': True,
+ })
+ self._sql_constraints += [
+ ('check_from_to_date',
+ 'CHECK(to_date >= from_date)',
+ '"To Date" must be greater than "From Date"!'),
+ ]
+ self._constraints += [
+ ('check_date_overlap', 'date_overlap'),
+ ]
+ self._error_messages.update({
+ 'date_overlap': 'You can not create forecasts for the same '
+ 'locations with overlapping dates'
+ })
+ self._order.insert(0, ('from_date', 'DESC'))
+ self._order.insert(1, ('location', 'ASC'))
+
+ def default_state(self, cursor, user, context=None):
+ return 'draft'
+
+ def default_destination(self, cursor, user, context=None):
+ location_obj = self.pool.get('stock.location')
+ location_ids = location_obj.search(cursor, user,
+ self.destination.domain, context=context)
+ if len(location_ids) == 1:
+ return location_ids[0]
+ return False
+
+ def default_company(self, cursor, user, context=None):
+ company_obj = self.pool.get('company.company')
+ if context is None:
+ context = {}
+ if context.get('company'):
+ return context['company']
+ return False
+
+ def check_date_overlap(self, cursor, user, ids):
+ for forecast in self.browse(cursor, user, ids):
+ if forecast.state != 'done':
+ continue
+ cursor.execute('SELECT id ' \
+ 'FROM stock_forecast ' \
+ 'WHERE ((from_date <= %s AND to_date >= %s) ' \
+ 'OR (from_date <= %s AND to_date >= %s) ' \
+ 'OR (from_date >= %s AND to_date <= %s)) ' \
+ 'AND location = %s ' \
+ 'AND destination = %s ' \
+ 'AND state = \'done\' ' \
+ 'AND id != %s',
+ (forecast.from_date, forecast.from_date,
+ forecast.to_date, forecast.to_date,
+ forecast.from_date, forecast.to_date,
+ forecast.location.id, forecast.destination.id,
+ forecast.id))
+ if cursor.rowcount:
+ return False
+ return True
+
+ def button_draft(self, cursor, user, ids, context=None):
+ self.workflow_trigger_create(cursor, user, ids, context=context)
+ return True
+
+ def set_state_draft(self, cursor, user, forecast_id, context=None):
+ line_obj = self.pool.get("stock.forecast.line")
+ forecast = self.browse(cursor, user, forecast_id, context=context)
+ if forecast.state == "done":
+ line_obj.cancel_moves(cursor, user, forecast.lines, context=context)
+ self.write(cursor, user, forecast_id, {
+ 'state': 'draft',
+ }, context=context)
+
+ def set_state_cancel(self, cursor, user, forecast_id, context=None):
+ self.write(cursor, user, forecast_id, {
+ 'state': 'cancel',
+ }, context=context)
+
+ def set_state_done(self, cursor, user, forecast_id, context=None):
+ line_obj = self.pool.get('stock.forecast.line')
+ forecast = self.browse(cursor, user, forecast_id, context=context)
+
+ for line in forecast.lines:
+ line_obj.create_moves(cursor, user, line, context=context)
+ self.write(
+ cursor, user, forecast_id, {'state': 'done',}, context=context)
+
+ def copy(self, cursor, user, ids, default=None, context=None):
+ line_obj = self.pool.get('stock.forecast.line')
+
+ int_id = False
+ if isinstance(ids, (int, long)):
+ int_id = True
+ ids = [ids]
+
+ if default is None:
+ default = {}
+ default = default.copy()
+ default['lines'] = False
+
+ new_ids = []
+ for forecast in self.browse(cursor, user, ids, context=context):
+ new_id = super(Forecast, self).copy(cursor, user, forecast.id,
+ default=default, context=context)
+ line_obj.copy(cursor, user, [x.id for x in forecast.lines],
+ default={
+ 'forecast': new_id,
+ }, context=context)
+ new_ids.append(new_id)
+
+ if int_id:
+ return new_ids[0]
+ return new_ids
+
+Forecast()
+
+
+class ForecastLine(ModelSQL, ModelView):
+ 'Stock Forecast Line'
+ _name = 'stock.forecast.line'
+ _description = __doc__
+ _rec_name = 'product'
+
+ product = fields.Many2One('product.product', 'Product', required=True,
+ domain=[('type', '=', 'stockable')], on_change=['product'])
+ uom = fields.Many2One(
+ 'product.uom', 'UOM', required=True,
+ domain="[('category', '=', (product, 'product.default_uom.category'))]")
+ unit_digits = fields.Function('get_unit_digits', type='integer',
+ string='Unit Digits')
+ quantity = fields.Float('Quantity', digits="(16, unit_digits)", required=True)
+ minimal_quantity = fields.Float(
+ 'Minimal Qty', digits="(16, unit_digits)", required=True)
+ moves = fields.Many2Many('stock.forecast.line-stock.move',
+ 'line', 'move','Moves', readonly=True)
+ forecast = fields.Many2One(
+ 'stock.forecast', 'Forecast', required=True, ondelete='CASCADE',)
+
+ def __init__(self):
+ super(ForecastLine, self).__init__()
+ self._sql_constraints += [
+ ('check_line_qty_pos',
+ 'CHECK(quantity >= 0.0)', 'Line quantity must be positive!'),
+ ('check_line_minimal_qty',
+ 'CHECK(quantity >= minimal_quantity)',
+ 'Line quantity must be greater than the minimal quantity!'),
+ ('forecast_product_uniq', 'UNIQUE(forecast, product)',
+ 'Product must be unique by forcast!'),
+ ]
+
+ def default_unit_digits(self, cursor, user, context=None):
+ return 2
+
+ def default_minimal_quantity(self, cursor, user, context=None):
+ return 1.0
+
+ def on_change_product(self, cursor, user, ids, vals, context=None):
+ product_obj = self.pool.get('product.product')
+ uom_obj = self.pool.get('product.uom')
+ res = {}
+ res['unit_digits'] = 2
+ if vals.get('product'):
+ product = product_obj.browse(cursor, user, vals['product'],
+ context=context)
+ res['uom'] = product.default_uom.id
+ res['uom.rec_name'] = product.default_uom.rec_name
+ res['unit_digits'] = product.default_uom.digits
+ return res
+
+ def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+ res = {}
+ for line in self.browse(cursor, user, ids, context=context):
+ res[line.id] = line.product.default_uom.digits
+ return res
+
+ def copy(self, cursor, user, ids, default=None, context=None):
+ if default is None:
+ default = {}
+ default = default.copy()
+ default['moves'] = False
+ return super(ForecastLine, self).copy(cursor, user, ids,
+ default=default, context=context)
+
+ def create_moves(self, cursor, user, line, context=None):
+ move_obj = self.pool.get('stock.move')
+ uom_obj = self.pool.get('product.uom')
+ delta = line.forecast.to_date - line.forecast.from_date
+ delta = delta.days + 1
+ nb_packet = int(line.quantity/line.minimal_quantity)
+ distribution = self.distribute(
+ cursor, user, delta, nb_packet, context=context)
+ unit_price = False
+ if line.forecast.destination.type == 'customer':
+ unit_price = line.product.list_price
+ unit_price = uom_obj.compute_price(
+ cursor, user, line.product.default_uom, unit_price, line.uom,
+ context=context)
+
+ moves = []
+ for day, qty in distribution.iteritems():
+ if qty == 0.0:
+ continue
+ mid = move_obj.create(
+ cursor, user,
+ {'from_location': line.forecast.location.id,
+ 'to_location': line.forecast.destination.id,
+ 'product': line.product.id,
+ 'uom': line.uom.id,
+ 'quantity': qty * line.minimal_quantity,
+ 'planned_date': line.forecast.from_date + datetime.timedelta(day),
+ 'company': line.forecast.company.id,
+ 'currency':line.forecast.company.currency,
+ 'unit_price': unit_price,
+ },
+ context=context)
+ moves.append(('add',mid))
+ self.write(cursor, user, line.id, {'moves': moves}, context=context)
+
+ def cancel_moves(self, cursor, user, lines, context=None):
+ move_obj = self.pool.get('stock.move')
+ move_obj.write(
+ cursor, user, [m.id for l in lines for m in l.moves], {'state': 'cancel'},
+ context=context)
+ move_obj.delete(
+ cursor, user, [m.id for l in lines for m in l.moves], context=context)
+
+ def distribute(self, cursor, user, delta, qty, context=None):
+ range_delta = range(delta)
+ a = {}.fromkeys(range_delta, 0)
+ while qty > 0:
+ if qty > delta:
+ for i in range_delta:
+ a[i] += qty//delta
+ qty = qty%delta
+ elif delta//qty > 1:
+ i = 0
+ while i < qty:
+ a[i*delta//qty + (delta//qty/2)] += 1
+ i += 1
+ qty = 0
+ else:
+ for i in range_delta:
+ a[i] += 1
+ qty = delta-qty
+ i = 0
+ while i < qty:
+ a[delta - ((i*delta//qty) + (delta//qty/2)) - 1] -= 1
+ i += 1
+ qty = 0
+ return a
+
+ForecastLine()
+
+
+class ForecastLineMove(ModelSQL):
+ 'ForecastLine - Move'
+ _name = 'stock.forecast.line-stock.move'
+ _table = 'forecast_line_stock_move_rel'
+ _description = __doc__
+ line = fields.Many2One('stock.forecast.line', 'Forecast Line',
+ ondelete='CASCADE', select=1, required=True)
+ move = fields.Many2One('stock.move', 'Move', ondelete='CASCADE',
+ select=1, required=True)
+
+ForecastLineMove()
+
+
+class ForecastCompleteAsk(ModelView):
+ 'Forecast Complete Ask'
+ _name = 'stock.forecast.complete.ask'
+ _description = __doc__
+ from_date = fields.Date('From Date', required=True)
+ to_date = fields.Date('To Date', required=True)
+
+ForecastCompleteAsk()
+
+
+class ForecastCompleteChoose(ModelView):
+ 'Forecast Complete Choose'
+ _name = 'stock.forecast.complete.choose'
+ _description = __doc__
+ products = fields.Many2Many('product.product', None, None, 'Products')
+
+ForecastCompleteChoose()
+
+
+class ForecastComplete(Wizard):
+ 'Complete Forecast'
+ _name = 'stock.forecast.complete'
+ states = {
+ 'init': {
+ 'actions': ['_set_default_dates'],
+ 'result': {
+ 'type': 'form',
+ 'object': 'stock.forecast.complete.ask',
+ 'state': [
+ ('end', 'cancel', 'tryton-cancel'),
+ ('choose', 'Choose products', 'tryton-go-next'),
+ ('complete', 'Complete', 'tryton-ok', True),
+ ],
+ },
+ },
+
+ 'choose': {
+ 'actions': ['_set_default_products'],
+ 'result': {
+ 'type': 'form',
+ 'object': 'stock.forecast.complete.choose',
+ 'state': [
+ ('end', 'cancel', 'tryton-cancel'),
+ ('init', 'Choose Dates', 'tryton-go-previous'),
+ ('complete', 'Complete', 'tryton-ok', True),
+ ],
+ },
+ },
+
+ 'complete': {
+ 'result': {
+ 'type': 'action',
+ 'action': '_complete',
+ 'state': 'end',
+ },
+ },
+ }
+
+ def __init__(self):
+ super(ForecastComplete, self).__init__()
+ self._error_messages.update({
+ 'from_to_date': '"From Date" should be smaller than "To Date"!',
+ })
+
+
+ def _set_default_dates(self, cursor, user, data, context=None):
+ """
+ Forecast dates shifted by one year.
+ """
+ forecast_obj = self.pool.get('stock.forecast')
+ forecast = forecast_obj.browse(cursor, user, data['id'], context=context)
+
+ res = {}
+ for field in ("to_date", "from_date"):
+ date = mx.DateTime.strptime(str(forecast[field]), '%Y-%m-%d')
+ new_date = date - mx.DateTime.RelativeDateTime(years=1)
+ res[field] = datetime.date(new_date.year, new_date.month,
+ new_date.day)
+ return res
+
+ def _get_product_quantity(self, cursor, user, data, context=None):
+ forecast_obj = self.pool.get('stock.forecast')
+ product_obj = self.pool.get('product.product')
+ forecast = forecast_obj.browse(cursor, user, data['id'], context=context)
+ if data['form']['from_date'] > data['form']['to_date']:
+ self.raise_user_error(cursor, 'from_to_date', context=context)
+ local_context = context and context.copy() or {}
+ local_context['stock_destinations'] = [forecast.destination.id]
+ local_context['stock_date_start'] = data['form']['from_date']
+ local_context['stock_date_end'] = data['form']['to_date']
+
+ return product_obj.products_by_location(
+ cursor, user, [forecast.location.id], with_childs=True,
+ skip_zero=False, context=local_context)
+
+ def _set_default_products(self, cursor, user, data, context=None):
+ """
+ Collect products for which there is an outgoing stream between
+ the given location and the destination.
+ """
+ pbl = self._get_product_quantity(cursor, user, data, context=context)
+ products = []
+ for (_, product), qty in pbl.iteritems():
+ if qty < 0:
+ products.append(product)
+ data['form'].update({'products': products})
+ return data['form']
+
+ def _complete(self, cursor, user, data, context=None):
+ forecast_obj = self.pool.get('stock.forecast')
+ forecast_line_obj = self.pool.get('stock.forecast.line')
+ product_obj = self.pool.get('product.product')
+
+ prod2line = {}
+ forecast_line_ids = forecast_line_obj.search(
+ cursor, user, [('forecast', '=', data['id'])], context=context)
+ for forecast_line in forecast_line_obj.browse(
+ cursor, user, forecast_line_ids, context=context):
+ prod2line[forecast_line.product.id] = forecast_line.id
+
+ pbl = self._get_product_quantity(cursor, user, data, context=context)
+ product_ids = [x[1] for x in pbl]
+ prod2uom = {}
+ for product in product_obj.browse(cursor, user, product_ids,
+ context=context):
+ prod2uom[product.id] = product.default_uom.id
+
+ if data['form'].get('products'):
+ products = data['form']['products'][0][1]
+ else:
+ products = None
+
+ for (_, product), qty in pbl.iteritems():
+ if products and product not in products:
+ continue
+ if -qty <= 0:
+ continue
+ if product in prod2line:
+ forecast_line_obj.write(
+ cursor, user, prod2line[product],
+ {'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': data['id'],
+ 'minimal_quantity': min(1, -qty),
+ },
+ context=context)
+ else:
+ forecast_line_obj.create(
+ cursor, user,
+ {'product': product,
+ 'quantity': -qty,
+ 'uom': prod2uom[product],
+ 'forecast': data['id'],
+ 'minimal_quantity': min(1, -qty),
+ },
+ context=context)
+ return {}
+
+ForecastComplete()
diff --git a/forecast.xml b/forecast.xml
new file mode 100644
index 0000000..65032a6
--- /dev/null
+++ b/forecast.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+ <data>
+ <record model="res.group" id="group_stock_forecast">
+ <field name="name">Stock Forecast</field>
+ </record>
+ <record model="res.user" id="res.user_admin">
+ <field name="groups"
+ eval="[('add', ref('group_stock_forecast'))]"/>
+ </record>
+ <record model="ir.action.wizard" id="wizard_forecast_complete">
+ <field name="name">Complete Forecast</field>
+ <field name="wiz_name">stock.forecast.complete</field>
+ <field name="model">stock.forecast</field>
+ </record>
+
+ <record model="ir.ui.view" id="forecast_view_form">
+ <field name="model">stock.forecast</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Forecast" col="4">
+ <label name="location"/>
+ <field name="location"/>
+ <label name="destination"/>
+ <field name="destination"/>
+ <label name="from_date"/>
+ <field name="from_date"/>
+ <label name="to_date"/>
+ <field name="to_date"/>
+ <label name="company"/>
+ <field name="company"/>
+ <button string="Complete Forecast" type="action"
+ name="%(wizard_forecast_complete)d"
+ states="{'readonly': '''state != 'draft' '''}"
+ colspan="2"
+ help="Add forecast line based on past data."/>
+ <field name="lines" colspan="4"/>
+ <group col="4" colspan="4" id="state_buttons">
+ <label name="state"/>
+ <field name="state"/>
+ <group colspan="2" col="3" id="buttons">
+ <button string="Reset to Draft"
+ name="button_draft"
+ type="object"
+ states="{'invisible': '''state == 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ icon="tryton-clear"/>
+ <button string="Cancel"
+ name="cancel"
+ states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ icon="tryton-cancel"/>
+ <button string="Confirm"
+ name="done"
+ states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_stock_forecast)d not in groups'''}"
+ icon="tryton-ok"/>
+ </group>
+ </group>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="forecast_view_tree">
+ <field name="model">stock.forecast</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Forecasts">
+ <field name="location" select="1"/>
+ <field name="state" select="1"/>
+ <field name="from_date"/>
+ <field name="to_date"/>
+ <field name="company" select="2"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.action.act_window" id="act_forecast_form">
+ <field name="name">Forecasts</field>
+ <field name="res_model">stock.forecast</field>
+ <field name="view_type">form</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form_view1">
+ <field name="sequence" eval="1"/>
+ <field name="view" ref="forecast_view_tree"/>
+ <field name="act_window" ref="act_forecast_form"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_forecast_form_view2">
+ <field name="sequence" eval="2"/>
+ <field name="view" ref="forecast_view_form"/>
+ <field name="act_window" ref="act_forecast_form"/>
+ </record>
+ <menuitem parent="stock.menu_stock" sequence="50"
+ action="act_forecast_form" id="menu_forecast_form"/>
+
+ <record model="ir.ui.view" id="forecast_line_view_form">
+ <field name="model">stock.forecast.line</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Forecast Line" col="4">
+ <label name="forecast"/>
+ <field name="forecast"/>
+ <newline/>
+ <label name="product"/>
+ <field name="product"/>
+ <label name="quantity"/>
+ <field name="quantity"/>
+ <label name="minimal_quantity"/>
+ <field name="minimal_quantity"/>
+ <label name="uom"/>
+ <field name="uom"/>
+ <separator name="moves" colspan="4"/>
+ <field name="moves" colspan="4"/>
+ <field name="unit_digits" invisible="1" colspan="4"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="forecast_line_view_tree">
+ <field name="model">stock.forecast.line</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Forecast Lines" editable="bottom">
+ <field name="product" select="1"/>
+ <field name="quantity" select="1"/>
+ <field name="minimal_quantity" select="2"/>
+ <field name="uom" select="1"/>
+ <field name="forecast" select="2"/>
+ <field name="unit_digits" tree_invisible="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <!-- Workflow forecast -->
+ <record model="workflow" id="wkf_forecast">
+ <field name="name">Forecast</field>
+ <field name="osv">stock.forecast</field>
+ <field name="on_create">True</field>
+ </record>
+ <record model="workflow.activity" id="forecast_act_draft">
+ <field name="workflow" ref="wkf_forecast"/>
+ <field name="flow_start">True</field>
+ <field name="kind">function</field>
+ <field name="action">set_state_draft()</field>
+ <field name="name">Draft</field>
+ </record>
+ <record model="workflow.activity" id="forecast_act_cancel">
+ <field name="workflow" ref="wkf_forecast"/>
+ <field name="flow_stop">True</field>
+ <field name="name">Cancel</field>
+ <field name="kind">function</field>
+ <field name="action">set_state_cancel()</field>
+ </record>
+ <record model="workflow.activity" id="forecast_act_done">
+ <field name="workflow" ref="wkf_forecast"/>
+ <field name="flow_stop">True</field>
+ <field name="name">Done</field>
+ <field name="kind">function</field>
+ <field name="action">set_state_done()</field>
+ </record>
+ <record model="workflow.transition"
+ id="forecast_trans_draft_cancel">
+ <field name="act_from" ref="forecast_act_draft"/>
+ <field name="act_to" ref="forecast_act_cancel"/>
+ <field name="group" ref="group_stock_forecast"/>
+ <field name="signal">cancel</field>
+ </record>
+ <record model="workflow.transition"
+ id="forecast_trans_draft_done">
+ <field name="act_from" ref="forecast_act_draft"/>
+ <field name="act_to" ref="forecast_act_done"/>
+ <field name="group" ref="group_stock_forecast"/>
+ <field name="signal">done</field>
+ </record>
+
+ <record model="ir.ui.view" id="stock_forecast_comlete_ask_view_form">
+ <field name="model">stock.forecast.complete.ask</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Choose dates" col="2">
+ <label name="from_date"/>
+ <field name="from_date"/>
+ <label name="to_date"/>
+ <field name="to_date"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="stock_forecast_comlete_choose_view_form">
+ <field name="model">stock.forecast.complete.choose</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Choose products" col="1" >
+ <separator name="products"/>
+ <field name="products" width="600" height="300"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+
+ <record model="ir.model.access" id="access_forecast">
+ <field name="model" search="[('model', '=', 'stock.forecast')]"/>
+ <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.model.access" id="access_forecast_group_stock">
+ <field name="model" search="[('model', '=', 'stock.forecast')]"/>
+ <field name="group" ref="group_stock_forecast"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="True"/>
+ <field name="perm_create" eval="True"/>
+ <field name="perm_delete" eval="True"/>
+ </record>
+
+ <record model="ir.model.access" id="access_forecast_line">
+ <field name="model" search="[('model', '=', 'stock.forecast.line')]"/>
+ <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.model.access" id="access_forecast_line_group_stock">
+ <field name="model" search="[('model', '=', 'stock.forecast.line')]"/>
+ <field name="group" ref="group_stock_forecast"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="True"/>
+ <field name="perm_create" eval="True"/>
+ <field name="perm_delete" eval="True"/>
+ </record>
+
+ </data>
+</tryton>
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..a4db12c
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,62 @@
+type,name,res_id,src,value,fuzzy
+error,stock.forecast,0,"""To Date"" must be greater than ""From Date""!","""À la date"" doit être plus grande que «De la date"" !",0
+error,stock.forecast,0,You can not create forecasts for the same locations with overlapping dates,Vous ne pouvez pas créer des prévisions pour les mêmes emplacements avec des dates qui se chevauchent,0
+error,stock.forecast.complete,0,"""From Date"" should be smaller than ""To Date""!","""De la date"" devrait être plus petit que ""À la date"" !",0
+error,stock.forecast.line,0,Line quantity must be greater than the minimal quantity!,La quantité de ligne doit être supérieure à la quantité minimale !,0
+error,stock.forecast.line,0,Line quantity must be positive!,Les quantités sur les lignes doivent être positives!,0
+error,stock.forecast.line,0,Product must be unique by forcast!,Le produit doit être unique par prévision !,0
+field,"stock.forecast,company",0,Company,Société,0
+field,"stock.forecast.complete.ask,from_date",0,From Date,Date de début,0
+field,"stock.forecast.complete.ask,to_date",0,To Date,Date de fin,0
+field,"stock.forecast.complete.choose,products",0,Products,Produits,0
+field,"stock.forecast,destination",0,Destination,Destination,0
+field,"stock.forecast,from_date",0,From Date,Date de début,0
+field,"stock.forecast.line,forecast",0,Forecast,Prévision,0
+field,"stock.forecast.line,minimal_quantity",0,Minimal Qty,Qté minimale,0
+field,"stock.forecast.line,moves",0,Moves,Mouvements,0
+field,"stock.forecast.line,product",0,Product,Produit,0
+field,"stock.forecast.line,quantity",0,Quantity,Quantité,0
+field,"stock.forecast.line,rec_name",0,Name,Nom,0
+field,"stock.forecast,lines",0,Lines,Lignes,0
+field,"stock.forecast.line-stock.move,line",0,Forecast Line,Ligne de prévision,0
+field,"stock.forecast.line-stock.move,move",0,Move,Mouvement,0
+field,"stock.forecast.line-stock.move,rec_name",0,Name,Nom,0
+field,"stock.forecast.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
+field,"stock.forecast.line,uom",0,UOM,UDM,0
+field,"stock.forecast,location",0,Location,Emplacement,0
+field,"stock.forecast,rec_name",0,Name,Nom,0
+field,"stock.forecast,state",0,State,État,0
+field,"stock.forecast,to_date",0,To Date,Date de fin,0
+model,"ir.action,name",wizard_forecast_complete,Complete Forecast,Completer les prévisions,0
+model,"ir.action,name",act_forecast_form,Forecasts,Prévisions,0
+model,"ir.ui.menu,name",menu_forecast_form,Forecasts,Prévisions,0
+model,"res.group,name",group_stock_forecast,Stock Forecast,Stock prévisionnel,0
+model,"stock.forecast.complete.ask,name",0,Forecast Complete Ask,Completer la prévision - Demander,0
+model,"stock.forecast.complete.choose,name",0,Forecast Complete Choose,Completer la prévision - Choisir,0
+model,"stock.forecast.line,name",0,Stock Forecast Line,Ligne de prévision de stock,0
+model,"stock.forecast.line-stock.move,name",0,ForecastLine - Move,Ligne de prévision - Mouvement,0
+model,"stock.forecast,name",0,Stock Forecast,Stock prévisionnel,0
+model,"workflow.activity,name",forecast_act_cancel,Cancel,Annuler,0
+model,"workflow.activity,name",forecast_act_done,Done,Fait,0
+model,"workflow.activity,name",forecast_act_draft,Draft,Brouillon,0
+model,"workflow,name",wkf_forecast,Forecast,Prévision,0
+selection,"stock.forecast,state",0,Cancel,Annuler,0
+selection,"stock.forecast,state",0,Done,Fait,0
+selection,"stock.forecast,state",0,Draft,Brouillon,0
+view,stock.forecast,0,Add forecast line based on past data.,Ajouter la ligne des prévisions fondées sur des données historiques.,0
+view,stock.forecast,0,Cancel,Annuler,0
+view,stock.forecast,0,Complete Forecast,Completer la prévision,0
+view,stock.forecast,0,Confirm,Confirmer,0
+view,stock.forecast,0,Forecast,Prévision,0
+view,stock.forecast,0,Forecasts,Prévisions,0
+view,stock.forecast,0,Reset to Draft,Remettre en brouillon,0
+view,stock.forecast.complete.ask,0,Choose dates,Choisir les dates,0
+view,stock.forecast.complete.choose,0,Choose products,Choisissez les produits,0
+view,stock.forecast.line,0,Forecast Line,Ligne de prévision,0
+view,stock.forecast.line,0,Forecast Lines,Lignes de prévision,0
+wizard_button,"stock.forecast.complete,choose,complete",0,Complete,Achevé,0
+wizard_button,"stock.forecast.complete,choose,end",0,cancel,annuler,0
+wizard_button,"stock.forecast.complete,choose,init",0,Choose Dates,Choisissez les dates,0
+wizard_button,"stock.forecast.complete,init,choose",0,Choose products,Choisissez les produits,0
+wizard_button,"stock.forecast.complete,init,complete",0,Complete,Achevé,0
+wizard_button,"stock.forecast.complete,init,end",0,cancel,annuler,0
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..88a74c8
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+#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 setuptools import setup, find_packages
+import re
+
+info = eval(file('__tryton__.py').read())
+
+requires = ['egenix-mx-base']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+ requires.append('trytond_' + dep)
+
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+requires.append('trytond >= %s.%s' % (major_version, minor_version))
+requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+
+setup(name='trytond_stock_forecast',
+ version=info.get('version', '0.0.1'),
+ description=info.get('description', ''),
+ author=info.get('author', ''),
+ author_email=info.get('email', ''),
+ url=info.get('website', ''),
+ package_dir={'trytond.modules.stock_forecast': '.'},
+ packages=[
+ 'trytond.modules.stock_forecast',
+ ],
+ package_data={
+ 'trytond.modules.stock_forecast': info.get('xml', []) \
+ + info.get('translation', []),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'Natural Language :: English',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Spanish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ install_requires=requires,
+)
diff --git a/trytond_stock_forecast.egg-info/PKG-INFO b/trytond_stock_forecast.egg-info/PKG-INFO
new file mode 100644
index 0000000..e2a4b72
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/PKG-INFO
@@ -0,0 +1,31 @@
+Metadata-Version: 1.0
+Name: trytond-stock-forecast
+Version: 1.2.0
+Summary: Provide the "Forecast" model in Inventory Management.
+The Forecast form allow to define the expected stock movement towards
+customers in any period of time in the future. A wizard allow to
+compute the expected quantities with respect to a period in the
+past. Once the form confirmed, the corresponding moves are created and
+spread homogeneously across the period. Those moves will allow other
+process to take forecasts into account.
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/trytond_stock_forecast.egg-info/SOURCES.txt b/trytond_stock_forecast.egg-info/SOURCES.txt
new file mode 100644
index 0000000..b9fa36f
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/SOURCES.txt
@@ -0,0 +1,21 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+de_DE.csv
+es_CO.csv
+es_ES.csv
+forecast.xml
+fr_FR.csv
+setup.py
+./__init__.py
+./__tryton__.py
+./forecast.py
+doc/index.rst
+trytond_stock_forecast.egg-info/PKG-INFO
+trytond_stock_forecast.egg-info/SOURCES.txt
+trytond_stock_forecast.egg-info/dependency_links.txt
+trytond_stock_forecast.egg-info/requires.txt
+trytond_stock_forecast.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_stock_forecast.egg-info/dependency_links.txt b/trytond_stock_forecast.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_stock_forecast.egg-info/requires.txt b/trytond_stock_forecast.egg-info/requires.txt
new file mode 100644
index 0000000..406df12
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/requires.txt
@@ -0,0 +1,6 @@
+egenix-mx-base
+trytond_stock
+trytond_product
+trytond_company
+trytond >= 1.2
+trytond < 1.3
\ No newline at end of file
diff --git a/trytond_stock_forecast.egg-info/top_level.txt b/trytond_stock_forecast.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_stock_forecast.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
--
tryton-modules-stock-forecast
More information about the tryton-debian-vcs
mailing list