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 {
+}