validateOnBoardingSignerData function

FormData validateOnBoardingSignerData(
  1. Map<String, dynamic> signerData
)

Valida y normaliza datos del firmante (OnBoarding) y retorna FormData.

Implementation

FormData validateOnBoardingSignerData(Map<String, dynamic> signerData) {
  final data = Map<String, dynamic>.from(signerData);

  final name = data['name'];
  if (name is! String || name.isEmpty) {
    throw ApacuanaAPIError(
      'El campo "name" es requerido y debe ser una cadena de texto.',
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }

  final ref = data['reference'];
  if (ref is! String || ref.trim().isEmpty) {
    data.remove('reference');
  }

  final file = data['file'];
  // if (file is! MultipartFile) {
  //   data.remove('file');
  // }

  final hasRef = data.containsKey('reference');
  final hasFile = data.containsKey('file');
  if (hasRef && hasFile) {
    throw ApacuanaAPIError(
      "No se pueden proporcionar 'reference' y 'file' simultáneamente.",
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }
  if (!hasRef && !hasFile) {
    throw ApacuanaAPIError(
      "Se debe proporcionar un campo 'reference' o 'file' válido.",
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }

  const validDocTypes = ['V', 'P', 'E'];
  final typedoc = data['typedoc'];
  if (typedoc is! String || !validDocTypes.contains(typedoc)) {
    throw ApacuanaAPIError(
      'El campo "typedoc" es requerido y debe ser uno de: V, P, E.',
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }

  final doc = data['doc'];
  if (doc is! String || doc.isEmpty) {
    throw ApacuanaAPIError(
      'El campo "doc" es requerido y debe ser una cadena de texto.',
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }

  final signature = data['signature'];
  if (signature is! List || signature.isEmpty) {
    throw ApacuanaAPIError(
      'El campo "signature" es requerido y debe ser un array no vacío.',
      statusCode: 400,
      errorCode: 'INVALID_PARAMETER_FORMAT',
    );
  }

  for (var i = 0; i < signature.length; i++) {
    final sig = signature[i];
    if (sig is! Map) {
      throw ApacuanaAPIError(
        'Cada elemento de "signature" debe ser un objeto.',
        statusCode: 400,
        errorCode: 'INVALID_PARAMETER_FORMAT',
      );
    }
    final page = sig['page'];
    final x = sig['x'];
    final y = sig['y'];
    if (page is! int || page < 1) {
      throw ApacuanaAPIError(
        'La página de la firma ${i + 1} debe ser un entero positivo.',
        statusCode: 400,
        errorCode: 'INVALID_PARAMETER_FORMAT',
      );
    }
    if (x is! num || x < 0 || x > 1) {
      throw ApacuanaAPIError(
        'La coordenada X de la firma ${i + 1} debe estar entre 0 y 1.',
        statusCode: 400,
        errorCode: 'INVALID_PARAMETER_FORMAT',
      );
    }
    if (y is! num || y < 0 || y > 1) {
      throw ApacuanaAPIError(
        'La coordenada Y de la firma ${i + 1} debe estar entre 0 y 1.',
        statusCode: 400,
        errorCode: 'INVALID_PARAMETER_FORMAT',
      );
    }
  }

  // final formData = FormData();
  // data.forEach((key, value) {
  //   if (key == 'signature') {
  //     formData.fields.add(MapEntry('signature', jsonEncode(value)));
  //   } else if (key == 'file' && value is MultipartFile) {
  //     formData.files.add(MapEntry('document', value));
  //   } else if (value != null) {
  //     formData.fields.add(MapEntry(key, value.toString()));
  //   }
  // });

  final formData = FormData.fromMap({
    'name': data['name'],
    'typedoc': data['typedoc'],
    'doc': data['doc'],
    'signature': jsonEncode(data['signature']),
    if (data.containsKey('reference')) 'reference': data['reference'],
    if (data.containsKey('file')) 'document': data['file'],
  });

  return formData;
}