# 260 · opportunitiesnewfromce

> Technisches Mapping des Jobs `opportunitiesnewfromce` (`CEOpportunities`).

---

LLMS index: [llms.txt](/llms.txt)

---

| Eigenschaft | Wert |
|---|---|
| Order | 260 |
| Job | `opportunitiesnewfromce` |
| Mapping | `CEOpportunities` |
| Richtung | CE → BC |
| Quellverbindung | CRM_Test |
| Zielverbindung | BC_Test |
| Quelltabelle (API) | `opportunity` aus `BC_Test-seitig, kein API-Pfad` |
| Zieltabelle | `acdopportunities` |
| Zeitplan | 0 */2 * * * * |
| Filter | `JSON-Filter: IsNull(wysa_bcsystemid) UND OptionSetValue(wysa_sync2bc=799840000)` |
| Watermark | — |
| Response-Job | `opportunitiesresponsefrombc` |
| Fachliche Doku | [Neue Verkaufschance nach BC](../verkaufschance/ceopportunities/) |

## Feldzuordnung

| Quellfeld | Zielfeld | Operation | Details |
|---|---|---|---|
| `_URL` | `dynamicsSalesLink` | LinkToRecord | Deep-Link (baseUrl konfiguriert) |
| `description` | `extendedDescription` | — | — |
| `estimatedclosedate` | `expectedCloseDate` | — | — |
| `estimatedvalue` | `expectedRevenue` | — | — |
| `name` | `description` | — | — |
| `opportunityid` | `dataverseId` | — · **Schlüssel** | — |
| `_parentaccountid.wysa_bccontactnumber` | `contactCompanyNumber` | LookupValue | liest `wysa_bccontactnumber` aus `account` über `parentaccountid` |
| `_parentcontactid.wysa_bccontactnumber` | `contactNumber` | LookupValue | liest `wysa_bccontactnumber` aus `contact` über `parentcontactid` |
| `_wysa_bcsalespersonid.wysa_code` | `salespersonCode` | LookupValue | liest `wysa_code` aus `wysa_bcsalesperson` über `wysa_bcsalespersonid` |

## Alternate Key

```json
{
  "keyType": "Filter",
  "keyValues": [
    {
      "attributeName": "id",
      "keyName": "dataverseId",
      "rank": 1
    }
  ],
  "keyAttributeFromExisting": "Id",
  "ignoreEmptySourceKey": false,
  "keyRank": 0
}
```

## Weitere technische Details

### Transformationen im Detail

**Deep Link** (`_URL` → `dynamicsSalesLink`) — die Operation `LinkToRecord` setzt aus
einer Basisadresse und der GUID des Datensatzes eine aufrufbare URL zusammen. Sie kommt
in der gesamten Integration nur hier vor.

```json
{
  "Operations": [{
    "Name": "LinkToRecord",
    "Parameters": {
      "BaseUrl": "https://dsyr-salescentral.crm4.dynamics.com/main.aspx?appid=1fb84e94-89dd-ef11-8ee9-7c1e527610c5&pagetype=entityrecord"
    }
  }]
}
```

Umgebungsadresse und App-ID sind fest hinterlegt.

**Firma und Kontakt** — beide werden über die BC Kontaktnummer des jeweiligen
Datensatzes aufgelöst. Business Central kennt Firmen und Personen in derselben
Kontakttabelle, deshalb ist das Nachschlagefeld in beiden Fällen dasselbe:

| Quellfeld | Nachschlagetabelle | Nachschlagefeld | Zielfeld |
|---|---|---|---|
| `parentaccountid` | `account` | `wysa_bccontactnumber` | `contactCompanyNumber` |
| `parentcontactid` | `contact` | `wysa_bccontactnumber` | `contactNumber` |
| `wysa_bcsalespersonid` | `wysa_bcsalesperson` | `wysa_code` | `salespersonCode` |

Alle drei mit `LookupType: Attribute` und `UseCache: true`. Beispiel Kontakt:

```json
{
  "Operations": [{
    "Name": "LookupValue",
    "Parameters": {
      "LookupType": "Attribute",
      "SourceField": "parentcontactid",
      "LookupTable": "contact",
      "LookupField": "wysa_bccontactnumber",
      "UseCache": true
    }
  }]
}
```

Ist eines der beiden Nachschlagefelder leer, kann die Zuordnung nicht gebildet werden —
genau das verhindert die Freigaberegel.

### Beobachtungen

* `keyAttributeFromExisting` steht hier auf `Id` mit großem I, in den Mappings von
  Firma und Kontakt auf `id`. Ob das eine Rolle spielt, hängt davon ab, wie die
  DataBridge den Wert auswertet.
