Commit f7c814f1 authored by Jérome Perrin's avatar Jérome Perrin

more and more interpolation API

parent 89c5db3e
...@@ -652,6 +652,8 @@ class SimulationTool(BaseTool): ...@@ -652,6 +652,8 @@ class SimulationTool(BaseTool):
# if we consider flow, we also select movement whose mirror date is # if we consider flow, we also select movement whose mirror date is
# in the from_date/to_date range and movement whose # in the from_date/to_date range and movement whose
# start_date/stop_date contains the report range. # start_date/stop_date contains the report range.
# The selected range is wider, but the selected movements will have an
# "interpolation_ratio" applied to their quantity and prices.
if to_date: if to_date:
column_value_dict['date'] = ComplexQuery( column_value_dict['date'] = ComplexQuery(
Query(date=(from_date, to_date), range='minmax'), Query(date=(from_date, to_date), range='minmax'),
......
SELECT <dtml-let interpolation_ratio="SimulationTool_zGetInterpolationMethod(
<dtml-if expr="interpolation_method == 'linear'"> stock_table_id=stock_table_id,
@interpolation_ratio := CASE interpolation_method=interpolation_method,
WHEN <dtml-var stock_table_id>.mirror_date = <dtml-var stock_table_id>.date THEN 1 interpolation_method_from_date=interpolation_method_from_date,
ELSE ( interpolation_method_to_date=interpolation_method_to_date,
UNIX_TIMESTAMP(LEAST(<dtml-sqlvar flow_valuation_method_to_date type="datetime">, interpolation_method_at_date=interpolation_method_at_date,
GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date) )) src__=1)">
- UNIX_TIMESTAMP(GREATEST(<dtml-sqlvar flow_valuation_method_from_date type="datetime">,
LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date))))
/ ( UNIX_TIMESTAMP(GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)) -
UNIX_TIMESTAMP(LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)) ) END
<dtml-else>
@interpolation_ratio := 1
</dtml-if> flow_ratio,
SELECT
<dtml-if expr="precision is not None"> <dtml-if expr="precision is not None">
SUM(ROUND( SUM(ROUND(
<dtml-var stock_table_id>.quantity <dtml-var stock_table_id>.quantity
<dtml-if transformed_uid> * transformation.quantity</dtml-if> <dtml-if transformed_uid> * transformation.quantity</dtml-if>
* @interpolation_ratio, <dtml-var precision>)) AS inventory, * <dtml-var interpolation_ratio>, <dtml-var precision>)) AS inventory,
SUM(ROUND( SUM(ROUND(
<dtml-var stock_table_id>.quantity <dtml-var stock_table_id>.quantity
<dtml-if transformed_uid> * transformation.quantity</dtml-if> <dtml-if transformed_uid> * transformation.quantity</dtml-if>
* @interpolation_ratio, <dtml-var precision>)) AS total_quantity, * <dtml-var interpolation_ratio>, <dtml-var precision>)) AS total_quantity,
<dtml-if convert_quantity_result> <dtml-if convert_quantity_result>
SUM(ROUND(<dtml-var stock_table_id>.quantity * measure.quantity SUM(ROUND(<dtml-var stock_table_id>.quantity * measure.quantity
<dtml-if quantity_unit_uid> / quantity_unit_conversion.quantity</dtml-if> <dtml-if quantity_unit_uid> / quantity_unit_conversion.quantity</dtml-if>
* @interpolation_ratio, <dtml-var precision>)) * <dtml-var interpolation_ratio>, <dtml-var precision>))
AS converted_quantity, AS converted_quantity,
</dtml-if> </dtml-if>
IFNULL(SUM(ROUND( IFNULL(SUM(ROUND(
<dtml-var stock_table_id>.total_price * @interpolation_ratio, <dtml-var precision>)), 0) AS total_price <dtml-var stock_table_id>.total_price * <dtml-var interpolation_ratio>, <dtml-var precision>)), 0) AS total_price
<dtml-else> <dtml-else>
SUM(<dtml-var stock_table_id>.quantity SUM(<dtml-var stock_table_id>.quantity
<dtml-if transformed_uid> * transformation.quantity</dtml-if> <dtml-if transformed_uid> * transformation.quantity</dtml-if>
* @interpolation_ratio * <dtml-var interpolation_ratio>
) AS inventory, ) AS inventory,
SUM(<dtml-var stock_table_id>.quantity SUM(<dtml-var stock_table_id>.quantity
<dtml-if transformed_uid> * transformation.quantity</dtml-if> <dtml-if transformed_uid> * transformation.quantity</dtml-if>
* @interpolation_ratio * <dtml-var interpolation_ratio>
) AS total_quantity, ) AS total_quantity,
<dtml-if convert_quantity_result> <dtml-if convert_quantity_result>
ROUND(SUM(<dtml-var stock_table_id>.quantity * measure.quantity ROUND(SUM(<dtml-var stock_table_id>.quantity * measure.quantity
<dtml-if quantity_unit_uid> / quantity_unit_conversion.quantity</dtml-if> <dtml-if quantity_unit_uid> / quantity_unit_conversion.quantity</dtml-if>
<dtml-if transformed_uid> * transformation.quantity</dtml-if> * @flow_ratio), 12) <dtml-if transformed_uid> * transformation.quantity</dtml-if> * <dtml-var interpolation_ratio>), 12)
AS converted_quantity, AS converted_quantity,
</dtml-if> </dtml-if>
IFNULL(SUM(<dtml-var stock_table_id>.total_price) * @flow_ratio, 0) AS total_price IFNULL(SUM(<dtml-var stock_table_id>.total_price * <dtml-var interpolation_ratio>), 0) AS total_price
</dtml-if> </dtml-if>
<dtml-if inventory_list> <dtml-if inventory_list>
, ,
...@@ -147,3 +141,4 @@ GROUP BY ...@@ -147,3 +141,4 @@ GROUP BY
ORDER BY ORDER BY
<dtml-var order_by_expression> <dtml-var order_by_expression>
</dtml-if> </dtml-if>
</dtml-let>
\ No newline at end of file
<dtml-if expr="interpolation_method == 'linear'">
CASE
WHEN <dtml-var stock_table_id>.mirror_date = <dtml-var stock_table_id>.date THEN 1
ELSE (
UNIX_TIMESTAMP(LEAST(
<dtml-if interpolation_method_at_date>
<dtml-sqlvar interpolation_method_at_date type="datetime">
<dtml-else>
<dtml-sqlvar interpolation_method_to_date type="datetime">
</dtml-if>,
GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date) ))
- UNIX_TIMESTAMP(GREATEST(<dtml-sqlvar interpolation_method_from_date type="datetime">,
LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date))))
/ ( UNIX_TIMESTAMP(GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)) -
UNIX_TIMESTAMP(LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)) ) END
<dtml-elif expr="interpolation_method == 'all_or_nothing'">
CASE
WHEN (
-- movement contained in time frame
LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)
>= <dtml-sqlvar interpolation_method_from_date type="datetime"> AND
GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)
<dtml-if interpolation_method_at_date>
<= <dtml-sqlvar interpolation_method_at_date type="datetime">
<dtml-else>
< <dtml-sqlvar interpolation_method_to_date type="datetime">
</dtml-if>
) THEN 1
ELSE 0
END
<dtml-elif expr="interpolation_method == 'one_for_all'">
CASE
WHEN (
-- movement overlaps with time frame
GREATEST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)
<= <dtml-sqlvar interpolation_method_from_date type="datetime"> OR
LEAST(<dtml-var stock_table_id>.date, <dtml-var stock_table_id>.mirror_date)
<dtml-if interpolation_method_at_date>
>= <dtml-sqlvar interpolation_method_at_date type="datetime">
<dtml-else>
> <dtml-sqlvar interpolation_method_to_date type="datetime">
</dtml-if>
) THEN 0
ELSE 1
END
<dtml-else>
1
</dtml-if>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>stock_table_id\r\n
interpolation_method\r\n
interpolation_method_from_date\r\n
interpolation_method_to_date\r\n
interpolation_method_at_date</string> </value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>cmf_activity_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SimulationTool_zGetInterpolationMethod</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment