Adding contracts and provisions templates
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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"], )
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
5
back/app/template/routes_provision.py
Normal file
5
back/app/template/routes_provision.py
Normal 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)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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: () =>
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 {}
|
||||||
27
front/app/src/app/views/templates/templates.module.ts
Normal file
27
front/app/src/app/views/templates/templates.module.ts
Normal 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 {
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user