Adding contracts and provisions templates

This commit is contained in:
2023-01-31 23:56:48 +01:00
parent c360878b5a
commit 35c37749f3
12 changed files with 302 additions and 54 deletions

View File

@@ -4,6 +4,7 @@ from beanie import init_beanie
from .user import User, AccessToken from .user import User, AccessToken
from .entity.models import Entity from .entity.models import Entity
from .template.models import ContractTemplate, ProvisionTemplate
from .order.models import Order from .order.models import Order
from .contract.models import Contract from .contract.models import Contract
@@ -16,5 +17,5 @@ async def init_db():
) )
await init_beanie(database=client.db_name, 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) allow_index_dropping=True)

View File

@@ -1,9 +1,9 @@
from fastapi import APIRouter from fastapi import APIRouter
from .routes_contract import router as contract_router 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 = APIRouter()
template_router.include_router(contract_router, prefix="/contract", tags=["template"], ) 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"], )

View File

@@ -1,34 +1,48 @@
from datetime import datetime
from typing import List from typing import List
from enum import Enum
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, validator
from beanie import Document
from ..core.models import CrudDocument, text_area
class ContractType(str, Enum):
individual = 'individual'
corporation = 'corporation'
class PartyTemplate(BaseModel): class PartyTemplate(BaseModel):
entity_id: str entity_id: str = Field(
foreignKey={
"reference": {
"resource": "entity",
"schema": "Entity",
}
},
default=""
)
part: str part: str
class ProvisionTemplate(CrudDocument):
name: str 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 name: str
body: str parties: List[PartyTemplate] = []
created_at: datetime = Field(default=datetime.utcnow(), nullable=False) provisions: List[ProvisionReference] = []
updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -1,32 +1,36 @@
import uuid
from datetime import datetime
from pydantic import BaseModel 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): class ContractTemplateRead(ContractTemplate):
pass pass
class ContractTemplateCreate(BaseModel): class ContractTemplateCreate(Writer):
name: str name: str
class ContractTemplateUpdate(BaseModel): class ContractTemplateUpdate(BaseModel):
name: str name: str
parties: List[PartyTemplate] = []
provisions: List[ProvisionReference] = []
class ClauseTemplateRead(ClauseTemplate): class ProvisionTemplateRead(ProvisionTemplate):
pass pass
class ClauseTemplateCreate(BaseModel): class ProvisionTemplateCreate(Writer):
name: str name: str
body: str title: str
body: str = text_area(size=8)
class ClauseTemplateUpdate(BaseModel): class ProvisionTemplateUpdate(BaseModel):
name: str name: str
title: str
body: str body: str

View File

@@ -30,6 +30,11 @@ const routes: Routes = [
loadChildren: () => loadChildren: () =>
import('./views/entities/entities.module').then((m) => m.EntitiesModule) import('./views/entities/entities.module').then((m) => m.EntitiesModule)
}, },
{
path: 'templates',
loadChildren: () =>
import('./views/templates/templates.module').then((m) => m.TemplatesModule)
},
{ {
path: 'theme', path: 'theme',
loadChildren: () => loadChildren: () =>

View File

@@ -10,6 +10,55 @@ export const navItems: INavData[] = [
text: 'NEW' 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, title: true,
name: 'Theme' name: 'Theme'
@@ -29,21 +78,6 @@ export const navItems: INavData[] = [
name: 'Components', name: 'Components',
title: true title: true
}, },
{
name: 'Entities',
url: '/entities',
iconComponent: { name: 'cil-cursor' },
children: [
{
name: 'List',
url: '/entities'
},
{
name: 'New',
url: '/entities/new'
},
]
},
{ {
name: 'Base', name: 'Base',
url: '/base', url: '/base',

View File

@@ -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: '<crud-list [resource]="this.resource" [schema]="this.schema"></crud-list>'
})
export class ContractTemplateListComponent extends BaseContractTemplateComponent {
}
@Component({
template: '<crud-card [resource]="this.resource" [schema]="this.schema" [field_customizer]="this.field_customizer"></crud-card>'
})
export class ContractTemplateNewComponent extends BaseContractTemplateComponent {
}
@Component({
template: '<crud-card [resource]="this.resource" [resource_id]="this.resource_id" [schema]="this.schema" [field_customizer]="this.field_customizer"></crud-card>'
})
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')
})
}
}

View File

@@ -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: '<crud-list [resource]="this.resource" [schema]="this.schema"></crud-list>'
})
export class ProvisionTemplateListComponent extends BaseProvisionTemplateComponent{
}
@Component({
template: '<crud-card [resource]="this.resource" [schema]="this.schema"></crud-card>'
})
export class ProvisionTemplateNewComponent extends BaseProvisionTemplateComponent {
}
@Component({
template: '<crud-card [resource]="this.resource" [resource_id]="this.resource_id" [schema]="this.schema"></crud-card>'
})
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')
})
}
}

View File

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

View File

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