def grabarDetalleBD(datos_contrato, detalles):

    # comprueba si existe el estado de licitación. Si es así lee el Id, si no... lo crea
    try:
        id_estado = PceEstado.get(PceEstado.descripcion == detalles.estadoLic).id_estado
    except PceEstado.DoesNotExist:
        estado = PceEstado.create(descripcion=detalles.estadoLic)
        id_estado = estado.id_estado

    # comprueba si existe el procedimiento de licitación. Si es así lee el Id, si no... lo crea
    try:
        id_tipo_procedimiento = PceTipoProcedimiento.get(
            PceTipoProcedimiento.descripcion == detalles.procedimiento
        ).id_tipo_procedimiento
    except PceTipoProcedimiento.DoesNotExist:
        procedimiento = PceTipoProcedimiento.create(descripcion=detalles.procedimiento)
        id_tipo_procedimiento = procedimiento.id_tipo_procedimiento

    # actualiza documentos
    for docs in detalles.Documento.keys():
        documento, created = PceDocumento.get_or_create(
            id_licitacion=datos_contrato.id_licitacion,
            tipo_documento=docs,
            defaults={"fecha": detalles.Documento[docs][0], "documento": detalles.Documento[docs][1]},
        )

    # actualiza registro
    q = PceExpediente.update(
        id_estado=id_estado,
        id_tipo_procedimiento=id_tipo_procedimiento,
        importe_adj=detalles.impadjudicacion,
        enlacelic=detalles.enlacelic,
        codigocpv=detalles.codigocpv,
        resultado=detalles.resultado,
        adjudicatario=detalles.adjudicatario,
        numlicitadores=detalles.numlicitadores,
    ).where(PceExpediente.id_licitacion == datos_contrato.id_licitacion)
    n = q.execute()

    return n