GGCE Server issueshttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues2024-03-28T11:53:04+01:00https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/476Error handling for Genesys upload2024-03-28T11:53:04+01:00Matija ObrezaError handling for Genesys uploadWhen uploading passport data to Genesys the code now stops the upload when there are more then 10 errors reported by Genesys API.
```java
// If more than 10 errors, stop uploading, report error
if (opErrors.size() > 10) {
```
If there ...When uploading passport data to Genesys the code now stops the upload when there are more then 10 errors reported by Genesys API.
```java
// If more than 10 errors, stop uploading, report error
if (opErrors.size() > 10) {
```
If there are less than 10 errors then those errors are not reported to the client, giving the impression that upload was successful. The code should still stop the upload at 10 errors, but it should collect error messages reported by Genesys API and make them available to the client as part of `UploadState.errors`:
```java
@Data
class UploadState
...
/** Errors reported by Genesys API */
private Map<AccessionInfo, String> errors;
```
## UI update
The upload progress dialog should include display of the number of errors found (in red) and display the error table linking to accessions:
|Accession|Error|
|--|--|
|[TMe-419](https://demo.ggce.genesys-pgr.org)|*Error message here...*|2024.2Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/475Workflow support2024-03-27T11:38:02+01:00Matija ObrezaWorkflow supportA **workflow** in GGCE is designed on top of `...Actions` and GGCE automatically schedules the next action(s) in the workflow when an action of the workflow is completed (not canceled as described in #474).
A workflow operates on **one ...A **workflow** in GGCE is designed on top of `...Actions` and GGCE automatically schedules the next action(s) in the workflow when an action of the workflow is completed (not canceled as described in #474).
A workflow operates on **one type** of `AbstractAction` declared in `actionType` (e.g. `org.gringlobal.model.InventoryAction`):
```java
class Workflow extends CoooperatorOwnedModel {
/** Is this workflow active? */
@Column(name = "is_active", nullable = false)
@Pattern("^Y|N$")
private String isActive;
/** Unique workflow code/key */
@Column(length = 100, unique = true, nullable = false, modifiable = false)
public String code;
/** Contains the class name of target actions. For example "org.gringlobal.model.InventoryAction" **/
@Column(name = "action_type", length = 100, nullable = false, modifiable = false)
public String actionType;
```
A workflow is composed of a number of **workflow steps** and a step is defined as:
```java
class WorkflowStep extends CoooperatorOwnedModel {
@ManyToOne
private Workflow workflow;
}
/**
* Every workflow needs to have exactly one start step.
*/
class WorkflowStartStep extends WorkflowStep {
}
/**
* Every workflow needs to have at least one end step.
*/
class WorkflowEndStep extends WorkflowStep {
}
/**
* {@code ActionStep} schedules a follow-up action when some action in this workflow is completed (not canceled).
*/
class ActionStep extends WorkflowStep {
/** The action to be scheduled in this workflow step. */
@Column(nullable = false, modifiable = false)
private String actionNameCode;
/** The assignee of the action scheduled in this workflow step. */
@Column(nullable = true, modifiable = false)
private AclSid actionAssignee;
}
```
The flow between workflow steps is defined as a `List<WorkflowTransition> transitions`:
```
/**
* A directional link between two workflow steps.
*/
class WorkflowTransition {
/** Source step in workflow */
@ManyToOne(optional = false)
@JoinColumn(updatable = false)
private WorkflowStep origin;
/** Target step in the same workflow */
@ManyToOne(optional = false)
@JoinColumn(updatable = false)
private WorkflowStep target;
}
```
All workflow steps must appear at least once as an **origin** and a **target**, except `WorkflowStartStep` which has no `origin` and `WorkflowEndStep` with no `target`.
## Updating workflows
- New steps can always be added to a workflow.
- A workflow can be removed if there are no `workflowStepId` foreign key constraint problems
- We should have a way to "disconnect selected actions from a workflow" somewhere in the UI
## Running the workflows
To initiate the workflow we find its `WorkflowStartStep` and find the relevant list of transitions.targets to "execute". For `ActionStep` we schedule a new action with `actionStep.actionNameCode` (add it to the database). All newly scheduled actions have `assignee = nextActionAsignee`.
We need to keep track of which workflow step registered the action. This requires that we add `private WorkflowStep workflowStep` to `AbstractAction`. This allows us to find all actions associated with this workflow or any specific workflow step.
When any action is completed (with `isDone = 'Y'`) anywhere in GGCE we inspect if has a `workflowStep` then look for the next `WorkflowStep`s in the corresponding workflow where `transitions.origin == action.workflowStep` and "execute" them (e.g. adding the next action). If `isDone != 'Y'` then nothing happens and that branch of the workflow ends.
To run workflows we should inject the handling logic somewhere where we have access to both previous `target` and `updated` action data so we can check if there was a change in the data. This could be an aspect on `BaseActionSupport#update` and `BaseActionSupport#updateFast`, ~~or perhaps on `Firehose` (no, it doesn't have access to previous state)~~.2024.4Vladyslava MokliakVladyslava Mokliakhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/474Canceling actions2024-03-27T11:37:58+01:00Matija ObrezaCanceling actionsActions in GGCE can be scheduled/pending, started or completed. We need a mechanism that allows users to **cancel an action** regardless of its state (instead of deleting it from the database).
A **canceled action** is an action that wa...Actions in GGCE can be scheduled/pending, started or completed. We need a mechanism that allows users to **cancel an action** regardless of its state (instead of deleting it from the database).
A **canceled action** is an action that was started, but could not be executed for some reason (recorded in `action.note`). Or it was scheduled, never started and will never start for some other reason. Canceled actions are completed in the sense that they don't need to be performed.
The implementation for **canceling an action** is the same as the one for completing an action: the `completedDate` is set but we need a way to express that the action was not "done". `isDone` is a new property of `AbstractAction`:
```java
@Column(name = "is_done", nullable = true, length = 1)
@Pattern("^Y|N") // ?
protected String isDone;
```
- `isDone == null` means the action is still scheduled or in progress,
- `isDone == 'Y'` means that the action was completed, while
- `isDone == 'N'` means that the action was canceled.
## Changes
Listing completed actions must exclude those where `isDone == 'N'`. All completed actions that are already in the database must have their `isDone` set to `Y` in liquibase, since they are all completed.
We need a new API endpoint to list canceled actions `where completedDate.isNotNull().and(isDone.eq("N"))` so that we can display them in the UI.
## UI
- Add a new tab for **Canceled** actions.
- Include field in action forms.
- If we have "complete selected actions" button, then we should also have "cancel selected actions" button.2024.4Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/473Assigning actions2024-03-22T01:21:59+01:00Matija ObrezaAssigning actionsThis ticket adds support for assigning `...Action` to a specific user (`SysUser`), user group (`SysGroup`) or any other SID for that matter.
```java
public abstract class AbstractAction ... {
@ManyToOne
@JoinColumn(nullable = true, .....This ticket adds support for assigning `...Action` to a specific user (`SysUser`), user group (`SysGroup`) or any other SID for that matter.
```java
public abstract class AbstractAction ... {
@ManyToOne
@JoinColumn(nullable = true, ...)
private AclSid assignee;
...
}
```
`ActionFilter` should allow for filtering by `assignee`.
## UI
Include **Assignee** in all action tables, forms and search filters. Filtering uses the same approach as `modifiedBy`:
![image](/uploads/779c8cbf517a5b03279479b9cfe5a497/image.png)
Add support to select multiple actions and "Assign selected actions" to some `SysUser` or `SysGroup`.2024.4Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/472Custom subscriber list for scheduled notifications2024-03-27T06:34:45+01:00Matija ObrezaCustom subscriber list for scheduled notificationsThis ticket adds support for **user-defined subscriptions** to scheduled notifications. Instead of using a building the list of recipients in code as described in https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/468#n...This ticket adds support for **user-defined subscriptions** to scheduled notifications. Instead of using a building the list of recipients in code as described in https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/468#notification-recipients, we allow the *Administrator* to define a list of subscribers for each `NotificationSchedule` record separately:
```java
class NotificationSchedule ... {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "notificationSchedule")
private List<NotificationScheduleSubscriber> subscribers = new ArrayList<NotificationScheduleSubscriber>();
}
@Table(name = "notification_schedule_subscriber")
public static class NotificationScheduleSubscriber {
@ManyToOne
NotificationSchedule notificationSchedule;
@ManyToOne(fetch = FetchType.EAGER)
AclSid sid;
}
```
## Executing scheduled tasks
Instead of calling the `notificationSchedule.generator` method directly in the Spring scheduler, we want to call a wrapper method `NotificationScheduleServiceImpl.executeScheduledTask(long notificationScheduleId)` instead. This method then:
1. Loads the `NotificationSchedule`
2. Generates the list of `SysUser` subscribers from `notificationSchedule.subscribers` by merging subscribed user groups and subscribed users, and keeping only active users.
3. If the subscribe list is empty, skips execution.
4. Calls the `notificationSchedule.generator` method with argument `List<SysUser> recipients`.
## UI
In GGCE Web *Admin tools* in **Scheduler** the Adminstrator is able to manage the `subscribers` for each `NotificationSchedule` record.2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/471Action notifications2024-03-15T10:24:40+01:00Matija ObrezaAction notificationsThis ticket adds new notification generators `org.gringlobal.notification.AccessionActionNotifications`, `org.gringlobal.notification.InventoryActionNotifications` and `org.gringlobal.notification.OrderRequestNotifications` that send the...This ticket adds new notification generators `org.gringlobal.notification.AccessionActionNotifications`, `org.gringlobal.notification.InventoryActionNotifications` and `org.gringlobal.notification.OrderRequestNotifications` that send the relevant action schedules to the subscribers. The scheduling is described in #470 and subscriber list in #472.
`AccessionActionNotifications` will use `accession-schedule.mustache` template and look like:
```java
@ScheduledNotification(value = "sendWeeklyAccessionSchedule")
@Transactional(readOnly = true)
public void generateWeeklyAccessionSchedule() {
// Load AccessionActions for next 7 days (from today at 00:00 - to today+8days at 00:00)
// Use accession-schedule.mustache to generate the body
}
@ScheduledNotification(value = "sendMonthlyAccessionSchedule")
@Transactional(readOnly = true)
public void generateMonthlyAccessionSchedule() {
// Load AccessionActions for this month (from 1st of this month at 00:00 - to 1st of next month at 00:00)
// Use accession-schedule.mustache to generate the body
}
```
The default templates should generate a table of actions similar to that in the UI:
> ## Accession action schedule {{fromInstant}} to {{toInstant}}
>
> View it in GGCE +Link to GGCE UI
>
> ![image](/uploads/c1474b01658b5580bf2adf17e5283458/image.png)
>
Template customization follows the logic in #4692024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/470Custom schedule of email notifications2024-03-28T16:53:33+01:00Matija ObrezaCustom schedule of email notificationsThis ticket adds support for **user-defined schedule** for running `KPINotifications`. Instead of fixed `@Scheduled` on the method in code, we allow the *Administrator* to define a custom schedule.
The custom schedule is stored in `@Tab...This ticket adds support for **user-defined schedule** for running `KPINotifications`. Instead of fixed `@Scheduled` on the method in code, we allow the *Administrator* to define a custom schedule.
The custom schedule is stored in `@Table("notification_schedule") public class NotificationSchedule extends VersionedModel` entity. It's properties include:
- the cron expression `String cron`
- the bean `String generator` and the method in the bean execute `String method`
- The combination of `cron + generator + method` forms a unique constraint
GGCE will inspect this table on startup and add `active = true` entries to its Spring scheduler.
On any change to `NotificationSchedule` the Spring scheduler will be updated, removing the task when deleted or `active = false`, and adjusting the `cron` if `active = true`. This can be done in the `update/create` methods in the `NotificationScheduleServiceImpl`.
The API controller is at */api/v2/admin/schedule* and follows `FilteredCRUDService2Impl` (with DTO, etc).
The API needs to be able to inform the UI which methods are available for scheduling. A new annotation `@ScheduledNotification` is added to `KPINotifications` and this annotation determines which methods can be included in the custom schedule.
```java
@ScheduledNotification(value = "sendAllKPIs")
@Transactional(readOnly = true)
public void generateLastKPIExecutions() {
for (var execution : executionRepository.listActiveExecutions()) {
notifyLastKPIExecution(execution.getName())
}
}
```
We convert from `@Scheduled` to a new `NotificationSchedule` record in `ApplicationStartup` using a programmable liquibase change.
## UI
In GGCE Web *Admin tools* a new section (menu) **Scheduler** is added. It allows the Adminstrator to manage `NotificationSchedule` records.
Multiple schedules can exist for the same `@ScheduledNotification`: for example one that runs on Mondays, and one on Fridays.2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/465Slow performance in inventory_viability_data dataview2024-03-14T20:00:02+01:00Antonio RiveraSlow performance in inventory_viability_data dataviewSince we upgrade to the 2024.1.2 versión the server performance for the _inventory_viability_data_ dataview
We send request that has a length of only 13, 000 records. The request lasted 2 hours before ending
![image.png](/uploads/efb8...Since we upgrade to the 2024.1.2 versión the server performance for the _inventory_viability_data_ dataview
We send request that has a length of only 13, 000 records. The request lasted 2 hours before ending
![image.png](/uploads/efb85ecccfffdc814e0802ff5ad015bf/image.png)
We check the server memory. It looks fine.
![image.png](/uploads/9d7059045513de0ad48da0dff9d4a266/image.png)Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/459Switch to OpenSearch2024-02-19T10:26:42+01:00Matija ObrezaSwitch to OpenSearchWe are using ES6 which is the last version before ES changed it's licensing model. The open source version was forked into OpenSearch.
In this ticket we replace ES with OS.
I think it makes sense to first upgrade ES libs in our project...We are using ES6 which is the last version before ES changed it's licensing model. The open source version was forked into OpenSearch.
In this ticket we replace ES with OS.
I think it makes sense to first upgrade ES libs in our project to the version mentioned in OS migration guide at https://opensearch.org/docs/latest/upgrade-to/upgrade-to/ and then switch over to OS.
The reason for first upgrading ES and then switching to OpenSearch in stages is that we can also slowly migrate our ES cluster.
We now have some custom code for serializing entities for indexing. That code will eventually be removed and replaced with DTO-style mapping to a distinct type before sending it over to ES/OS.Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/446Add Production Location Geography to "Get Invetory" Dataview2024-03-15T10:51:46+01:00Antonio RiveraAdd Production Location Geography to "Get Invetory" DataviewWe need to display the Production Geography Location in the inventory dataview (as the barcode column). We stored here the increment site value after migrate to GGCE.
![image](/uploads/83e240dd038a48b136a380e924a96037/image.png)
Locati...We need to display the Production Geography Location in the inventory dataview (as the barcode column). We stored here the increment site value after migrate to GGCE.
![image](/uploads/83e240dd038a48b136a380e924a96037/image.png)
Location value in the column "adm1" from the "Geography" table
![image](/uploads/137cfa5d211503b4756d0723a6c87a0d/image.png)2024.2Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/436Improved auto-numbering of accessions and inventories2024-03-15T10:58:45+01:00Matija ObrezaImproved auto-numbering of accessions and inventoriesWe use `-1` in the numerical part of accession and inventory numbers (`_number_part2`) to automatically assign the next available value.
The current implementation does not take into account numbers that were registered in the past and ...We use `-1` in the numerical part of accession and inventory numbers (`_number_part2`) to automatically assign the next available value.
The current implementation does not take into account numbers that were registered in the past and may assign the same number when the right conditions are met. Example: Accession `INTRO 13` is renamed to `ACC 9999`. If we now create a new `INTRO -1` it will may assign `INTRO 13` because it is not currently used.
We "log" `inventoryNumber` and `accessionNumber` as AccessionInvName with category `SITE_ID`. The improved auto-numbering mechanism should generate a candidate number (same as current implementation), then check if there already exists a matching `AccessionInvName` in category `SITE_ID`. If so, then it should use the next available number.
## For consideration
- We can't differentiate between accession and inventory in `AccessionInvName` without `join Inventory i` and inspecting `i.formTypeCode`.
- [Performance] We may need to check many `AccessionInvName` records to determine a "free number". What optimizations can we use?Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/393Remove sys_table*, sys_dataview* from initial data2023-07-26T08:57:22+02:00Matija ObrezaRemove sys_table*, sys_dataview* from initial dataWith 2023.3 we will no longer provide the original GG dataviews with a fresh install of GGCE.
In this issue we scrub the rows from CSV files in `liquibase/initial_data`.With 2023.3 we will no longer provide the original GG dataviews with a fresh install of GGCE.
In this issue we scrub the rows from CSV files in `liquibase/initial_data`.Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/362Strong-typed permission checks2022-09-27T13:07:08+02:00Matija ObrezaStrong-typed permission checksAny suggestion how to make the String in `@PreAuthorize("@ggceSec.actionAllowed('ViabilityTest', 'ADMINISTRATION')")` expression strongly typed so it references `SecurityAction` enum and perhaps even the enums of `BasePermission` (`CREAT...Any suggestion how to make the String in `@PreAuthorize("@ggceSec.actionAllowed('ViabilityTest', 'ADMINISTRATION')")` expression strongly typed so it references `SecurityAction` enum and perhaps even the enums of `BasePermission` (`CREATE`, `ADMINISTRATION`, ...)?Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/332Jasper: Font extensions2023-01-29T17:28:05+01:00Matija ObrezaJasper: Font extensionsTo support various fonts in PDFs the fonts need to be loaded using a **custom classloader**. The current thread's classloader needs to be saved:
```java
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader...To support various fonts in PDFs the fonts need to be loaded using a **custom classloader**. The current thread's classloader needs to be saved:
```java
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try {
.. do things with a custom classloader
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
```
The fonts can be exported as `jar` by users and uploaded to file repository (e.g. `/fonts` folder ?) to be embedded in PDF. This requires a `net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory`
- https://community.jaspersoft.com/questions/534323/reportclassloader-and-font-extensions-issue
- http://jasperreports.sourceforge.net/sample.reference/fonts/
Note: for the moment I updated Docker to include MS core fonts (Arial). That needs to be removed when font extensions are working.Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/323SysUser with mandatory unique Cooperator2023-01-29T17:28:05+01:00Matija ObrezaSysUser with mandatory unique CooperatorEach `SysUser` record in GGCE should have a corresponding `Cooperator` record (1-1). Please update it to `nullable = false` and update liqibase.
Before adding the not-null constraint, liquibase needs to have a precondition check that al...Each `SysUser` record in GGCE should have a corresponding `Cooperator` record (1-1). Please update it to `nullable = false` and update liqibase.
Before adding the not-null constraint, liquibase needs to have a precondition check that all `select count(sys_user_id) from sys_user where cooperator_id is null` equals `0`.
Also add a unique index on `sys_user.cooperator_id`, ensuring that each entry has its own `Cooperator`. Precondition `select count(cooperator_id) from sys_user group by cooperator_id having count(cooperator_id) > 1` equals `0`.
When this is ready, UI needs updating so that the list of users includes the link to `Cooperator` and the cooperator name.Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/298Firehose notification system2022-06-23T12:32:52+02:00Matija ObrezaFirehose notification systemWe introduced the Firehose to have information about what data was committed to the database. Firehose emits notifications about entity changes.
This ticket is to design API support that allows users to:
1. Subscribe to specific Fireho...We introduced the Firehose to have information about what data was committed to the database. Firehose emits notifications about entity changes.
This ticket is to design API support that allows users to:
1. Subscribe to specific Firehose event types
1. Receive email notifications when those events happen
Involve @ahrybeniuk, @crabil, @jalarcon and @adovhopolenko in the user requirements and UI design.
## Ideas to consider
1. Alert me when `Accession.accessionNumber` is modified
1. Alert me whenever a new `Inventory` is registered
1. Alert me when an action of type XX is completed
## Message delivery
1. Alert me immediately
1. Daily update
1. Weekly update?Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/234blaze-persistence?2022-08-17T11:32:47+02:00Matija Obrezablaze-persistence?Should we look what https://github.com/Blazebit/blaze-persistence brings to the table?
I spotted the URL to blaze-persistence in the now obsolete `.fetchCount()` method.Should we look what https://github.com/Blazebit/blaze-persistence brings to the table?
I spotted the URL to blaze-persistence in the now obsolete `.fetchCount()` method.Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/232API for Citations and Literature2021-10-04T11:18:35+02:00Maxym BorodenkoAPI for Citations and LiteratureImplement API for https://gitlab.croptrust.org/grin-global/grin-global-ui/-/issues/330Implement API for https://gitlab.croptrust.org/grin-global/grin-global-ui/-/issues/330Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/91Add pending actions for new inventories2021-10-04T11:21:55+02:00Matija ObrezaAdd pending actions for new inventoriesWhen a new `Inventory` is added to GG-CE, the system must automatically register two **PENDING** `InventoryAction` records:
1. `QUANTITYSET`: *Quantity update* -- The actual amount of material is inspected.
1. `LOCATIONSET`: *Location u...When a new `Inventory` is added to GG-CE, the system must automatically register two **PENDING** `InventoryAction` records:
1. `QUANTITYSET`: *Quantity update* -- The actual amount of material is inspected.
1. `LOCATIONSET`: *Location update* -- The location of the inventory is set.
These two actions are automatically closed when:
1. `QUANTITYSET` is closed when `Inventory#quantity` is updated
1. `LOCATIONSET` is closed when `Inventory#storageLocation1..4` is updated
The codes need to be registered as `CommunityCodeValues`.
It may be sensible to add an aspect on the `#save` method(s) of `InventoryRepository`, check if `Inventory` is not yet persisted and add these actions in the aspect.
Also the `InventoryService#addInventoryAction` should first try to close an existing pending action before adding a new one. It should be renamed to `#closeInventoryAction`.Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/76Acquisition: Selection of Planting Materials2020-09-02T07:40:42+02:00Grace CapilitAcquisition: Selection of Planting MaterialsIn this function, we should be able to select incoming materials for planting. These are the entries whose status afer the evaluation allows them to be part of the initial seed increase, like:
1) INC- Homogeneous/pure seeds but with i...In this function, we should be able to select incoming materials for planting. These are the entries whose status afer the evaluation allows them to be part of the initial seed increase, like:
1) INC- Homogeneous/pure seeds but with insufficient amount for storage
2) DUPY - probable duplicate that needs further testing
3) MIX - mixed sample with insufficient amount
4) REP - replacement of an old accession which is already dead or no longer available
But there are 2 categories for the selection
A) initial seed increase of incoming materials that are not yet planted ever since (first time to plant)
B) incoming materials that were already planted but harvest is not successful (replanting)
For both selection, species and type of material are required.
At IRRI, species is grouped as O. sativa, O. glaberrima and wild. Type of material is either Regular Genebank materials or Genetic Stocks. We need to add this function of identifying type of material after assigning TempID.
The cropyear and selection method should be indicated. These will be used to indicate the new inventory group for the entries that will be selected. (Example: 2020DS, ISI)
Incoming Batch(es) (accession_inv_group) will be picked and records with status sited above will be retrieved and tagged as selected materials for planting.
The selected materials can be be further reviewed and user can still delete entries that will not be included in the planting.Grace CapilitGrace Capilit