create method

  1. @override
Future create()
override

Implementation

@override
Future create() async {
  final Program program = await ProgramQuery(database: database)
      .byId(this.program as String)
      .withAttributes()
      .getOne();

  TrackedEntityInstance trackedEntityInstance = TrackedEntityInstance(
    orgUnit: this.orgUnit as String,
    dirty: false,
    trackedEntityType: program.trackedEntityType as String,
  );

  Enrollment enrollment = Enrollment(
      trackedEntityType: program.trackedEntityType as String,
      orgUnit: this.orgUnit as String,
      program: program.id as String,
      trackedEntityInstance: trackedEntityInstance.trackedEntityInstance,
      status: 'ACTIVE',
      dirty: true);

  trackedEntityInstance.enrollments = [enrollment];

  final List<ProgramTrackedEntityAttribute> reservedAttributes =
      (program.programTrackedEntityAttributes ?? [])
          .where((attribute) => attribute.generated == true)
          .toList();

  List<TrackedEntityAttributeValue> attributeValues = [];

  await Future.wait(reservedAttributes.map((attribute) async {
    final AttributeReservedValue? attributeReservedValue =
        await AttributeReservedValueQuery(database: database)
            .where(attribute: 'attribute', value: attribute.attribute)
            .getOne();

    if (attributeReservedValue != null) {
      final String id =
          '${trackedEntityInstance.trackedEntityInstance}_${attribute.attribute}';
      attributeValues.add(TrackedEntityAttributeValue(
          id: id,
          name: id,
          dirty: true,
          attribute: attribute.attribute,
          trackedEntityInstance: trackedEntityInstance.trackedEntityInstance,
          value: attributeReservedValue.value));

      await AttributeReservedValueQuery(database: database)
          .byId(attributeReservedValue.id as String)
          .delete();
    }

    return null;
  }));

  trackedEntityInstance.attributes = attributeValues;

  this.data = trackedEntityInstance;

  await this.save();

  return trackedEntityInstance;
}