---
title: "Setup a production chain with JDemetra+"
vignette: >
  %\VignetteIndexEntry{Production processus (EN)}
  %\VignetteEngine{quarto::html}
  %\VignetteEncoding{UTF-8}
knitr:
  opts_chunk:
    collapse: true
    comment: '#>'
---

```{r}
#| label: setup
#| eval: true
#| echo: false

knitr::opts_chunk$set(
    collapse = TRUE,
    echo = TRUE,
    eval = rjd3jars::check_java_version(silent = TRUE),
    comment = "#>"
)
```


```{r}
#| label: setup-rjd3production
library("rjd3production")
```

The {rjd3production} package is useful for setting up a production pipeline for seasonally adjusted time series.

Before creating our production pipeline, we need to set up our working environment – our project. The `init_env()` function creates the following structure:

- a `data/` folder: our raw data
- a `Workspaces/` folder: our workspaces
- an `output/` folder: the output time series, tables and graphs
- a `specs/` folder: workspace-specific specifications (calendar regressors, outliers, etc.)
- a `BQ/` folder: quality reports and decision files
- a DESCRIPTION file to manage our project’s dependencies
- a `.lintr` file for static code analysis (formatting best practices)
- a README.md file to explain our project
- a Git project structure

```{r}
#| echo: true
#| eval: false
#| warning: false
#| label: init-project

path_project <- tempfile(pattern = "my_sa_project")
init_env(path = path_project)
```

In this tutorial, we will create a production pipeline using the ABS dataset from the {rjd3toolkit} package.
The dataset is also available as the file `ABS.csv` at `{r} system.file("extdata", "ABS.csv", package = "rjd3providers")` in the {rjd3providers} package.

```{r}
#| echo: true
#| warning: false
#| label: setup-rjd3toolkit

library("rjd3toolkit")
path_ABS <- system.file("extdata", "ABS.csv", package = "rjd3providers")
my_data <- ABS[, seq_len(3L)]
colnames(my_data) <- substr(colnames(my_data), start = 2L, stop = 12L)
```

## Selection of calendar regressors

If our time series are sensitive to calendar effects, we can correct for these effects using calendar regressors.

To do this, refer to the `td-selection` vignette for guidance on how to handle these effects and how to generate the `td` table containing our selected custom calendar regressors.

```{r}
#| echo: true
#| label: select-td

td <- select_td(my_data)
```

## Creating a workspace

We will use the {rjd3workspace} package for functions relating to the creation and manipulation of workspaces.

```{r}
#| echo: true
#| warning: false
#| label: setup-rjd3workspace

library("rjd3workspace")
```

To create a new workspace, you can either create it manually from scratch or from a dataset.
If you are using external variables, calendar regressors or a custom calendar, don’t forget to place all of these within a modelling context.

At INSEE, we use the `create_insee_context()` function to create our contexts:

```{r}
#| echo: true
#| label: create-context

my_context <- create_insee_context(s = my_data[, 1L])
```

We will use the {rjd3x13} package to create the X13 specs.

```{r}
#| echo: true
#| warning: false
#| label: setup-rjd3x13

library("rjd3x13")
```

- Create a workspace from scratch

```{r}
#| echo: true
#| label: create-ws-from-0

jws <- jws_new(modelling_context = my_context)
jsap <- jws_sap_new(jws, "Nouveau SAP")
add_sa_item(jsap = jsap, name = "Première série", x = my_data[, 1L], spec = x13_spec())
add_sa_item(jsap = jsap, name = "Seconde série", x = my_data[, 2L], spec = x13_spec())
#... avec autant de commande que de séries
```

- Create a workspace from a dataset

```{r}
#| echo: true
#| label: create-ws-from-data

jws <- create_ws_from_data(my_data)
set_context(jws, create_insee_context(s = my_data))
```

If we have any, we need to assign calendar regressors to each series:

```{r}
#| echo: true
#| label: assign-td

jws_compute(jws)
assign_td(td = td, jws = jws)
```

Don’t forget to update the metadata for our workspace with the path to our raw data:

```{r}
#| echo: true
#| label: update-ts-metadata

add_raw_data_path(jws, path_ABS, delimiter = "COMMA")
```

At last, we can save our workspace!

```{r}
#| echo: true
#| eval: false
#| label: save-workspace

path_ws <- file.path(path_project, "Workspaces", "workspace_travail", "my_ws.xml")
save_workspace(jws, path_ws, replace = TRUE)
```

## Call from the cruncher

In an R production pipeline, the cruncher plays a vital role as it enables:

1. Updating the raw data from the data file
2. Updating the seasonal adjustment model (according to a refresh policy)
3. Production of outputs
