def METHOD_NAME(project):
    """
    Check if transaction has a type, date (in the past or today) and value.
    Check if the transaction has a currency if there is not default currency.
    Check if provider and receiver org have a IATI identifier.
    :param project: Project object
    :return: All checks passed boolean, [Check results]
    """
    checks = []
    all_checks_passed = True
    prefetch_attributes = (
        'receiver_organisation',
        'provider_organisation',
    )
    for transaction in project.METHOD_NAME.prefetch_related(*prefetch_attributes).all():
        if not transaction.transaction_type:
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has no type'})))
        if not transaction.transaction_date:
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has no date'})))
        elif transaction.transaction_date > date.today():
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has a date in the future'})))
        if transaction.value is None:
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has no value'})))
        if not transaction.value_date:
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has no value date'})))
        if not (transaction.currency or project.currency):
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) has no currency and no default currency specified'})))
        if transaction.receiver_organisation and not transaction.receiver_organisation.iati_org_id:
            checks.append(('warning', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'receiver organisation of transaction (id: {transaction.id}) has no IATI identifier'})))
        if transaction.provider_organisation and not transaction.provider_organisation.iati_org_id:
            checks.append(('warning', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'provider organisation of transaction (id: {transaction.id}) has no IATI identifier'})))
        if (transaction.recipient_region_vocabulary
                or transaction.recipient_region_vocabulary_uri) and not transaction.recipient_region:
            all_checks_passed = False
            checks.append(('error', json.dumps({
                'model': 'transaction', 'id': transaction.id, 'message': f'transaction (id: {transaction.id}) is missing a recipient region'})))
        if transaction.recipient_region_vocabulary == '99' and not transaction.recipient_region_vocabulary_uri:
            checks.append(('warning', json.dumps({
                'model': 'transaction',
                'id': transaction.id,
                'message': f'transaction (id: {transaction.id}) recipient region has vocabulary 99 (reporting organisation), but no vocabulary URI specified'
            })))
    if project.METHOD_NAME.all() and all_checks_passed:
        checks.append(('success', 'has valid transaction(s)'))
    return all_checks_passed, checks