From e67efcb3b9fda60400a216c151288c24337621f2 Mon Sep 17 00:00:00 2001 From: Carsten Koch Date: Thu, 19 Dec 2024 19:54:23 +0100 Subject: [PATCH] fix: updated the status field on PersonLearning to be not empty --- docs/releases/next.md | 15 +++-- scripts/helpers/fill-finished-on.js | 61 +++++++++++++++++ .../helpers/fill-learning-person-status.js | 65 +++++++++++++++++++ scripts/start-import.js | 62 ++---------------- 4 files changed, 139 insertions(+), 64 deletions(-) create mode 100644 scripts/helpers/fill-finished-on.js create mode 100644 scripts/helpers/fill-learning-person-status.js diff --git a/docs/releases/next.md b/docs/releases/next.md index 2e76899ec..5ed9a1593 100644 --- a/docs/releases/next.md +++ b/docs/releases/next.md @@ -18,11 +18,7 @@ ## 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 @@ -30,6 +26,7 @@ - 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 @@ -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 @@ -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 @@ -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 diff --git a/scripts/helpers/fill-finished-on.js b/scripts/helpers/fill-finished-on.js new file mode 100644 index 000000000..96d9512fb --- /dev/null +++ b/scripts/helpers/fill-finished-on.js @@ -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, +}; diff --git a/scripts/helpers/fill-learning-person-status.js b/scripts/helpers/fill-learning-person-status.js new file mode 100644 index 000000000..fa6ed0246 --- /dev/null +++ b/scripts/helpers/fill-learning-person-status.js @@ -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, +}; diff --git a/scripts/start-import.js b/scripts/start-import.js index 8fb82b75c..9c9062776 100644 --- a/scripts/start-import.js +++ b/scripts/start-import.js @@ -1,12 +1,6 @@ -const { - ScanCommand, - UpdateItemCommand, - DynamoDBClient, -} = require("@aws-sdk/client-dynamodb"); const { mapMeetingIdForActivity, logTables, - stdLog, } = require("./helpers/filter-and-mapping"); const { importHandler, @@ -14,9 +8,10 @@ const { 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 @@ -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: @@ -275,3 +222,4 @@ const fillFinishedOn = async () => { // importData(); // logTables(); // fillFinishedOn(); +// fillLearningPersonStatus();