Fix: Employee and Account showed [object Object] in Department instead of the department name.
This is due to enabling strict mode in Typescript and changing the list department from string to object. But the html was not updated.
This commit is contained in:
@ -1,7 +1,8 @@
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List, Optional
|
from decimal import Decimal
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import brewman.schemas.master as schemas
|
import brewman.schemas.master as schemas
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ def save(
|
|||||||
data: schemas.AccountIn,
|
data: schemas.AccountIn,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["accounts"]),
|
user: UserToken = Security(get_user, scopes=["accounts"]),
|
||||||
):
|
) -> schemas.Account:
|
||||||
try:
|
try:
|
||||||
item = Account(
|
item = Account(
|
||||||
name=data.name,
|
name=data.name,
|
||||||
@ -63,7 +64,7 @@ def update(
|
|||||||
data: schemas.AccountIn,
|
data: schemas.AccountIn,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["accounts"]),
|
user: UserToken = Security(get_user, scopes=["accounts"]),
|
||||||
):
|
) -> schemas.Account:
|
||||||
try:
|
try:
|
||||||
item: Account = db.query(Account).filter(Account.id == id_).first()
|
item: Account = db.query(Account).filter(Account.id == id_).first()
|
||||||
if item.is_fixture:
|
if item.is_fixture:
|
||||||
@ -92,18 +93,18 @@ def update(
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/{id_}")
|
@router.delete("/{id_}", response_model=schemas.AccountIn)
|
||||||
def delete(
|
def delete(
|
||||||
id_: uuid.UUID,
|
id_: uuid.UUID,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["accounts"]),
|
user: UserToken = Security(get_user, scopes=["accounts"]),
|
||||||
):
|
) -> schemas.AccountIn:
|
||||||
account: Account = db.query(Account).filter(Account.id == id_).first()
|
account: Account = db.query(Account).filter(Account.id == id_).first()
|
||||||
can_delete, reason = account.can_delete("advanced-delete" in user.permissions)
|
can_delete, reason = account.can_delete("advanced-delete" in user.permissions)
|
||||||
if can_delete:
|
if can_delete:
|
||||||
delete_with_data(account, db)
|
delete_with_data(account, db)
|
||||||
db.commit()
|
db.commit()
|
||||||
return account_info(None)
|
return account_blank()
|
||||||
else:
|
else:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@ -112,30 +113,18 @@ def delete(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get("")
|
@router.get("", response_model=schemas.AccountIn)
|
||||||
def show_blank(
|
def show_blank(
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["accounts"]),
|
user: UserToken = Security(get_user, scopes=["accounts"]),
|
||||||
):
|
) -> schemas.AccountIn:
|
||||||
return account_info(None)
|
return account_blank()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/list")
|
@router.get("/list", response_model=List[schemas.Account])
|
||||||
async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
|
async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)) -> List[schemas.Account]:
|
||||||
return [
|
return [
|
||||||
{
|
account_info(item)
|
||||||
"id": item.id,
|
|
||||||
"name": item.name,
|
|
||||||
"type": item.type_object.name,
|
|
||||||
"isActive": item.is_active,
|
|
||||||
"isReconcilable": item.is_reconcilable,
|
|
||||||
"isStarred": item.is_starred,
|
|
||||||
"costCentre": {
|
|
||||||
"id": item.cost_centre_id,
|
|
||||||
"name": item.cost_centre.name,
|
|
||||||
},
|
|
||||||
"isFixture": item.is_fixture,
|
|
||||||
}
|
|
||||||
for item in db.query(Account).order_by(Account.type).order_by(Account.name).order_by(Account.code).all()
|
for item in db.query(Account).order_by(Account.type).order_by(Account.name).order_by(Account.code).all()
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -170,17 +159,17 @@ async def show_balance(
|
|||||||
return {"date": balance(id_, date, db), "total": balance(id_, None, db)}
|
return {"date": balance(id_, date, db), "total": balance(id_, None, db)}
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{id_}")
|
@router.get("/{id_}", response_model=schemas.Account)
|
||||||
def show_id(
|
def show_id(
|
||||||
id_: uuid.UUID,
|
id_: uuid.UUID,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["accounts"]),
|
user: UserToken = Security(get_user, scopes=["accounts"]),
|
||||||
):
|
) -> schemas.Account:
|
||||||
item: Account = db.query(Account).filter(Account.id == id_).first()
|
item: Account = db.query(Account).filter(Account.id == id_).first()
|
||||||
return account_info(item)
|
return account_info(item)
|
||||||
|
|
||||||
|
|
||||||
def balance(id_: uuid.UUID, date, db: Session):
|
def balance(id_: uuid.UUID, date, db: Session) -> Decimal:
|
||||||
account = db.query(AccountBase).filter(AccountBase.id == id_).first()
|
account = db.query(AccountBase).filter(AccountBase.id == id_).first()
|
||||||
if not account.type_object.balance_sheet:
|
if not account.type_object.balance_sheet:
|
||||||
return 0
|
return 0
|
||||||
@ -193,31 +182,32 @@ def balance(id_: uuid.UUID, date, db: Session):
|
|||||||
return 0 if bal is None else bal
|
return 0 if bal is None else bal
|
||||||
|
|
||||||
|
|
||||||
def account_info(item: Optional[Account]):
|
def account_info(item: Account) -> schemas.Account:
|
||||||
if item is None:
|
return schemas.Account(
|
||||||
return {
|
id=item.id,
|
||||||
"code": "(Auto)",
|
code=item.code,
|
||||||
"type": AccountType.by_name("Creditors").id,
|
name=item.name,
|
||||||
"isActive": True,
|
type=item.type,
|
||||||
"isReconcilable": False,
|
isActive=item.is_active,
|
||||||
"isStarred": False,
|
isReconcilable=item.is_reconcilable,
|
||||||
"costCentre": CostCentre.overall(),
|
isStarred=item.is_starred,
|
||||||
}
|
isFixture=item.is_fixture,
|
||||||
else:
|
costCentre=schemas.CostCentreLink(
|
||||||
return {
|
id=item.cost_centre_id,
|
||||||
"id": item.id,
|
name=item.cost_centre.name,
|
||||||
"code": item.code,
|
),
|
||||||
"name": item.name,
|
)
|
||||||
"type": item.type,
|
|
||||||
"isActive": item.is_active,
|
|
||||||
"isReconcilable": item.is_reconcilable,
|
def account_blank() -> schemas.AccountIn:
|
||||||
"isStarred": item.is_starred,
|
return schemas.AccountIn(
|
||||||
"isFixture": item.is_fixture,
|
name="",
|
||||||
"costCentre": {
|
type=AccountType.by_name("Creditors").id,
|
||||||
"id": item.cost_centre_id,
|
isActive=True,
|
||||||
"name": item.cost_centre.name,
|
isReconcilable=False,
|
||||||
},
|
isStarred=False,
|
||||||
}
|
costCentre=CostCentre.overall(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def delete_with_data(account: Account, db: Session):
|
def delete_with_data(account: Account, db: Session):
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
import uuid
|
import uuid
|
||||||
|
from datetime import datetime
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import brewman.schemas.master as schemas
|
import brewman.schemas.employee as schemas
|
||||||
|
import brewman.schemas.master as master_schemas
|
||||||
|
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Security, status
|
from fastapi import APIRouter, Depends, HTTPException, Security, status
|
||||||
from sqlalchemy import desc
|
from sqlalchemy import desc
|
||||||
@ -31,7 +34,7 @@ def save(
|
|||||||
data: schemas.EmployeeIn,
|
data: schemas.EmployeeIn,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["employees"]),
|
user: UserToken = Security(get_user, scopes=["employees"]),
|
||||||
):
|
) -> schemas.Employee:
|
||||||
try:
|
try:
|
||||||
item = Employee(
|
item = Employee(
|
||||||
name=data.name,
|
name=data.name,
|
||||||
@ -45,7 +48,7 @@ def save(
|
|||||||
leaving_date=None if data.is_active else data.leaving_date,
|
leaving_date=None if data.is_active else data.leaving_date,
|
||||||
).create(db)
|
).create(db)
|
||||||
db.commit()
|
db.commit()
|
||||||
return employee_info(item.id, db)
|
return employee_info(item)
|
||||||
except SQLAlchemyError as e:
|
except SQLAlchemyError as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@ -63,7 +66,7 @@ def update(
|
|||||||
data: schemas.EmployeeIn,
|
data: schemas.EmployeeIn,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["employees"]),
|
user: UserToken = Security(get_user, scopes=["employees"]),
|
||||||
):
|
) -> schemas.Employee:
|
||||||
try:
|
try:
|
||||||
item: Employee = db.query(Employee).filter(Employee.id == id_).first()
|
item: Employee = db.query(Employee).filter(Employee.id == id_).first()
|
||||||
if item.is_fixture:
|
if item.is_fixture:
|
||||||
@ -81,7 +84,7 @@ def update(
|
|||||||
item.is_active = data.is_active
|
item.is_active = data.is_active
|
||||||
item.leaving_date = data.leaving_date
|
item.leaving_date = data.leaving_date
|
||||||
db.commit()
|
db.commit()
|
||||||
return employee_info(item.id, db)
|
return employee_info(item)
|
||||||
except SQLAlchemyError as e:
|
except SQLAlchemyError as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@ -93,18 +96,18 @@ def update(
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/{id_}")
|
@router.delete("/{id_}", response_model=schemas.EmployeeBlank)
|
||||||
def delete(
|
def delete(
|
||||||
id_: uuid.UUID,
|
id_: uuid.UUID,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["employees"]),
|
user: UserToken = Security(get_user, scopes=["employees"]),
|
||||||
):
|
) -> schemas.EmployeeBlank:
|
||||||
employee: Employee = db.query(Employee).filter(Employee.id == id_).first()
|
employee: Employee = db.query(Employee).filter(Employee.id == id_).first()
|
||||||
can_delete, reason = employee.can_delete("advanced-delete" in user.permissions)
|
can_delete, reason = employee.can_delete("advanced-delete" in user.permissions)
|
||||||
if can_delete:
|
if can_delete:
|
||||||
delete_with_data(employee, db)
|
delete_with_data(employee, db)
|
||||||
db.commit()
|
db.commit()
|
||||||
return employee_info(None, db)
|
return employee_blank()
|
||||||
else:
|
else:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@ -113,33 +116,18 @@ def delete(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get("")
|
@router.get("", response_model=schemas.EmployeeBlank)
|
||||||
def show_blank(
|
def show_blank(
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["employees"]),
|
user: UserToken = Security(get_user, scopes=["employees"]),
|
||||||
):
|
) -> schemas.EmployeeBlank:
|
||||||
return employee_info(None, db)
|
return employee_blank()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/list")
|
@router.get("/list", response_model=List[schemas.Employee])
|
||||||
async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
|
async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
|
||||||
return [
|
return [
|
||||||
{
|
employee_info(item)
|
||||||
"id": item.id,
|
|
||||||
"code": item.code,
|
|
||||||
"name": item.name,
|
|
||||||
"designation": item.designation,
|
|
||||||
"salary": item.salary,
|
|
||||||
"points": item.points,
|
|
||||||
"isActive": item.is_active,
|
|
||||||
"costCentre": {
|
|
||||||
"id": item.cost_centre_id,
|
|
||||||
"name": item.cost_centre.name,
|
|
||||||
},
|
|
||||||
"joiningDate": item.joining_date.strftime("%d-%b-%Y"),
|
|
||||||
"leavingDate": "" if item.is_active else item.leaving_date.strftime("%d-%b-%Y"),
|
|
||||||
"isStarred": item.is_starred,
|
|
||||||
}
|
|
||||||
for item in db.query(Employee)
|
for item in db.query(Employee)
|
||||||
.order_by(desc(Employee.is_active))
|
.order_by(desc(Employee.is_active))
|
||||||
.order_by(Account.cost_centre_id)
|
.order_by(Account.cost_centre_id)
|
||||||
@ -174,51 +162,52 @@ async def show_term(
|
|||||||
return list_
|
return list_
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{id_}")
|
@router.get("/{id_}", response_model=schemas.Employee)
|
||||||
def show_id(
|
def show_id(
|
||||||
id_: uuid.UUID,
|
id_: uuid.UUID,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
user: UserToken = Security(get_user, scopes=["employees"]),
|
user: UserToken = Security(get_user, scopes=["employees"]),
|
||||||
):
|
) -> schemas.Employee:
|
||||||
return employee_info(id_, db)
|
item: Employee = db.query(Employee).filter(Employee.id == id_).first()
|
||||||
|
return employee_info(item)
|
||||||
|
|
||||||
|
|
||||||
def employee_info(id_, db):
|
def employee_info(employee: Employee) -> schemas.Employee:
|
||||||
if id_ is None:
|
employee = schemas.Employee(
|
||||||
employee = {
|
id=employee.id,
|
||||||
"code": "(Auto)",
|
code=employee.code,
|
||||||
"isStarred": False,
|
name=employee.name,
|
||||||
"isActive": True,
|
isActive=employee.is_active,
|
||||||
"costCentre": CostCentre.overall(),
|
isStarred=employee.is_starred,
|
||||||
}
|
designation=employee.designation,
|
||||||
else:
|
salary=employee.salary,
|
||||||
employee = db.query(Employee).filter(Employee.id == id_).first()
|
points=employee.points,
|
||||||
if employee is None:
|
joiningDate=employee.joining_date,
|
||||||
raise HTTPException(
|
leavingDate=None if employee.is_active else employee.leaving_date,
|
||||||
status_code=status.HTTP_404_NOT_FOUND,
|
costCentre=master_schemas.CostCentreLink(
|
||||||
detail="Employee not found",
|
id=employee.cost_centre_id,
|
||||||
)
|
name=employee.cost_centre.name,
|
||||||
employee = {
|
),
|
||||||
"id": employee.id,
|
isFixture=employee.is_fixture,
|
||||||
"code": employee.code,
|
)
|
||||||
"name": employee.name,
|
|
||||||
"isActive": employee.is_active,
|
|
||||||
"isStarred": employee.is_starred,
|
|
||||||
"designation": employee.designation,
|
|
||||||
"salary": employee.salary,
|
|
||||||
"points": employee.points,
|
|
||||||
"joiningDate": employee.joining_date.strftime("%d-%b-%Y"),
|
|
||||||
"leavingDate": None if employee.is_active else employee.leaving_date.strftime("%d-%b-%Y"),
|
|
||||||
"costCentre": {
|
|
||||||
"id": employee.cost_centre_id,
|
|
||||||
"name": employee.cost_centre.name,
|
|
||||||
},
|
|
||||||
"isFixture": employee.is_fixture,
|
|
||||||
}
|
|
||||||
return employee
|
return employee
|
||||||
|
|
||||||
|
|
||||||
def delete_with_data(employee, db):
|
def employee_blank() -> schemas.EmployeeBlank:
|
||||||
|
return schemas.EmployeeBlank(
|
||||||
|
name="",
|
||||||
|
isStarred=False,
|
||||||
|
isActive=True,
|
||||||
|
costCentre=CostCentre.overall(),
|
||||||
|
designation="",
|
||||||
|
salary=0,
|
||||||
|
points=0,
|
||||||
|
joiningDate=datetime.today(),
|
||||||
|
leavingDate=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def delete_with_data(employee: Employee, db: Session):
|
||||||
suspense_account = db.query(Account).filter(Account.id == Account.suspense()).first()
|
suspense_account = db.query(Account).filter(Account.id == Account.suspense()).first()
|
||||||
query = (
|
query = (
|
||||||
db.query(Voucher)
|
db.query(Voucher)
|
||||||
|
|||||||
59
brewman/brewman/schemas/employee.py
Normal file
59
brewman/brewman/schemas/employee.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import uuid
|
||||||
|
from datetime import date, datetime
|
||||||
|
from decimal import Decimal
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from pydantic import Field, validator
|
||||||
|
|
||||||
|
from brewman.schemas import to_camel
|
||||||
|
from brewman.schemas.master import AccountBase
|
||||||
|
|
||||||
|
|
||||||
|
class EmployeeIn(AccountBase):
|
||||||
|
designation: str
|
||||||
|
salary: int = Field(ge=0)
|
||||||
|
points: Decimal = Field(ge=0, lt=1000, multiple_of=0.01)
|
||||||
|
joining_date: date
|
||||||
|
leaving_date: Optional[date]
|
||||||
|
|
||||||
|
@validator("joining_date", pre=True)
|
||||||
|
def parse_joining_date(cls, value):
|
||||||
|
if isinstance(value, date):
|
||||||
|
return value
|
||||||
|
return datetime.strptime(value, "%d-%b-%Y").date()
|
||||||
|
|
||||||
|
@validator("leaving_date", pre=True)
|
||||||
|
def parse_leaving_date(cls, value):
|
||||||
|
if isinstance(value, date):
|
||||||
|
return value
|
||||||
|
if value is None:
|
||||||
|
return value
|
||||||
|
return datetime.strptime(value, "%d-%b-%Y").date()
|
||||||
|
|
||||||
|
@validator("leaving_date")
|
||||||
|
def leaving_date_more_than_joining_date(cls, v, values, **kwargs):
|
||||||
|
if values["is_active"]:
|
||||||
|
return None
|
||||||
|
if v < values["joining_date"]:
|
||||||
|
raise ValueError("Leaving Date cannot be less than Joining Date")
|
||||||
|
return v
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
anystr_strip_whitespace = True
|
||||||
|
alias_generator = to_camel
|
||||||
|
json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M"), date: lambda v: v.strftime("%d-%b-%Y")}
|
||||||
|
|
||||||
|
|
||||||
|
class Employee(EmployeeIn):
|
||||||
|
id_: uuid.UUID
|
||||||
|
code: int
|
||||||
|
is_fixture: bool
|
||||||
|
|
||||||
|
|
||||||
|
class EmployeeBlank(EmployeeIn):
|
||||||
|
name: str
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
anystr_strip_whitespace = True
|
||||||
|
alias_generator = to_camel
|
||||||
|
json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M"), date: lambda v: v.strftime("%d-%b-%Y")}
|
||||||
@ -150,39 +150,6 @@ class Account(AccountIn):
|
|||||||
is_fixture: bool
|
is_fixture: bool
|
||||||
|
|
||||||
|
|
||||||
class EmployeeIn(AccountBase):
|
|
||||||
designation: str
|
|
||||||
salary: int = Field(ge=0)
|
|
||||||
points: Decimal = Field(ge=0, lt=1000, multiple_of=0.01)
|
|
||||||
joining_date: date
|
|
||||||
leaving_date: Optional[date]
|
|
||||||
|
|
||||||
@validator("joining_date", pre=True)
|
|
||||||
def parse_joining_date(cls, value):
|
|
||||||
return datetime.strptime(value, "%d-%b-%Y").date()
|
|
||||||
|
|
||||||
@validator("leaving_date", pre=True)
|
|
||||||
def parse_leaving_date(cls, value):
|
|
||||||
if value is None or value == "":
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
return datetime.strptime(value, "%d-%b-%Y").date()
|
|
||||||
|
|
||||||
@validator("leaving_date")
|
|
||||||
def leaving_date_more_than_joining_date(cls, v, values, **kwargs):
|
|
||||||
if values["is_active"]:
|
|
||||||
return None
|
|
||||||
if v < values["joining_date"]:
|
|
||||||
raise ValueError("Leaving Date cannot be less than Joining Date")
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
class Employee(EmployeeIn):
|
|
||||||
id_: uuid.UUID
|
|
||||||
code: int
|
|
||||||
is_fixture: bool
|
|
||||||
|
|
||||||
|
|
||||||
class DbSetting(BaseModel):
|
class DbSetting(BaseModel):
|
||||||
id_: uuid.UUID
|
id_: uuid.UUID
|
||||||
name: str
|
name: str
|
||||||
|
|||||||
@ -60,7 +60,7 @@
|
|||||||
<!-- Cost Centre Column -->
|
<!-- Cost Centre Column -->
|
||||||
<ng-container matColumnDef="costCentre">
|
<ng-container matColumnDef="costCentre">
|
||||||
<mat-header-cell *matHeaderCellDef mat-sort-header>Cost Centre</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef mat-sort-header>Cost Centre</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let row">{{ row.costCentre }}</mat-cell>
|
<mat-cell *matCellDef="let row">{{ row.costCentre.name }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
|
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
|
||||||
|
|||||||
@ -69,7 +69,7 @@
|
|||||||
<!-- Department Column -->
|
<!-- Department Column -->
|
||||||
<ng-container matColumnDef="department">
|
<ng-container matColumnDef="department">
|
||||||
<mat-header-cell *matHeaderCellDef>Department</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>Department</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let row">{{ row.costCentre }}</mat-cell>
|
<mat-cell *matCellDef="let row">{{ row.costCentre.name }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- JoiningDate Column -->
|
<!-- JoiningDate Column -->
|
||||||
|
|||||||
Reference in New Issue
Block a user