The Tryton Unconference 2017 is only two weeks away.
Registration is still open.
But for those who can not make it, we will broadcast a live streaming on our
Youtube channel.
The first day, 7th December 2017, is dedicated to business
oriented talks.
As new year resolution, we plan to make a monthly post about what happened in
the Tryton project.
TUL2017
The annual Tryton Unconference 2017 took
place from the 7th to 10th December at Liège. It started with 2 days of talks
and finished with 2 days of code sprint. We also celebrated the 10th
anniversary of the project with some drinks and cakes. For those who could
not attend, the talks have been registered and the video
and slides are available here (note: a
technical issue prevented to correctly record the sound the first day but it
is still watchable).
Some pictures of the events have also been published.
Drop GTK+-2
The desktop client is supporting since one year both version of GTK+ 2 and 3.
It is now time to have only GTK+-3 and
thus be able to use new features of this version.
The build environment for Windows and Mac has been updated to produce builds
with the new version of the library.
New Release Process
A discussion started at the #TUL2017 to have longer term release for Tryton.
A new process has been discussed which
has a majority of positive feedback.
So the series ending by 0 (like 5.0) will be supported for 5 years and the
others for 1 year. We will keep the rate of one release every 6 month.
The new schema will start with the series 5.0 which will be released the 1st
October 2018.
Python 3
At the #TUL2017, we discussed about when to drop the support for Python 2 for
which upstream support ends in 2020. So we must ensure to stop supporting
Python 2 for any series that should still be supported in 2020. The result is
that 5.0 will be the first release with only Python 3 support for the server
side and also for the desktop client.
Order Line Description
The description of order lines (sale, purchase, invoice etc.) are no more
filled automatically. This prevent to
duplicate the content from the product form to each lines. But also simplify
and speedup the creation of a line from the code.
Moreover the product supplier
information can be stored on the purchase line. This information can be used
on the purchase line instead of the product information. It allows to search
per supplier references and to display on the report as description for the
line, the reference of the product from the supplier.
Promotion Coupon
This new module allows to create coupon
that are used to apply a promotion on the sale. The coupon can be configured
to be usable only a specific number of times globally or per party.
PYSON Domain Validation
For PYSONdomain, the ORM have the
simple strategy to validate records to group them per evaluated domain and
then make a search per domain. But it is not optimal when evaluated domains
are likely to be unique per record because this generate a search per record.
A new case has been added to handle this which searches by grouping multiple
domains at once and thus reduce the
number of queries.
Dialog Size
Until now, dialog were created with a smaller size than the parent window. But
it had the disadvantage to create quickly too small dialog windows. So this
behaviour has been changed to use always the same size as the
parent.
Query for currency rate
The Tryton design for currency rate is a table with the rate and a date
from which the rate applies until another row is added for the currency with a
later date.
A new method has been added
Currency.currency_rate_sql which returns a SQL query that produces for
each currency the rate, start_date and end_date. This is useful to get a
currency rate in a larger SQL query. This method uses the window functions if
available on the database back-end to produce optimized query.
Standalone Lines Workflow
Tryton allows to work with standalone lines instead of pre-generated document
to follow the grouping method of external sources.
But this requires to have enough origin information to select them. So to
improve the workflow the supplier stock moves show the purchase order and the invoice lines show their origin.
issue5233: The web client format the
numeric values with the user locale but also use an input of type 'number'
for editing. This allow to have the right virtual keyboard on mobile.
issue6875: The autocompletion was not
shown when the user changed existing value in an editable list.
issue6978: The inventory lines is now
read-only until date and location are filled.
issue6132: The user is warned if he
tries to confirm a purchase order for a different warehouse than the
warehouse of the purchase request.
issue7009: Catch all exceptions when
evaluating value on pyson widget.
issue6934: Search and order
translated fields using derivative language.
issue6915: Show in reconciliation
receivable/payable with negative/positive balance
issue7005: Remove definition of rules
on user. The group should be the only place where access rights are assigned
to the user.
issue7014: Use a date instead of a
boolean for reconciled field on invoice.
issue7013: Use canonical JSON form
for Dict value.
issue7016: Add relate from drop
shipment to sale and purchase.
issue7031: Fix missing party name on
invoice report on series 4.6.
New Service Company
The company m-ds has joined the [list of companies
providing services](/services.html) on Tryton.
Ongoing Works
Wesite Redesign
The Foundation has launch the process of redesigning the website as we reached
the financial goal. A company has
been hired to make this design but we are looking for your inputs.
New Version Notification
The work has started to provide to the desktop client notification for
bug-fix releases. It
is important because the desktop client is the only part of the Tryton suite
for which the update needs to be managed by the user. And we often see users
not updating it and reporting issues which have already been fixed.
Support for geographic objects
An external backend with support of geographic fields is under review. It will support only PostGIS in a first time but maybe SpatiaLite will be added in the
future.
The backend adds all the standard geometry type of columns and supports the
operator = and != in the domain. More operations can be added by using
python-sql.
The is the second monthly news for Tryton. The developers have not been idle
during the month of January.
XML Style
The XML style guideline has been updated to
remove the constraint of 80 columns. It appeared that this rule did not
produce good readable file. Instead we accept to have the opening tag on a
single line or one attribute per line.
GIS
A new back-end trytond-gis has been
added to support geographic types. It works with PostGIS for now but contribution is welcome to add others like
SpatiaLite.
The tryton ORM
support the fields: GEOMETRY, POINT, LINESTRING, POLYGON,
MULTIPOINT, MULTILINESTRING, MULTIPOLYGON and GEOMETRYCOLLECTION; and
the operators = and !=. Of course it is possible to write SQL queries
that use other geometric operators thanks to the extensibility of python-sql.
Modify Header Wizard
On document like sale, purchase or invoice, there are often constraint that
prevent to modify the header once a line has been filled. For example, on the
sale it is not allowed to change the currency when there are lines. This is
because the unit price computed on the lines depend on the currency selected.
But in some cases, the user may really want to change those header fields
because he wants to correct a mistake.
Now it is possible to edit the header fields thanks to the Modify Header
Wizard which takes care of recompute the
lines according to the changes.
Post Clearing Moves
A cron task has been added that will
post automatically the clearing moves after a delay. The delay is configured
on the payment journal.
Stripe Payment
If the customer disputes the payment, a
dispute status will be update on the
Tryton payment. When the dispute is closed, the payment is updated according
if the company win or lose.
Some missing charge events has been added. In particular, the refund event which
may update the payment amount when it is partial.
New Version Notification
The desktop client has a new option to check if new version for the same series has been published.
It takes care of the build for Windows and MacOS.
Register Mixin
A new mechanism has been introduced by issue4735 which allows to extend with the same
Mixin all the existing pool objects that are
subclasses of a target.
A usage example is to extend the Report.convert method of all existing
reports to add support for another engine.
Docker Image with libreoffice
Tryton is able to convert the Open Document generated files by the report
engine into any format supported by LibreOffice. The default Docker image does not have the requirements for
such conversion because it almost triple the size of the image. But now with
issue7054, we will publish also images
with the suffix -office which contains all the requirements.
Add mnemonic to label of fields
The desktop client had already mnemonic for all button. But with issue2312, they are also added to all field
labels. This allow to jumb quickly to any visible field by pressing ALT +
<the underlined key>.
Keyword for button
The current form buttons are automatically added to the toolbar under the
action menu for fast access. Now with issue7067, the developer can define under which
toolbar menu the button will be put. The available options are action, relate
or print.
MySQL backend removed
We have decided to remove the MySQL backend from the core of Tryton. The
back-end was not tested on our continuous integration server and so it has many failures like not
supporting Python3. The current code has been move to its own repository. This module will not be part
of the release process until some volunteer make it green on the test server.
Bug fixes & Improvements
issue7035: The MacOS X build since
the switch to brew contained optimized code for the
build machine. Now the build uses non-optimized options.
issue6946: The TimeDelta field uses
now also the context of the Group of records to format its values. This
also applies to the sum on list view.
issue7063: It enforces the
consistency for the currency between the display digits and the rounding
factor.
issue7058: The name attribute of the
tag image can now be a field. In this case, it will display the icon from
the value of the field.
issue6400: The currency module
receives the tooltips as defined in this task.
We can see by the number of improvements and issues solved this month that the
release 4.8 is approaching quickly,
Icon on tab
Sao, the web client, received the support of icon on tab of the forms. Meanwhile on the desktop
client, the same icon on tab has been moved on the left of the label.
Stock quantity per template
The stock quantity was only computed per product because it is the column
stored in the stock move. But it may be useful for some cases to compute the
stock quantity per template. Indeed products from the same template share the
same default unit of measure so their quantities can be summed.
So issue7068 added on the
products_by_location method the possibility to group by product columns like
the template, but also a relate action from the template which show quantity
per locations.
Spell checking
The spell checking is now activated on the web client. The spell checking can be activated on
any text widget by adding the spell attribute with a PYSON expression
that returns the language code.
The administrator can now reset the password of the user with a simple click. The server will
generate a random reset password which is available for 1 day by default and
send it by email to the user. This reset password is only valid until the user
has set a new password.
It is also possible to reset this way the admin password using the
trytond-admin command line tool.
Add cache when checking XML record
Tryton prevents by default to modify records that are part of the setup (which
are created by XML file in the modules). This requires to make a query on the
ModelData table on each modification or deletion. But usually only a few
models have such records, so we could put in memory the list of models that
should be checked. So this allows to
skip the query for most of the models and thus save some queries.
Add depends on Button
Buttons can be defined with PYSON expressions for
the invisible or readonly attributes. Some times, the developer wants to
be sure that the field used in the PYSON expressions are read by the client.
So a depends attributes have been added
which ensure that the listed fields will be included in all the view where the
button is displayed.
Remove deprecated feature on GTK+-3
As the desktop client development has switched to GTK+-3. A cleaning of
deprecated features has started:
The PostgreSQL backend uses a pool of
connections for performance. During a load test, we has detected a leak of
connections from this pool. Some code
were not protected by a try/finally to ensure to put always put back the
connection used.
A generic contact mechanism retrieval
Similar to the design of the addresses which can be flagged for invoice or
delivery usage, the contact mechanism receive the same feature. So the code may now request a contact
mechanism of a type and for a specific usage. For example, it is possible now
to define which email address of a party should be used to send the invoices.
The modules notification_email has been updated to use this method.
FEC export prior to closing fiscal year
It is often requested to be able to export the FEC on a non-closed fiscal year.
So the issue5306 make it possible such
export. In this case, the generated file will not have an official name as it
is still a draft.
issue7085: The unittest for fields
have been refactored to follow the best practice: Arrange, Act, Assert.
issue7041: The email notification
module was putting in the email header the list of blind carbon copied
emails.
issue7057: The import zip script from
the country module is now Python3 compatible.
issue7071: Since few releases the
date format from the user language was not correctly set and so the client
was falling back to the system format. This is now fixed and a common method
is used everywhere to ensure coherence.
issue7076: All ComboBox has been
reviewed to ensure to disable 'scroll-event' and prevent 'move-active' when
read-only.
issue7087: It prevents to get the
same session keys when creating many session with one call. In practice,
such call does not exist in standard modules.
issue7101: The Promotion
registration was missing from the issue6827, this is now fixed. So now the
shipment cost is really the unit price when computing the promotion.
issue7107: The shipping reference and
label were kept when copying packages. But as those values come from the
carrier, they should be reset.
issue7064: It enforces the
consistency for the unit of measure between the display digits and the
rounding factor.
issue7079: It ensures that all
modules requested have been activated by the testing tools. The silent
failure was often the source of time lost when writing tests.
issue7097: It fixes the string
formatting of TrytonException under Python3.
issue7092: It improves the
performance of Party.address_get by relying on the ORM cache instead of
doing a search query. So successive calls to the method will no more
perform a query to the database.
issue7118: With this change, trytond
will not more try to delete translations when a record is deleted if it has
not at least one translatable field.
issue7104: The shipment cost is
improved to not be computed when no goods is shipped. But also in case of
return sale, the original shipment cost is not re-computed.
issue7112: It prevents to set time
converter with a value of zero because the clients do not support such
configuration.
issue2939: We have closed a pretty
old feature request which prevents to close a period if there are still
running asset lines.
issue6931: The inventory should not
remove line for inactive products as there could still be some quantity left
in the location.
issue7011: The consignment create
also invoice line when product are consumed at the production or from the
production locations.
issue7083: The idempotency key for
Stripe payment is always filled. Before it was only set if the checkout
process was used.
issue7110: The context has a new
optional key _request which contains some informations like the remote
address, the HTTP host etc. Those values are correctly setup if the server
run behind a proxy which set the X-Forwarded headers.
issue7022: The invoice lines from
backorder are now correctly linked to right stock moves.
issue6987: The party required option
is hidden for non deferral accounts because they do not support this
feature.
issue7094: Fix the exception
management in the desktop client following the refactoring from
issue6907.
issue7120: In some cases, the SQLite backend did not create the columns with
the right types.
issue5182: The usage of chardet to detect the encoding of HTML in
the rich text widget was never fully reliable. Now we try common standard
encoding and fallback to ASCII.
issue7106: The default search on
party will now also search on contact mechanism.
issue7141: The API of
Product.products_by_location and StockMixin._get_quantity have been
changed. They no more accept a product_ids argument by only a
grouping_filter. The two options were overlapping and creating errors when
misused.
issue7159, issue7160 and issue7161: They fix the computation of price
when the quantity is negative (aka return).
The Foundation has decided to publish a budget for 2018. This is the result of
requests from the community will to know what are the plans of the Foundation.
Of course as the revenue of the Foundation relies only on donation, we can not
guarantee that every things will be realized. Indeed we have ordered the points
by priority. Each point will be activated once we have we reach its donation
level.
5300€: Organization of first hackathon by inviting key developers
for a week-end.
10000€: Organization of a documentation writing hackathon by inviting
key developers and end-users for a week-end.
You can help the Foundation by making a donation. We will apreciate to get
enought donations before the next tryton release, scheduled for 23th of April,
in order to buy a new mac mini so we can improve the MacOS support.
To prepare the coming release 4.8, a lot of pending developments have been
finalized before the development freeze.
The release 4.8 is scheduled for 23rd April. Until there, we are requesting
everyone to help us finding and fixing the remaining bugs.
The translation process will start the 2nd April until 20th April at 20:00
CEST. You can contribute your translations on Pootle.
Erase Party
To help companies to be compliant with the right to erasure
from the GDPR, a new
wizard to erase a party has been developed. It erase personal information
linked to the party like the name, addresses, contact mechanisms etc. It
removes also those data from the history tables. But each module adds check to
prevent erasure if pending documents for the party still exist.
Match against product category
All the matching criteria against product categories have been unified between all the
modules. Any product category will match against itself or any parent
category. This is the chosen behavior because it is the less astonishing.
Request depending on shipment method
The sale with the shipment method On Invoice Paid will create the purchase
requests and/or drop shipments when the
lines are fully paid. Before they were created directly on validation.
Sale reporting
The sale modules receive reports on aggregated data.
The report engine allows to browse the Revenue and Number of sale per:
Customer
Product
Category
Country> Subdivision
Those data are over Period, Company and Warehouse.
The reports also show a sparkline
for the revenue trend which can be drilled down.
Purchase request quotation
The new module allows to manage
requests for quotation to different suppliers. Each request will collect
quotation information from the supplier. The preferred quotation will be used
to create the purchase.
Improve reconciliation performance
The previous API to reconcile lines allowed only to create one reconciliation
at a time. But as this can trigger the processing of the invoice for example,
it can be a bottleneck if you are reconciling a lot of different lines like a
statement can do. So the API has been improved in the most backward compatible
way to allow to create many reconciliation at once.
Update chart of account
It happens that users need to customize the configuration of the chart of
account that comes from a template. Until now, this would prevent any further
update without loosing those customization. Now, the records that are
synchronised with a template are read-only by default. A check box allows to
edit the value and to remove the record from the update process.
Create second chart of account
Sometimes, user may create by mistake a second chart of account. There are
very rare case when such creation is valid. As it is a complex task to correct
such mistake, we added a warning when creating a second chart of account.
Spanish chart of account
The module, which was published for the first time in the last series 4.6,
needs a deep cleaning. The last changes in the accounting modules raised
concerns about choices made for this chart.
So it was decided to
temporary exclude the module from the release process and to not guarantee a
migration path.
The new module account_tax_cash allows
to report taxes based on cash. A tax group to report on cash basis are defined
on the Fiscal Year or Period. But they can also be defined on the invoices
per supplier.
The implementation of this new module also improved existing modules. The tax
lines are verified against modification on closed period. The registration of
payment on the invoice is limited to the amount of the invoice.
New tax report definition
Until now, only one tax code was allowed per tax. This was too restrictive.
For some country it was needed to create null children taxes to allow more
complex reporting.
Now, tax codes are no more defined on the tax but instead they contains a
list of tax lines. Those lines can
define the base or the amount of the tax. On the report, the lines of each
tax code are summed per period.
Improve stock location browsing
When there is a very large number of location, the tree Locations Quantity
become difficult to use. Especially if you are searching in which location a
product is. So we added the option to open this view as a list, this way it is possible to search
location by quantity of the product.
Inventory behavior for empty quantity
We found that there are two different expectation from users about the default
behavior of the inventory when the quantity is not explicitly set.
Some expect that the product quantity should be considered as 0. And others
expect that the product quantity is not changed.
So we added an option on the inventory to choose the behavior when an inventory line has no quantity.
Assignation in Supplier Shipment Return
Until now, the assignation process was not using children location but this
did not work if the location was a view. So now, we assign using the children only if the location is a view.
Until now, only sub-projects having the same party were invoiced. With
issue7096, an invoice for each
different party will be created.
Fallback user for email notification
The email notification skip the recipients if the target field is empty. For
example if a notification is defined on the Invoice with the Party as
recipient and the Party has not an email address, then the invoice will not
be sent. By adding a fallback recipients, the email is sent to specific user
email which could be a secretary which will be in charge of sending it or a
mailbox for a printer which will print it automatically etc.
Limit the expansion of tree
For now, it will no more be possible to expand a node that have too much
records. This is needed to prevent to
consume all the resources of the client. When such case happen, the client
will switch to the form view where normally the children will be displayed in
a list view.
The group widget can be defined as expandable by adding the attribute expandable. If
the value is 1, it starts expanded and if the value is 0, it starts
unexpanded. Both clients support it.
Reset changes in pop-up
Until now, when changes on a record from a pop-up window were cancelled, the
client reset it using the stored value from the server or delete it if it was
not yet stored.
Now, the clients will restore the record to the state it had before opening the
pop-up.
Stability in rendering of web client
We have pushed many small improvements to sao, the web client, which fixes
small jump of elements of the page:
The buttons of widget are now skipped from tab navigation in sao, the web client. The actions of
those buttons are available via keyboard shortcuts.
Position and count on web client
The web client receives finally the label that positions the selected record in
the list and shows the number of record in the list.
Editable list view
The management of editable list/tree has been completely reworked. Now the full row become editable on the
first click. The focus is kept on the line if it is not valid. The edition is
stopped when the user click outside the view.
The clients shows next to the search input a toggle button for all model that
can be deactivated. This allows the
user to make search against deactivated records and to now that such
functionality exists.
Simplified API for session management
The previous API was based on the ORM methods. This
makes unnecessary more complicated to implement alternative session manager.
So we created a simplified API agnostic
to the ORM: new, remove, check and reset.
Unaccented search
If the database has the required features (for PostgreSQL: the unaccent function), the ilike search will
be performed on unaccented strings per default on all Char.
This can be deactivated by setting the attribute Char.search_unaccented to
False.
It is now possible for a module to register class only if a specified sets of modules is
activated. This replace the silent skip that existed previously.
Existing modules that were using this silent skip must be updated to use the
depends keyword otherwise they will fail.
Conditional field in XML
Sometimes a module depends optionally on another but it may need to fill in
the XML record a field that is defined on the optional module. We added a
depends keyword on the field which
makes it ignored if the list of modules is not activated.
Custom order and context on search
The clients now support the definition of a specific order and context when searching from a field like
Many2One, Reference, One2Many etc.
This is useful to have preferred record on top of the list of found records.
Deactivation of records
A new mixin has been added to add
logical suppression to a Model. But also we ensure that the client is aware
that the model is deactivatable.
All the modules have been updated to use this new mixin.
Consistent context usage in proteus
Since the introduction of context management in proteus, the client
library, the context management was taken from different places in an
inconsistent way. We changed the library to always use the context and
configuration at the time the instance was created.
Some testing scenario may need some adjustment as they could rely on the
previous behavior.
Bug fixes & Improvements
issue7183: It ensures that the legal
notice and description of the taxes are correctly translated using the party
language.
issue7163: It fixes the evaluation on
the client sides for domain like [('lines', '=', None)] when lines is
empty.
issue7164: The web client was wrongly
sending deleted or removed lines for on_change calls.
issue7171: The module
sale_subscription was not adding the Subscriptions to the Replace
Party wizard.
issue7142: It adds missing
modification check of the move when a line is created.
issue6560: The deposit business logic
has been moved from the wizard to the invoice model to ease usage from the
code.
issue3516: Improve the update of
dunning level by removing write call from a loop.
issue7072: It rationalize and unify
how context is built in the clients.
issue6833: The quantities are
correctly synchronized between the supplier and customer moves of the drop
shipments.
issue7078: We added a domain on the
account children to ensure to have a consistent behaviour with the
constraint from the parent.
issue7153: Now,
get_reconcile_lines_for_amount returns actually the best combination of the
lines.
issue7205: Clear cache of
all ModelSingleton records as they are all the same but just the id
change.
issue7175: It removes the silent
failure option in the TableHandler.
issue7176: We added to sao, the web
client, the same date and date-time widgets shortcuts as for tryton, the
desktop client.
issue7143: The wizard runtime context
is added to the wizard context.
issue6947: The sum list feature has
been implemented to sao, the web client.
issue7201: It prevents float
precision error after the division by factor.
issue5925: We upgraded sao, the web
client, to use use the major version 3 of jQuery.
issue7172: The email for web user is
only required for active user.
issue7238: The field description (aka
label) is used as record name when available.
issue7117: The name of the context
model is added to the context itself.
issue7241: The toolbar of read-only
richtext widget is now correctly disabled.
issue7222: The asset lines are
read-only as they are managed by the workflow.
issue6747: Income statement opens the
general ledger.
issue7240: It fixes the time in the
evaluation of PYSON.DateTime on sao.
issue7203: It applies the tax rule on
standalone invoice line.
issue7249: A new test ensures that
depends on _parent_ contains also the relation.
issue7248: Manage modal closing for
Form and Wizard.
issue7262: A relate is used instead
of a wizard to open the product cost history. So the window title will be
more accurate.
issue7148: Disable button when
clicked to prevent multiple execution.
issue7148: Create record with a
synchronous call to avoid multiple creation.
issue7253: Extend the no stock move
check from Product Template to the Product.
issue7263: Fix DATE_TRUNC custom
implementation for SQLite.
issue7250: Add BC47 transformer and use it for
toLocaleString and lang attribute.
issue7287: A deep copy of the context
is done before processing the RPC. This prevent side
effect when the call must be repeated due to database operational error.
issue7267: The French chart of
account has the proper kind for the stock accounts.
We are proud to announce the 4.8 release of Tryton.
This is the last release that will support Python2, as decided on the last
Tryton Unconference, next versions will be only Python3 compatible.
In this way we introduced a new way of dynamic reporting. For now it's only
available on sale module, but the plan is to extend it to more modules in newer
releases. The effort to make all the Desktop client features available on the
Web client has continued on this release. This resulted in fixing many small
details and adding some missing features on the web client. Of course this
release also includes many bug fixes and performance improvements. We added
Persian as an official language for Tryton.
As usual the migration from previous series is fully supported. Some manual
operation may be required, see migration from 4.6 to 4.8.
Major changes for the user
The clients show a toggle button next to the search input for all models that
can be deactivated. This allows the user to search for deactivated records
and to know that the model is deactivable.
Until now, when changes on a record from a pop-up window were cancelled, the
client resets it using the stored value from the server or deletes it if it
was not yet stored. Now, the clients will restore the record to the state it
had before opening the pop-up, which is a more expected behaviour for the
user.
It's no longer possible to expand a node that has too much records. This is
needed to prevent to consume all the resources of the client. In such case
the client will switch to the form view where normally the children will
be displayed in a list view which supports loading records on the fly when
scrolling.
To help companies to be compliant with the right to erasure
from the GDPR, a new
wizard to erase a party has been developed. It erases personal information
linked to the party like the name, addresses, contact mechanisms etc. It
removes also those data from the history tables. Each module adds checks
to prevent erasure if pending documents for the party still exist.
A name has been added to the contact mechanism. It can be used for example
to indicate the name of the recipient of an email address or to distinguish
between the phone number of reception, accounting and warehouse.
The default search on party will now also use contact mechanism values.
Similar to the design of the addresses which can be flagged for invoice or
delivery usage, the contact mechanism received the same feature. So the
code may now request a contact mechanism of a specific type. For example, it
is now possible to define which email address of a party should be used to
send the invoices.
All the matching criteria against product categories have been unified
between all the modules. Any product category will match against itself or
any parent category. This is the chosen behavior because it is the least
astonishing.
Desktop
The desktop client already has mnemonic for all button but now they are also
added to all field labels. This allow to jump quickly to any visible field
by pressing ALT + <the underlined key>.
The desktop client has a new option to check if a new bug fix version has
been published. It takes care of the notification on Windows and MacOS.
The Many2One fields in editable tree now show the icons to open the related
record or clear the selection. This unifies the behaviour with the form
view.
Web
Numeric values are now formatted with the user locale and use an input of
type 'number' for editing. This allows to have the right virtual keyboard on
mobile devices.
The web client finally receives the label that positions the selected record
in the list and shows the number of records in the list.
The spell checking is now activated by the browser, so fields with the
spell attribute defined will have spell checking activated.
The buttons of widgets are now skipped from tab navigation in the web client.
The actions of those buttons are available via keyboard shortcuts.
The management of editable list/tree has been completely reworked. Now the
full row becomes editable on the first click. The focus is kept on the line
if it is not valid. The editing is stopped when the user clicks anywhere
outside the view.
The sum list feature has been implemented in sao.
The same shortcuts of the Date and DateTime widgets available on tryton can
now be used on web client.
Many2One fields are displayed on tree view as clickable link which opens
the related record form view to allow quick edition.
We have pushed many small improvements which fix small jump of elements of the
page:
The general ledger accounts are now opened from the Income Statement rows.
This allows to see the details of the computed amounts.
It happens that users need to customize the configuration of the chart of
account that comes from a template. Until now, this would prevent any further
update without loosing this customization. Now, the records that are
synchronized with a template are read-only by default. A check box allows
to edit the value and thus remove the record from the update process.
Users may create a second chart of account by mistake. There are very rare
cases when such creation is valid. As it is a complex task to correct such
mistake, we added a warning when creating a second chart of account.
Now an error is raised when closing a period if there are still asset lines
running for it.
Until now, only one tax code was allowed per tax. This was too restrictive.
For some country it was needed to create null children taxes to allow more
complex reporting. Now, tax codes are no longer defined on the tax but
instead they contain a list of tax lines. Those lines can define the base or
the tax amount. On the report, the lines of each tax code are summed per
period. All chart of accounts have been updated to follow this design.
Tax report on cash basis
The new account_tax_cash module allows to report taxes based on cash. The
groups of taxes to report on cash basis are defined on the Fiscal Year or
Period. But they can also be defined on the invoices per supplier.
The implementation of this new module also improved existing modules. The tax
lines of closed period are verified against modification. The registration of
payment on the invoice is limited to the amount of the invoice.
Spanish chart of account
The module, which was published for the first time in the last series 4.6,
needs a deep cleaning. The last changes in the accounting modules raised
concerns about choices made for this chart. So it was decided to
temporary exclude the module from the release process and to not guarantee a
migration path. The work to fix the module has started and we expect to be
able to release a fixed version soon.
Invoicing
The description on invoice line is now optional. If a product is set the
invoice report will show the product name instead of the line
description.
The reconciliation date is now shown on the invoice instead of the Boolean
reconciled. This provides more information for a single field.
The Move lines now show which invoice they pay.
An error is raised when trying to overpay an invoice.
Payment
A cron task has been added that will post automatically the clearing moves
after a delay. The delay is configured on the payment journal.
Stripe Payments
If the customer disputes the payment, a
dispute status will be update on the Tryton payment. When the dispute is
closed, the payment is updated according if the company wins or loses.
Some missing charge events has been added. In particular, the refund event
which may update the payment amount when it is partial.
This new module adds the automatic import of OFX
file as statement. The OFX format is a common format which is supported in
various countries, like the United States.
Stock
The stock quantity was only computed per product because it is the column
stored in the stock move. But it may be useful for some cases to compute the
stock quantity per template. Indeed products from the same template share the
same default unit of measure so their quantities can be summed.
This release adds on the products_by_location method the possibility to
group by product columns like the template, but also a relate action from the
template which show quantity per locations.
When there is a very large number of locations, the tree Locations Quantity
becomes difficult to use. Especially if you are searching in which location a
product is. So we added the option to open this view as a list, this way it
is possible to search location by quantity of the product.
We found that there are two different expectation from users about the
default behavior of the inventory when the quantity is not explicitly set.
Some expect that the product quantity should be considered as 0. And others
expect that the product quantity is not changed. So we added an option on
the inventory to choose the behavior when an inventory line has no quantity.
Until now, the assignation process for supplier return shipment was not using
children location but this did not work if the location was a view. Now we
assign using the children if the location is a view.
The supplier shipment support to receive the goods directly in the storage
location. This way the inventory step is skipped.
Project
Until now, only sub-projects having the same party were invoiced. Now
an invoice for each different party will be created.
Sale
The description on sale line is now optional. This prevents to copy the
product name to sale description as it is now shown on the sale report.
In case a different product is shipped to the customer if the invoice method
is based on shipment, this shipped product will be used for the invoice.
Previously only the initially sold product was always used.
Now it is possible to edit the header fields thanks to the new Wizard which
takes care of recompute the lines according to the changes.
Reports on aggregated data has been added to the sale module.
The report engine allows to browse the Revenue and Number of sale per:
Customer
Product
Category
Country> Subdivision
Those data are over Period, Company and Warehouse.
The reports also show a sparkline
for the revenue trend which can be drilled down.
The sale with the shipment method On Invoice Paid will create the purchase
requests and/or drop shipments when the lines are fully paid. Before they
were created directly on validation.
The shipment cost is not more computed when returning goods.
sale_promotion_coupon
This new module allows to create coupons that are used to apply a promotion on
the sale. The coupon can be configured to be usable only a specific number of
times globally or per party.
Purchase
The product supplier can be used now on the purchase line. This allows to
display the supplier definition of this product.
Now it is possible to edit the header fields thanks to the new Wizard which
takes care of recompute the lines according to the changes.
The description on purchase line is now optional. This prevents to copy
the product name to purchase description as it now shown on the purchase
report. The same change have been applied on purchase requests and
requisitions.
In case a different product is received from the supplier if the invoice
method is based on shipment the received product will be used on the invoice.
Previously the purchased product was always used.
The user is warned if he tries to confirm a purchase order for a different
warehouse than the warehouse of the linked purchase request.
Purchase request quotation
This new module allows to manage requests for quotation to different
suppliers. Each request will collect quotation information from the supplier.
The preferred quotation will be used to create the purchase.
Notification
Now it is possible to filter which type of email to use for sending the
notification.
The email notification skip the recipients if the target field is empty. For
example if a notification is defined on the Invoice with the Party as
recipient and the Party has not an email address, then the invoice will not
be sent. Adding a fallback recipients the email is sent to specific user
email which could be a secretary which will be in charge of sending it or
a mailbox for a printer which will print it automatically etc.
Starting from this release the tryton client will only support the version 3
of GTK+-3. This will allow to migrate it to Python3.
The group widget can be defined as expandable by adding the attribute
expandable. If the value is 1, it starts expanded and if the value is
0, it starts unexpanded. Both clients support it.
To ensure that all buttons may have their access rights configured a new
test has been added. We added also the string, help and confirm
attributes to ir.model.button. So they can be shared between different
views.
The monetary format is now defined on the language instead of the language.
According to User Experience best practices the amount should be displayed
in the user language format event if it's a foreign currency.
It's now possible to manually define an exceptional parent of a language.
This allows to use a custom monetary format for each country of the
Latin American language.
Dict fields are now stored using it's canonical representation. This allows
to make equity comparison between them.
The language formatting has been simplified to expose the instance methods:
format, currency and strftime. A classmethod get is
added to return the language instance of the code or the transaction
language.
The previous API for session management was based on the ORM methods. This
makes more complicated to implement alternative session manager. We created
a simplified API agnostic to the ORM: new, remove, check and reset.
If the database has the required features (for PostgreSQL: the unaccent function), the ilike search
will be performed on unaccented strings per default on all Char. This
can be deactivated by setting the attribute Char.search_unaccented to
False.
We have added the support for EXCLUDE constraints. An EXCLUDE constraint
is a kind of extension to the UNIQUE constraint which can be applied on a
subset of the rows and on expression instead of only columns. For more
information, please read the EXCLUDE documentation of PostgreSQL.
It is now possible for a module to register classes to the pool only if a
specified sets of modules is activated. This replaces the previous silent
skip. Existing modules that were relying on the old behaviour must be updated
to use the depends keyword otherwise they will crash at start up.
Sometimes a module depends optionally on another but it may need to fill from
the XML record a value for a field that is defined on the optional module. We
added a depends keyword on the field which ignores it if the list of modules
is not activated.
The clients now support the definition of a specific order and context when
searching from a field like Many2One, Reference, One2Many etc. This is
useful to have preferred record on top of the list of found records.
A new mixin has been added to add logical suppression to a Model. But also
we ensure that the client is aware that the model is deactivable. All the
modules have been updated to use this new mixin.
The context model name is now available on the screen context. This allows
for example to change the behaviour of a wizard depending on the context
model.
Tryton prevents by default to modify records that are part of the setup
(which are created by XML file in the modules). This requires to make a
query on the ModelData table on each modification or deletion. But usually
only a few models have such records, so we now put in memory the list of
models that should be checked. This allows to skip the query for most of
the models and thus save some queries.
Buttons can be defined with PYSON expressions for
the invisible or readonly attributes. Some times, the developer wants to
be sure that the field used in the PYSON expressions are read by the client.
A depends attributes have been added which ensure that the listed fields
will be included in all the view where the button is displayed.
The administrator can now reset the password of the user with a simple click.
The server will generate a random reset password which is available for 1
day by default and send it by email to the user. This reset password is only
valid until the user has set a new password. It is also possible to reset
this way the admin password using the trytond-admin command line tool.
The context has a new optional key _request which contains some
information like the remote address, the HTTP host etc. Those values are
correctly setup if the server run behind a proxy which set the
X-Forwarded headers.
A malicious hacker could flood the LoginAttempt table by sending failing
request for different logins. Even if the size of the record is limited and the records are purged frequently. The server now limits also the number
of attempt per IP network. The size of the network can be configured for
each version (IPv4 and IPv6). This are only the last level of protection,
it is still recommended to use a proxy and to set up IDS.
The name attribute of the tag image can now be a field. In this case, it will
display the icon from the value of the field.
Now it is possible to extend with the same
Mixin all the existing pool objects that are
subclasses of a target. An usage example is to extend the Report.convert
method of all existing reports to add support for another engine.
We have decided to remove the MySQL backend from the core of Tryton. The
back-end was not tested on our continuous integration server and so it has many failures like not
supporting Python3. The current code has been move to its own repository. This module will not be
part of the release process until some volunteer make it green on the test server.
The current form buttons are automatically added to the toolbar under the
action menu for fast access. Now the developer can define under which toolbar
menu the button will appear.
Tryton now uses LibreOffice instead of
unoconv for converting between report formats. There were some issues with
unoconv, which where fixed by using libreoffice directly. Now we publish
also docker images with the suffix -office which contains all the
requirements for the report conversion.
A new Currency.currency_rate_sql method has been added which returns a
SQL query that produces for each currency the rate, start_date and
end_date. This is useful to get a currency rate in a larger SQL query.
This method uses the window functions if
available on the database back-end to produce optimized query.
Since the introduction of context management in proteus, the client
library, the context management was taken from different places in an
inconsistent way. We changed the library to always use the context and
configuration at the time the instance was created. Some testing scenario may need some
adjustment as they could rely on the previous behavior.
Accounting
The previous API to reconcile lines allowed only to create one reconciliation
at a time. But as this can trigger the processing of the invoice for example,
it can be a bottleneck if you are reconciling a lot of different lines like a
statement can do. So the API has been improved in the most backward
compatible way to allow to create many reconciliation at once.
The invoice now has a method to add and remove payments which should always
be used.
Web
The limit of authentication request per per network is also applied to
the web users.
Thanks to the implementation of the exclude constraint, the uniqueness of the
email of web user only applies to the active users.
Due to a mistake in the process of generating the translations,
the initial release of series 4.8 contained some unstranslated strings. We
decided to make new set of releases with the correct translations even if it
breaks the rule of no database updates for bug fix releases.
If you have already updated your server to the series 4.8, you need to also
update the database for this bug fix release. Sorry for the inconvenient.
This release additionaly includes the Spanish Chart of Accounts which has
cleaner design and is now available for the 4.8 series.
The web client sao now supports URLs.
This allows users to communicate information by sharing URLs.
The syntax is quite similar to the one of the desktop client since the
'index.html' has been removed but uses a
URL-hash instead of the full path due to the single page design.
The URL is updated to correspond to the active tab. The hash part can be
changed by the user (using copy/paste) to open the corresponding tab. This
allows to navigate back in the history of the browser.
The client parses the URL hash on login and launches the corresponding action.
Web client session
The sessions are now stored in the
localStorage
of the browser. This means that the session per server and database can be
shared between tabs and survive a reload of the page.
Better space management in web client
We have improved the navigation bar to
provide more spaces to the tab list. We use an icon for the logout instead of a
longer text. Now the favorites menu is a drop down of the global search. The
toggle menu and Tryton brand are merged. Also it is now possible to toggle the
menu for any size of the screen.
Open Many2One and Reference in new web client tab
It is now possible to open the target record in a new
tab instead of a popup by pressing the
CTRL key when clicking on the "open" button. This gives access to the
actions, relates and reports for this record like the right-click on desktop
client does.
Removal of single windows executable
Since we have the web client sao, the need of a Windows executable without
installation is very low. More over it required administration rights to be
run. So we have decided to stop publishing it in future
versions.
Uninstall previous version
On windows, the installer required to uninstall previous version before
allowing to install a new one. In order to simplify the process, now it asks
to uninstall the previous version of the
same series. In silent mode, this is done automatically without any required
intervention of the user which ease automatic deployment.
Export CSV
The export CSV window has been improved by moving the predefined
exports under the buttons that manage them.
This way the view is easier to understand and the predefined list is not the
default focused widget (which created inconsistent selection state).
Display current date on document
Draft documents, that are sent to customer, have not yet a date. For example a
sale quotation does not have the sale date filled but the document should have
at least the date when it was printed to define when starts the validity of the
quotation.
So we changed the templates to print the current
date if no date is yet filled.
Changes for the developer
Add sql_cast on Field
The new method Field.sql_cast(expression) provides the database specific cast of the field values in SQL
expressions.
Recursive common table expression for child_of/parent_of operators
For the evaluation of the child_of and parent_of domain operator, we used
recursive ORM loops (or Modified Preorder Tree
Traversal when available).
Now all supported databases support the recursive common table
expression
(CTE), so we could use it as default
implementation.
Regarding performance recursive CTE is not better than MPTT but still avoid
many round-trip compared to the recursive ORM loop.
Tree Mixin
We added a new Mixin as core feature. It
provides all the needed features to manage record names in a tree structure and
to check against loops. All the modules having such design have been updated to
benefit from this generic implementation that is fully tested.
Limit database per host name
The Tryton server works on multiple database names (one way to support
multi-company). But in shared environment, the list of database names can be
very large and can leak information. For that, we added a new feature which
allows to filter the list of database names per host
name.
Default language in report
Until now, almost all reports were using English as fallback language because
the call to set_lang required a language code and it was easier to hard-code
'en' than retrieving the default language of the database.
Now the set_lang method allow as argument None or an instance of ir.lang.
When the value is None, it uses the default language of the
database. This is a more consistent
behavior with the rest of the application. We have updated all the reports to
use this new feature.
Extending depends on methods
The depends on methods was limited to only on_change or on_change_with
methods. But it showed some limitations when trying the share common code
between different on_change/_with methods. So we extended and generalized the
behavior. Now we can define dependencies on any
methods and use the @fields.depends
decorator on any method.