From 0a22bc1b8fa7d8731b0f4f036af4954c5b1a4840 Mon Sep 17 00:00:00 2001 From: ewandor Date: Thu, 1 May 2025 22:42:40 +0200 Subject: [PATCH] Implementing Contract creation on draft page --- api/rpk-api/firm/contract/schemas.py | 5 +- gui/rpk-gui/package-lock.json | 1 + gui/rpk-gui/package.json | 1 + gui/rpk-gui/src/pages/firm/ContractRoutes.tsx | 8 +-- gui/rpk-gui/src/pages/firm/DraftRoutes.tsx | 64 ++++++++++++++++++- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/api/rpk-api/firm/contract/schemas.py b/api/rpk-api/firm/contract/schemas.py index 2666d90..ce5f7e6 100644 --- a/api/rpk-api/firm/contract/schemas.py +++ b/api/rpk-api/firm/contract/schemas.py @@ -1,13 +1,14 @@ import datetime from typing import List +from beanie import PydanticObjectId from pydantic import BaseModel, Field from firm.contract.models import ContractDraft, DraftProvision, DraftParty, Contract from firm.entity.models import Entity from firm.core.schemas import Writer, Reader -from firm.core.models import DictionaryEntry +from firm.core.models import DictionaryEntry, ForeignKey class ContractDraftRead(Reader, ContractDraft): @@ -68,7 +69,7 @@ class ContractRead(Reader, Contract): class ContractCreate(Writer): date: datetime.date location: str - draft_id: str + draft_id: PydanticObjectId = ForeignKey(resource="contracts/drafts", schema="ContractDraft") class ContractInit(BaseModel): date: datetime.date diff --git a/gui/rpk-gui/package-lock.json b/gui/rpk-gui/package-lock.json index 4c5ee13..990ce35 100644 --- a/gui/rpk-gui/package-lock.json +++ b/gui/rpk-gui/package-lock.json @@ -35,6 +35,7 @@ "@tiptap/extension-underline": "^2.11.7", "@tiptap/react": "^2.11.7", "@tiptap/starter-kit": "^2.11.7", + "dayjs": "^1.11.13", "i18next": "^25.0.1", "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", diff --git a/gui/rpk-gui/package.json b/gui/rpk-gui/package.json index a8fe0e1..75cf051 100644 --- a/gui/rpk-gui/package.json +++ b/gui/rpk-gui/package.json @@ -31,6 +31,7 @@ "@tiptap/extension-underline": "^2.11.7", "@tiptap/react": "^2.11.7", "@tiptap/starter-kit": "^2.11.7", + "dayjs": "^1.11.13", "i18next": "^25.0.1", "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", diff --git a/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx b/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx index 3210f36..2c0e867 100644 --- a/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx +++ b/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx @@ -1,9 +1,8 @@ import { Route, Routes } from "react-router"; import List from "./base-page/List"; import Edit from "./base-page/Edit"; -import New from "./base-page/New"; -type Contract = { +export type Contract = { id: string, label: string } @@ -13,7 +12,6 @@ export const ContractRoutes = () => { } /> } /> - } /> ); } @@ -28,7 +26,3 @@ const ListContract = () => { const EditContract = () => { return resource={`contracts`} schemaName={"Contract"} /> } - -const CreateContract = () => { - return resource={`contracts`} schemaName={"Contract"} /> -} diff --git a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx index 07255af..58ae011 100644 --- a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx +++ b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx @@ -1,7 +1,7 @@ -import { Route, Routes } from "react-router"; +import { Navigate, Route, Routes, useParams } from "react-router"; import { CircularProgress } from "@mui/material"; import React, { useContext, useState } from "react"; -import { useOne } from "@refinedev/core"; +import { useOne, useTranslation } from "@refinedev/core"; import { BaseForm } from "../../lib/crud/components/base-form"; import { ForeignKeyReference, ForeignKeySchema } from "../../lib/crud/components/widgets/foreign-key"; @@ -9,6 +9,8 @@ import { FirmContext } from "../../contexts/FirmContext"; import List from "./base-page/List"; import Edit from "./base-page/Edit"; import New from "./base-page/New"; +import { Contract } from "./ContractRoutes"; +import dayjs from "dayjs"; type Draft = { id: string, @@ -33,7 +35,63 @@ const ListDraft = () => { } const EditDraft = () => { - return resource={`contracts/drafts`} schemaName={"ContractDraft"} /> + const { currentFirm } = useContext(FirmContext); + const { record_id } = useParams(); + const resourceBasePath = `firm/${currentFirm.instance}/${currentFirm.firm}` + + const { data, isLoading } = useOne({ + resource: `${resourceBasePath}/contracts/drafts`, + id: record_id + }) + + if (isLoading) { + return + } + + if (!data?.data) { + return + } + + const draft = data?.data + const readOnly = draft.status === "published"; + + const uiSchema = { + "ui:readonly": readOnly + } + + return ( + <> + resource={"contracts/drafts"} schemaName={"ContractDraft"} uiSchema={uiSchema} /> + + + ) +} + +const ContractCreate = (props: { draft: any}) => { + const { translate: t } = useTranslation(); + const { draft } = props; + + if (draft.status === "published") { + return

{t("resource.draft.already_published") }

+ } + if (draft.status === "in_progress") { + return ( + <> +

{ t("resource.draft.todo") + ":" }

+
    { draft.todo.map((item: any) =>
  • { item }
  • ) }
+ + ) + } + return + resource={"contracts"} + schemaName={"Contract"} + defaultValue={{ + date: dayjs().format("YYYY-MM-DD"), + location: "Los Santos, SA", + draft_id: draft.id + }} + uiSchema={{ draft_id: { 'ui:widget': 'hidden' } }} + /> } type ForeignKeySubSchema = ForeignKeySchema & {