createTicket method

Future<Map<String, dynamic>> createTicket({
  1. required String projectID,
  2. required String trackerID,
  3. required String tenantProductID,
  4. required String subject,
  5. required String statusID,
  6. String? description,
  7. String? priorityID,
  8. String? assigneeID,
  9. DateTime? startDate,
  10. DateTime? dueDate,
  11. Map<String, dynamic>? customValues,
  12. String? audioFilePath,
  13. String? audioFieldID,
})

Create Ticket with Audio File Support

Implementation

Future<Map<String, dynamic>> createTicket({
  required String projectID,
  required String trackerID,
  required String tenantProductID,
  required String subject,
  required String statusID,
  String? description,
  String? priorityID,
  String? assigneeID,
  DateTime? startDate,
  DateTime? dueDate,
  Map<String, dynamic>? customValues,
  String? audioFilePath,
  String? audioFieldID,
}) async {
  // If audio file exists, use multipart upload
  if (audioFilePath != null && audioFieldID != null) {
    return _createTicketWithAudio(
      projectID: projectID,
      trackerID: trackerID,
      tenantProductID: tenantProductID,
      subject: subject,
      description: description,
      statusID: statusID,
      priorityID: priorityID,
      assigneeID: assigneeID,
      startDate: startDate,
      dueDate: dueDate,
      customValues: customValues,
      audioFilePath: audioFilePath,
      audioFieldID: audioFieldID,
    );
  }

  // Regular GraphQL mutation without file
  const mutation = r'''
    mutation CreateTicket($input: CreateProjectTicketInput!) {
      createProjectTicket(input: $input) {
        success
        message
        projectTicket {
          id
          ticketNumber
          subject
          customValues
          startDate
          createdAt
        }
      }
    }
  ''';

  final Map<String, dynamic> input = {
    'projectID': projectID,
    'trackerID': trackerID,
    'tenantProductID': tenantProductID,
    'subject': subject,
    'statusID': statusID,
    if (description != null && description.isNotEmpty) 'description': description,
    if (priorityID != null) 'priorityID': priorityID,
    if (assigneeID != null) 'assigneeID': assigneeID,
    if (startDate != null) 'startDate': startDate.toUtc().toIso8601String(),
    if (dueDate != null) 'dueDate': dueDate.toUtc().toIso8601String(),
  };

  if (customValues != null && customValues.isNotEmpty) {
    input['customValues'] = jsonEncode(_prepareCustomValuesForBackend(customValues));
  }

  final variables = {'input': input};
  print("Creating ticket with input: $input");

  final result = await _api.graphql(mutation, variables);

  final ticketResponse = result['createProjectTicket'];
  if (ticketResponse != null) {
    print("Ticket service returning: $ticketResponse");
    return ticketResponse;
  }

  return {'success': false, 'message': 'Unknown error - no response data'};
}