Skip to content

Commit

Permalink
fix: updated the status field on PersonLearning to be not empty
Browse files Browse the repository at this point in the history
  • Loading branch information
Carsten Koch committed Dec 19, 2024
1 parent cd90d5f commit e67efcb
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 64 deletions.
15 changes: 8 additions & 7 deletions docs/releases/next.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,15 @@
## Geplant

- Chat stabilisieren
- Informationen zu mir im Chat erweitern (offene Todos, offene Projekte, Beziehungen, meine Kunden, Personen, die ich kürzlich getroffen habe, Personen, die demnächst Geburtstag haben, offene Gebetsanliegen)
- Das Konzept, dass zuerst eine Beziehung in der Datenbank angelegt wird, nur um das Formular anzeigen zu können, ist Mist; es erzeugt Waisen in der DB
- Bei den Beziehungen sollten auch Chef-Mitarbeiter Beziehungen abgebildet werden können
- Todos auch in der Projektliste abhaken
- Schnell eine neue Aktivität auch in der Next Actions Liste hinzufügen oder auch in der Tagesaufgabenliste
- Projekte sollten auch als deligiert markiert werden können und dann auch in der On Hold Liste auftauchen. In der Wochen-/Tagesplanung sollte hier dann geprüft werden, ob diese Projekte auch weiterhin delegiert bleiben. Bei Meetings sollten diese Projekte natürlich dennoch angezeigt werden.

### Meetings

- In einem Meeting möchte ich zu einer Person schnell etwas Gelerntes erfassen können, ein Gebetsanliegen, eine Geschenkidee, die aktuelle Jobposition oder ein Kontaktdetail (z.B. Email, Telefon).
- In einem Meeting möchte ich zu jedem Teilnehmer schnell die letzten "Learnings" einsehen können sowie offene Gebetsanliegen oder den Geburtstag, so dass ich das in dem Meeting einfließen lassen oder nutzen kann.
- Wenn "Learnings" sich überholt haben, möchte ich diese "abhaken" können. Das gilt zum Beispiel für Urlaube. Auf der anderen Seite kann es interessant sein, zu sehen, wenn eine Person ein Land besonder liebt und immer wieder bereist oder wenn die Person besonders viele verschiedene Länder besucht. Auch die Art der Reisen könnte interessant sein (z.B. Motorrad, Campingwagen, Fahrrad).
- Beziehungen sollten auch angezeigt werden, vielleicht auch schnell die Jobhistorie.
- Für jedes Projekt im Meeting sollte ein kurzer Status aufgezeigt werden und die offenen Aufgaben.

### Account Details

Expand All @@ -47,6 +44,8 @@
- Kontaktdetails als Adressbuch ins iPhone einbinden.
- Auch Chef/Mitarbeiter-Beziehung abbilden.
- An Firmen werden die Kontakte nicht korrekt angezeigt, wenn das Startdatum ihrer Rolle nicht definiert ist.
- Das Konzept, dass zuerst eine Beziehung in der Datenbank angelegt wird, nur um das Formular anzeigen zu können, ist Mist; es erzeugt Waisen in der DB
- Bei den Beziehungen sollten auch Chef-Mitarbeiter Beziehungen abgebildet werden können

### Lektüre

Expand All @@ -67,6 +66,8 @@
- Im Kontext Familie einführen, welche Person von einem Projekt profitiert ("Beneficial").
- Purpose und Beneficial haben Einfluss auf die Priorität und die Sortierung von Projekten.
- Die Badges für CRM Hygiene sollten wieder angezeigt werden.
- Schnell eine neue Aktivität auch in der Next Actions Liste hinzufügen oder auch in der Tagesaufgabenliste
- Todos auch in der Projektliste abhaken

### Finanzdaten

Expand All @@ -84,9 +85,9 @@
- Auch Dokumente (PDFs etc.) an Notizen anhängen. Sollten im Fließtext dargestellt werden.
- Eine Methode überlegen, wie ich Informationen danach kategorisiere, ob sie nur für das Projekt relevant sind, für den Kunden oder den Purpose oder sogar übergreifend für den Kontext (Familie, Hobby, Arbeit). Gerade dort kann die [PARA-Methode](https://fortelabs.com/blog/para/) helfen.

### Künstliche Intelligenz
### Chatbot

- Die Notizen und Todos mithilfe von Bedrock durchsuchbar machen ([Artikel 1](https://aws.amazon.com/de/blogs/machine-learning/build-generative-ai-agents-with-amazon-bedrock-amazon-dynamodb-amazon-kendra-amazon-lex-and-langchain/) und [Artikel 2](https://medium.com/@dminhk/adding-amazon-dynamodb-memory-to-amazon-bedrock-using-langchain-expression-language-lcel-%EF%B8%8F-1ca55407ecdb))
- Informationen zu mir im Chat erweitern (offene Todos, offene Projekte, Beziehungen, meine Kunden, Personen, die ich kürzlich getroffen habe, Personen, die demnächst Geburtstag haben, offene Gebetsanliegen)

### Suche

Expand Down
61 changes: 61 additions & 0 deletions scripts/helpers/fill-finished-on.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
const {
ScanCommand,
UpdateItemCommand,
DynamoDBClient,
} = require("@aws-sdk/client-dynamodb");
const { stdLog } = require("./filter-and-mapping");
const { getTable, getEnvironment } = require("../import-data/environments");
const { getAwsProfile } = require("./get-aws-profile");
const { fromIni } = require("@aws-sdk/credential-providers");

const fillFinishedOn = async () => {
const TableName = getTable("Activity");
const log = stdLog(`[${TableName}] [UPDATE FIELD finishedOn]:`);
log("Start processing…");
const region = getEnvironment().region;
const profile = getAwsProfile();
const client = new DynamoDBClient({
region,
credentials: fromIni({ profile }),
});
const existingRecords = await client.send(
new ScanCommand({
TableName,
FilterExpression: "attribute_not_exists(#f)",
ExpressionAttributeNames: { "#f": "finishedOn" },
Limit: 5000,
})
);
log(
"Relevant records:",
existingRecords.Items.map(({ id }) => id.S)
);
await Promise.all(
existingRecords.Items.map(async ({ id, createdAt }) => {
log("Processing record with ID:", id.S, "and createdAt:", createdAt.S);
const params = {
TableName,
Key: {
id,
},
UpdateExpression: `SET finishedOn = :newValue`,
ExpressionAttributeValues: {
":newValue": createdAt,
},
ReturnValues: "UPDATED_NEW",
};
const response = await client.send(new UpdateItemCommand(params));
log(
"Response:",
"StatusCode",
response.$metadata.httpStatusCode,
"Attributes",
response.Attributes.finishedOn
);
})
);
};

module.exports = {
fillFinishedOn,
};
65 changes: 65 additions & 0 deletions scripts/helpers/fill-learning-person-status.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
const {
ScanCommand,
UpdateItemCommand,
DynamoDBClient,
} = require("@aws-sdk/client-dynamodb");
const { stdLog } = require("./filter-and-mapping");
const { getTable, getEnvironment } = require("../import-data/environments");
const { getAwsProfile } = require("./get-aws-profile");
const { fromIni } = require("@aws-sdk/credential-providers");

const fillLearningPersonStatus = async () => {
const TableName = getTable("PersonLearning");
const log = stdLog(`[${TableName}] [UPDATE FIELD status]:`);
log("Start processing…");
const region = getEnvironment().region;
const profile = getAwsProfile();
const client = new DynamoDBClient({
region,
credentials: fromIni({ profile }),
});
const existingRecords = await client.send(
new ScanCommand({
TableName,
FilterExpression: "attribute_not_exists(#f)",
ExpressionAttributeNames: { "#f": "status" },
Limit: 5000,
})
);
log(
"Relevant records:",
existingRecords.Items.map(({ id }) => id.S)
);
await Promise.all(
existingRecords.Items.map(async ({ id, createdAt }) => {
log("Processing record with ID:", id.S, "and createdAt:", createdAt.S);
const params = {
TableName,
Key: {
id,
},
UpdateExpression: `SET #status = :newValue`,
ExpressionAttributeNames: {
"#status": "status",
},
ExpressionAttributeValues: {
":newValue": { S: "new" },
},
ReturnValues: "UPDATED_NEW",
};
log("Update params:", params);
const response = await client.send(new UpdateItemCommand(params));
log(
"Response:",
"StatusCode",
response.$metadata.httpStatusCode,
"Attributes",
response.Attributes.status
);
})
);
};

module.exports = {
fillLearningPersonStatus,
};
62 changes: 5 additions & 57 deletions scripts/start-import.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
const {
ScanCommand,
UpdateItemCommand,
DynamoDBClient,
} = require("@aws-sdk/client-dynamodb");
const {
mapMeetingIdForActivity,
logTables,
stdLog,
} = require("./helpers/filter-and-mapping");
const {
importHandler,
createManyToManyTable,
createRelation,
createDetailRecord,
} = require("./helpers/import-handler");
const { getTable, getEnvironment } = require("./import-data/environments");
const { getAwsProfile } = require("./helpers/get-aws-profile");
const { fromIni } = require("@aws-sdk/credential-providers");
const { fillFinishedOn } = require("./helpers/fill-finished-on");
const {
fillLearningPersonStatus,
} = require("./helpers/fill-learning-person-status");

const importData = async () => {
// Books of the Bible
Expand Down Expand Up @@ -208,54 +203,6 @@ const importData = async () => {
);
};

const fillFinishedOn = async () => {
const TableName = getTable("Activity");
const log = stdLog(`[${TableName}] [UPDATE FIELD finishedOn]:`);
log("Start processing…");
const region = getEnvironment().region;
const profile = getAwsProfile();
const client = new DynamoDBClient({
region,
credentials: fromIni({ profile }),
});
const existingRecords = await client.send(
new ScanCommand({
TableName,
FilterExpression: "attribute_not_exists(#f)",
ExpressionAttributeNames: { "#f": "finishedOn" },
Limit: 5000,
})
);
log(
"Relevant records:",
existingRecords.Items.map(({ id }) => id.S)
);
await Promise.all(
existingRecords.Items.map(async ({ id, createdAt }) => {
log("Processing record with ID:", id.S, "and createdAt:", createdAt.S);
const params = {
TableName,
Key: {
id,
},
UpdateExpression: `SET finishedOn = :newValue`,
ExpressionAttributeValues: {
":newValue": createdAt,
},
ReturnValues: "UPDATED_NEW",
};
const response = await client.send(new UpdateItemCommand(params));
log(
"Response:",
"StatusCode",
response.$metadata.httpStatusCode,
"Attributes",
response.Attributes.finishedOn
);
})
);
};

/**
* Importing data requires the files mentioned in the importData function to exist.
* Like:
Expand All @@ -275,3 +222,4 @@ const fillFinishedOn = async () => {
// importData();
// logTables();
// fillFinishedOn();
// fillLearningPersonStatus();

0 comments on commit e67efcb

Please sign in to comment.