From 35c37749f3ce495f164e4d6cb2288cdb84613fb3 Mon Sep 17 00:00:00 2001 From: ewandor Date: Tue, 31 Jan 2023 23:56:48 +0100 Subject: [PATCH] Adding contracts and provisions templates --- back/app/db.py | 3 +- back/app/template/__init__.py | 4 +- back/app/template/models.py | 58 ++++++++----- back/app/template/routes_clause.py | 5 -- back/app/template/routes_provision.py | 5 ++ back/app/template/schemas.py | 22 ++--- front/app/src/app/app-routing.module.ts | 5 ++ .../src/app/containers/default-layout/_nav.ts | 64 +++++++++++---- .../templates/contract-templates.component.ts | 44 ++++++++++ .../provision-templates.component.ts | 38 +++++++++ .../templates/templates-routing.module.ts | 81 +++++++++++++++++++ .../app/views/templates/templates.module.ts | 27 +++++++ 12 files changed, 302 insertions(+), 54 deletions(-) delete mode 100644 back/app/template/routes_clause.py create mode 100644 back/app/template/routes_provision.py create mode 100644 front/app/src/app/views/templates/contract-templates.component.ts create mode 100644 front/app/src/app/views/templates/provision-templates.component.ts create mode 100644 front/app/src/app/views/templates/templates-routing.module.ts create mode 100644 front/app/src/app/views/templates/templates.module.ts diff --git a/back/app/db.py b/back/app/db.py index 85e416e9..bdc7ee2d 100644 --- a/back/app/db.py +++ b/back/app/db.py @@ -4,6 +4,7 @@ from beanie import init_beanie from .user import User, AccessToken from .entity.models import Entity +from .template.models import ContractTemplate, ProvisionTemplate from .order.models import Order from .contract.models import Contract @@ -16,5 +17,5 @@ async def init_db(): ) await init_beanie(database=client.db_name, - document_models=[User, AccessToken, Entity, Order, Contract, ], + document_models=[User, AccessToken, Entity, ContractTemplate, ProvisionTemplate, Order, Contract, ], allow_index_dropping=True) diff --git a/back/app/template/__init__.py b/back/app/template/__init__.py index f103938c..35926ea9 100644 --- a/back/app/template/__init__.py +++ b/back/app/template/__init__.py @@ -1,9 +1,9 @@ from fastapi import APIRouter from .routes_contract import router as contract_router -from .routes_clause import router as clause_router +from .routes_provision import router as provision_router template_router = APIRouter() template_router.include_router(contract_router, prefix="/contract", tags=["template"], ) -template_router.include_router(clause_router, prefix="/clause", tags=["template"], ) +template_router.include_router(provision_router, prefix="/provision", tags=["template"], ) diff --git a/back/app/template/models.py b/back/app/template/models.py index 7f1621db..8eb9eb5a 100644 --- a/back/app/template/models.py +++ b/back/app/template/models.py @@ -1,34 +1,48 @@ -from datetime import datetime from typing import List -from enum import Enum -from pydantic import BaseModel, Field -from beanie import Document +from pydantic import BaseModel, Field, validator - -class ContractType(str, Enum): - individual = 'individual' - corporation = 'corporation' +from ..core.models import CrudDocument, text_area class PartyTemplate(BaseModel): - entity_id: str + entity_id: str = Field( + foreignKey={ + "reference": { + "resource": "entity", + "schema": "Entity", + } + }, + default="" + ) part: str + + +class ProvisionTemplate(CrudDocument): name: str - address: str + title: str + label: str = None + body: str = text_area(size=8) + + @validator("label", always=True) + def generate_label(cls, v, values, **kwargs): + return "{} - \"{}\"".format(values['name'], values['title']) + + class Settings(CrudDocument.Settings): + fulltext_search = ['name', 'title', 'body'] -class ClauseTemplate(Document): +class ProvisionReference(BaseModel): + provision_template_id: str = Field(foreignKey={ + "reference": { + "resource": "template/provision", + "schema": "ProvisionTemplate", + } + }) + + +class ContractTemplate(CrudDocument): name: str - body: str - created_at: datetime = Field(default=datetime.utcnow(), nullable=False) - updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) + parties: List[PartyTemplate] = [] + provisions: List[ProvisionReference] = [] - -class ContractTemplate(Document): - id: str - type: ContractType - parties: List[PartyTemplate] - clauses: List[ClauseTemplate] - created_at: datetime = Field(default=datetime.utcnow(), nullable=False) - updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) diff --git a/back/app/template/routes_clause.py b/back/app/template/routes_clause.py deleted file mode 100644 index b811dd9b..00000000 --- a/back/app/template/routes_clause.py +++ /dev/null @@ -1,5 +0,0 @@ -from ..core.routes import get_crud_router -from .models import ClauseTemplate -from .schemas import ClauseTemplateCreate, ClauseTemplateRead, ClauseTemplateUpdate - -router = get_crud_router(ClauseTemplate, ClauseTemplateCreate, ClauseTemplateRead, ClauseTemplateUpdate) diff --git a/back/app/template/routes_provision.py b/back/app/template/routes_provision.py new file mode 100644 index 00000000..6f18f262 --- /dev/null +++ b/back/app/template/routes_provision.py @@ -0,0 +1,5 @@ +from ..core.routes import get_crud_router +from .models import ProvisionTemplate +from .schemas import ProvisionTemplateCreate, ProvisionTemplateRead, ProvisionTemplateUpdate + +router = get_crud_router(ProvisionTemplate, ProvisionTemplateCreate, ProvisionTemplateRead, ProvisionTemplateUpdate) diff --git a/back/app/template/schemas.py b/back/app/template/schemas.py index 91fd5b49..860a1be2 100644 --- a/back/app/template/schemas.py +++ b/back/app/template/schemas.py @@ -1,32 +1,36 @@ -import uuid - -from datetime import datetime from pydantic import BaseModel +from typing import List -from .models import ContractTemplate, ClauseTemplate +from .models import ContractTemplate, ProvisionTemplate, PartyTemplate, ProvisionReference +from ..core.schemas import Writer +from ..core.models import text_area class ContractTemplateRead(ContractTemplate): pass -class ContractTemplateCreate(BaseModel): +class ContractTemplateCreate(Writer): name: str class ContractTemplateUpdate(BaseModel): name: str + parties: List[PartyTemplate] = [] + provisions: List[ProvisionReference] = [] -class ClauseTemplateRead(ClauseTemplate): +class ProvisionTemplateRead(ProvisionTemplate): pass -class ClauseTemplateCreate(BaseModel): +class ProvisionTemplateCreate(Writer): name: str - body: str + title: str + body: str = text_area(size=8) -class ClauseTemplateUpdate(BaseModel): +class ProvisionTemplateUpdate(BaseModel): name: str + title: str body: str diff --git a/front/app/src/app/app-routing.module.ts b/front/app/src/app/app-routing.module.ts index b2b4cf3a..f1d58657 100644 --- a/front/app/src/app/app-routing.module.ts +++ b/front/app/src/app/app-routing.module.ts @@ -30,6 +30,11 @@ const routes: Routes = [ loadChildren: () => import('./views/entities/entities.module').then((m) => m.EntitiesModule) }, + { + path: 'templates', + loadChildren: () => + import('./views/templates/templates.module').then((m) => m.TemplatesModule) + }, { path: 'theme', loadChildren: () => diff --git a/front/app/src/app/containers/default-layout/_nav.ts b/front/app/src/app/containers/default-layout/_nav.ts index 045f1125..3446d576 100644 --- a/front/app/src/app/containers/default-layout/_nav.ts +++ b/front/app/src/app/containers/default-layout/_nav.ts @@ -10,6 +10,55 @@ export const navItems: INavData[] = [ text: 'NEW' } }, + { + name: 'Entities', + url: '/entities', + iconComponent: { name: 'cil-cursor' }, + children: [ + { + name: 'List', + url: '/entities/list' + }, + { + name: 'New', + url: '/entities/new' + }, + ] + }, + { + name: 'Templates', + title: true + }, + { + name: 'Contract Templates', + url: '/templates/contracts', + iconComponent: { name: 'cil-cursor' }, + children: [ + { + name: 'List', + url: '/templates/contracts/list' + }, + { + name: 'New', + url: '/templates/contracts/new' + }, + ] + }, + { + name: 'Provision Templates', + url: '/templates/provisions', + iconComponent: { name: 'cil-cursor' }, + children: [ + { + name: 'List', + url: '/templates/provisions/list' + }, + { + name: 'New', + url: '/templates/provisions/new' + }, + ] + }, { title: true, name: 'Theme' @@ -29,21 +78,6 @@ export const navItems: INavData[] = [ name: 'Components', title: true }, - { - name: 'Entities', - url: '/entities', - iconComponent: { name: 'cil-cursor' }, - children: [ - { - name: 'List', - url: '/entities' - }, - { - name: 'New', - url: '/entities/new' - }, - ] - }, { name: 'Base', url: '/base', diff --git a/front/app/src/app/views/templates/contract-templates.component.ts b/front/app/src/app/views/templates/contract-templates.component.ts new file mode 100644 index 00000000..b3dd952c --- /dev/null +++ b/front/app/src/app/views/templates/contract-templates.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit, } from '@angular/core'; +import { ActivatedRoute, ParamMap } from '@angular/router'; +import { FieldCustomizer } from '@common/crud/card/card.component' + +export class Customizer extends FieldCustomizer { + override customizers = { + "provisions": { props: { width: "col-sm-12" }}, + } +} + +export class BaseContractTemplateComponent { + protected resource: string = "template/contract"; + protected schema: string = "ContractTemplate"; + protected field_customizer: FieldCustomizer = new Customizer(); +} + +@Component({ + template: '' +}) +export class ContractTemplateListComponent extends BaseContractTemplateComponent { +} + +@Component({ + template: '' +}) +export class ContractTemplateNewComponent extends BaseContractTemplateComponent { +} + +@Component({ + template: '' +}) +export class ContractTemplateCardComponent extends BaseContractTemplateComponent implements OnInit { + resource_id: string | null = null; + + constructor(private route: ActivatedRoute,) { + super(); + } + + ngOnInit(): void { + this.route.paramMap.subscribe((params: ParamMap) => { + this.resource_id = params.get('id') + }) + } +} diff --git a/front/app/src/app/views/templates/provision-templates.component.ts b/front/app/src/app/views/templates/provision-templates.component.ts new file mode 100644 index 00000000..aaf2d5a1 --- /dev/null +++ b/front/app/src/app/views/templates/provision-templates.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit, } from '@angular/core'; +import { ActivatedRoute, ParamMap } from '@angular/router'; + + +export class BaseProvisionTemplateComponent { + protected resource: string = "template/provision"; + protected schema: string = "ProvisionTemplate"; +} + +@Component({ + template: '' +}) +export class ProvisionTemplateListComponent extends BaseProvisionTemplateComponent{ +} + +@Component({ + template: '' +}) +export class ProvisionTemplateNewComponent extends BaseProvisionTemplateComponent { +} + +@Component({ + template: '' +}) +export class ProvisionTemplateCardComponent extends BaseProvisionTemplateComponent implements OnInit { + + resource_id: string | null = null; + + constructor(private route: ActivatedRoute,) { + super(); + } + + ngOnInit(): void { + this.route.paramMap.subscribe((params: ParamMap) => { + this.resource_id = params.get('id') + }) + } +} diff --git a/front/app/src/app/views/templates/templates-routing.module.ts b/front/app/src/app/views/templates/templates-routing.module.ts new file mode 100644 index 00000000..572cb0a3 --- /dev/null +++ b/front/app/src/app/views/templates/templates-routing.module.ts @@ -0,0 +1,81 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ContractTemplateCardComponent, ContractTemplateListComponent, ContractTemplateNewComponent} from "./contract-templates.component"; +import { ProvisionTemplateCardComponent, ProvisionTemplateListComponent, ProvisionTemplateNewComponent} from "./provision-templates.component"; + +const routes: Routes = [ + { + path: '', + data: { + title: 'Templates', + }, + children: [{ + path: 'contracts', + data: { + title: 'Contracts', + }, + children: [ + { path: '', redirectTo: 'list', pathMatch: 'full' }, + { + path: 'list', + component: ContractTemplateListComponent, + data: { + title: 'List', + }, + }, + { + path: 'new', + component: ContractTemplateNewComponent, + data: { + title: 'New', + }, + }, + { + path: ':id', + component: ContractTemplateCardComponent, + data: { + title: 'Card', + }, + }, + ], + }, + { + path: 'provisions', + data: { + title: 'Provisions', + }, + children: [ + { path: '', redirectTo: 'list', pathMatch: 'full' }, + { + path: 'list', + component: ProvisionTemplateListComponent, + data: { + title: 'List', + }, + }, + { + path: 'new', + component: ProvisionTemplateNewComponent, + data: { + title: 'New', + }, + }, + { + path: ':id', + component: ProvisionTemplateCardComponent, + data: { + title: 'Card', + }, + }, + ], + }, + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class TemplatesRoutingModule {} diff --git a/front/app/src/app/views/templates/templates.module.ts b/front/app/src/app/views/templates/templates.module.ts new file mode 100644 index 00000000..e54f1408 --- /dev/null +++ b/front/app/src/app/views/templates/templates.module.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { TemplatesRoutingModule } from './templates-routing.module'; +import { CrudModule } from '@common/crud/crud.module' +import { ContractTemplateCardComponent, ContractTemplateListComponent, ContractTemplateNewComponent} from "./contract-templates.component"; +import { ProvisionTemplateCardComponent, ProvisionTemplateListComponent, ProvisionTemplateNewComponent} from "./provision-templates.component"; + + + +@NgModule({ + imports: [ + CommonModule, + CrudModule, + TemplatesRoutingModule + ], + declarations: [ + ContractTemplateCardComponent, + ContractTemplateListComponent, + ContractTemplateNewComponent, + ProvisionTemplateCardComponent, + ProvisionTemplateListComponent, + ProvisionTemplateNewComponent, + ] +}) +export class TemplatesModule { +}