def insert_equipment(equipment_map, user):
    '''
    Insere um equipamento e o relacionamento entre equipamento e o grupo.

    @param equipment_map: Map com as chaves: id_grupo, id_tipo_equipamento, id_modelo e nome
    @param user: Usuário autenticado na API.

    @return Em caso de erro retorna a tupla: (código da mensagem de erro, argumento01, argumento02, ...)
            Em caso de sucesso retorna a tupla: (0, <identificador do equipamento_grupo>, <equipamento>)

    @raise InvalidGroupToEquipmentTypeError: Equipamento do grupo “Equipamentos Orquestração” somente poderá ser criado com tipo igual a “Servidor Virtual”.

    @raise EGrupoNotFoundError: Grupo não cadastrado. 

    @raise GrupoError: Falha ao pesquisar o Grupo. 

    @raise TipoEquipamentoNotFoundError: Tipo de equipamento nao cadastrado.

    @raise ModeloNotFoundError: Modelo nao cadastrado.

    @raise EquipamentoNameDuplicatedError: Nome do equipamento duplicado.

    @raise EquipamentoError: Falha ou inserir o equipamento.

    @raise UserNotAuthorizedError: Usuário sem autorização para executar a operação.  

    '''
    log = Log('insert_equipment')

    log.debug('EQUIPAMENTO_MAP: %s', equipment_map)

    equipment = Equipamento()
    equipment.tipo_equipamento = TipoEquipamento()
    equipment.modelo = Modelo()

    group_id = equipment_map.get('id_grupo')
    if not is_valid_int_greater_zero_param(group_id):
        log.error(
            u'The group_id parameter is not a valid value: %s.', group_id)
        raise InvalidValueError(None, 'group_id', group_id)
    else:
        group_id = int(group_id)

    if not has_perm(user,
                    AdminPermission.EQUIPMENT_MANAGEMENT,
                    AdminPermission.WRITE_OPERATION,
                    group_id,
                    None,
                    AdminPermission.EQUIP_WRITE_OPERATION):
        raise UserNotAuthorizedError(
            None, u'Usuário não tem permissão para executar a operação.')

    equipment_type_id = equipment_map.get('id_tipo_equipamento')
    if not is_valid_int_greater_zero_param(equipment_type_id):
        log.error(
            u'The equipment_type_id parameter is not a valid value: %s.', equipment_type_id)
        raise InvalidValueError(None, 'equipment_type_id', equipment_type_id)
    else:
        equipment.tipo_equipamento.id = int(equipment_type_id)

    model_id = equipment_map.get('id_modelo')
    if not is_valid_int_greater_zero_param(model_id):
        log.error(
            u'The model_id parameter is not a valid value: %s.', model_id)
        raise InvalidValueError(None, 'model_id', model_id)
    else:
        equipment.modelo.id = int(model_id)

    name = equipment_map.get('nome')
    if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50):
        log.error(u'The name parameter is not a valid value: %s.', name)
        raise InvalidValueError(None, 'name', name)
    else:
        equipment.nome = name

    #maintenance is a new feature. Check existing value if not defined in request
    #Old calls does not send this field
    maintenance = equipment_map.get('maintenance')
    if maintenance is None:
        maintenance = False
    if not is_valid_boolean_param(maintenance):
        log.error(u'The maintenance parameter is not a valid value: %s.', maintenance)
        raise InvalidValueError(None, 'maintenance', maintenance)
    else:
        equipment.maintenance = maintenance

    equipment_group_id = equipment.create(user, group_id)

    return 0, equipment_group_id, equipment