Commit e38f46f9 by Ooh-Ao

stock projectr

parent 0987f285
# myproject/controllers/project_equipment_controller.py
from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import selectinload
from uuid import UUID
from ..models.project_equipment import ProjectEquipment
from ..models.project import Project
from ..models.equipment import Equipment
from ..schemas.project_equipment_schema import (
ProjectEquipmentCreate
)
from ..schemas.project_equipment_schema import ProjectEquipmentCreate
# CREATE
async def create_project_equipment(db: AsyncSession, pe_in: ProjectEquipmentCreate):
# ถ้าต้องการตรวจสอบว่ามี project/equipment จริงหรือไม่
# project = await db.get(Project, pe_in.projectId)
# if not project:
# raise HTTPException(status_code=400, detail="Invalid projectId")
#
# equipment = await db.get(Equipment, pe_in.equipmentId)
# if not equipment:
# raise HTTPException(status_code=400, detail="Invalid equipmentId")
new_pe = ProjectEquipment(
projectId=pe_in.projectId,
equipmentId=pe_in.equipmentId,
quantity_in_project=pe_in.quantity_in_project
)
try:
db.add(new_pe)
await db.commit()
......@@ -39,15 +26,23 @@ async def create_project_equipment(db: AsyncSession, pe_in: ProjectEquipmentCrea
raise HTTPException(status_code=400, detail=str(e.orig))
return new_pe
# READ ALL
# READ ALL (แสดงข้อมูล Project และ Equipment แบบ nested)
async def get_all_project_equipments(db: AsyncSession):
result = await db.execute(select(ProjectEquipment))
stmt = select(ProjectEquipment).options(
selectinload(ProjectEquipment.project),
selectinload(ProjectEquipment.equipment)
)
result = await db.execute(stmt)
return result.scalars().all()
# READ ONE
# READ ONE (แสดงข้อมูล Project และ Equipment แบบ nested)
async def get_project_equipment_by_id(db: AsyncSession, pe_id: UUID):
pe_db = await db.get(ProjectEquipment, pe_id) # สั้นลง
return pe_db
stmt = select(ProjectEquipment).options(
selectinload(ProjectEquipment.project),
selectinload(ProjectEquipment.equipment)
).where(ProjectEquipment.peId == pe_id)
result = await db.execute(stmt)
return result.scalar_one_or_none()
# UPDATE
async def update_project_equipment(db: AsyncSession, pe_id: UUID, pe_in: ProjectEquipmentCreate):
......@@ -85,3 +80,11 @@ async def delete_project_equipment(db: AsyncSession, pe_id: UUID):
raise HTTPException(status_code=400, detail=str(e.orig))
return {"message": "ProjectEquipment deleted successfully"}
# GET Equipment by ProjectId
async def get_equipment_by_project_id(db: AsyncSession, project_id: UUID):
stmt = select(ProjectEquipment).options(
selectinload(ProjectEquipment.equipment)
).where(ProjectEquipment.projectId == project_id)
result = await db.execute(stmt)
return result.scalars().all()
......@@ -28,8 +28,8 @@ class ProjectEquipment(Base):
quantity_in_project = Column(Integer, nullable=False, default=0)
# Relationship กลับไปยัง Project และ Equipment
project = relationship("Project", back_populates="project_equipment")
equipment = relationship("Equipment", back_populates="project_equipment")
project = relationship("Project", back_populates="project_equipment", lazy="joined")
equipment = relationship("Equipment", lazy="joined")
# เชื่อมโยงกับ BorrowTransaction
borrow_transactions = relationship(
......
......@@ -11,7 +11,8 @@ from ..controllers.project_equipment_controller import (
get_all_project_equipments,
get_project_equipment_by_id,
update_project_equipment,
delete_project_equipment
delete_project_equipment,
get_equipment_by_project_id
)
from ..schemas.project_equipment_schema import (
ProjectEquipmentCreate,
......@@ -63,3 +64,12 @@ async def delete_pe_endpoint(
db: AsyncSession = Depends(get_db)
):
return await delete_project_equipment(db, peId)
@router.get("/project/{projectId}", response_model=List[ProjectEquipmentResponse])
async def get_equipment_for_project(
projectId: UUID,
db: AsyncSession = Depends(get_db)
):
pes = await get_equipment_by_project_id(db, projectId)
return pes
\ No newline at end of file
# myproject/schemas/project_equipment_schema.py
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from .project_schema import ProjectResponse
from .equipment_schema import EquipmentResponse
class ProjectEquipmentBase(BaseModel):
quantity_in_project: int = 0
......@@ -14,6 +16,8 @@ class ProjectEquipmentResponse(ProjectEquipmentBase):
peId: UUID
projectId: UUID
equipmentId: UUID
project: Optional[ProjectResponse] = None
equipment: Optional[EquipmentResponse] = None
class Config:
orm_mode = True
import { ProjectEquipmentService } from './../../services/project-equipments.service';
import { CommonModule } from "@angular/common";
import { ChangeDetectionStrategy, Component, ElementRef, ViewChild } from '@angular/core';
import { NgSelectModule } from "@ng-select/ng-select";
import { TranslateModule, TranslateService } from "@ngx-translate/core";
import { FormsModule } from "@angular/forms";
import swal from 'sweetalert';
import { MatPaginator, PageEvent } from "@angular/material/paginator";
import { SharedModule } from "../../../shared/shared.module";
import { UserProfileModel } from "../../models/user.model";
import { UserService } from "../../services/user.service";
import { TokenService } from "../../../shared/services/token.service";
import { FileUploadModule } from 'ng2-file-upload';
import { FileItem, FileUploader, ParsedResponseHeaders } from "ng2-file-upload";
import { environment } from "../../../../environments/environment";
import { EquipmentModel, EquipmentStockModel } from "../../models/equipments.model";
import { EquipmentService } from "../../services/equirement.service";
import { HttpClient } from "@angular/common/http";
import { ChangeDetectionStrategy, Component, ElementRef, ViewChild } from '@angular/core';
import { NgSelectModule } from "@ng-select/ng-select";
import { TranslateModule, TranslateService } from "@ngx-translate/core";
import { FormsModule } from "@angular/forms";
import swal from 'sweetalert';
import { MatPaginator, PageEvent } from "@angular/material/paginator";
import { SharedModule } from "../../../shared/shared.module";
import { UserProfileModel } from "../../models/user.model";
import { UserService } from "../../services/user.service";
import { TokenService } from "../../../shared/services/token.service";
import { FileUploadModule } from 'ng2-file-upload';
import { FileItem, FileUploader, ParsedResponseHeaders } from "ng2-file-upload";
import { environment } from "../../../../environments/environment";
import { EquipmentModel, EquipmentStockModel } from "../../models/equipments.model";
import { EquipmentService } from "../../services/equirement.service";
import { HttpClient } from "@angular/common/http";
import { ProjectEquipmentModel } from '../../models/project-equipments';
@Component({
selector: 'app-admin-project-equirement',
......@@ -38,8 +40,12 @@ export class AdminProjectEquirementComponent {
someSelected = false;
uploaderProfile: FileUploader | undefined;
uploadErrorMsg: string = "";
itemsList: EquipmentModel[] = []
filterList: EquipmentModel[] = []
itemsList: ProjectEquipmentModel[] = []
filterList: ProjectEquipmentModel[] = []
itemsListAll: EquipmentModel[] = []
filterListAll: EquipmentModel[] = []
selectModel: EquipmentModel = new EquipmentModel()
selectStock?: EquipmentStockModel
selectedItems = new Map<string, boolean>();
......@@ -60,7 +66,7 @@ export class AdminProjectEquirementComponent {
projectId = ""
_searchTerm = "";
isEdit = false;
constructor(private http: HttpClient, private eqService: EquipmentService, public translate: TranslateService, private tokenService: TokenService) {
constructor(private http: HttpClient, private eqService: EquipmentService, public translate: TranslateService, private tokenService: TokenService, private projectEquipmentService: ProjectEquipmentService) {
this.uploadConfig()
this.projectId = this.tokenService.getSelectCompany().projectId!;
}
......@@ -126,7 +132,19 @@ export class AdminProjectEquirementComponent {
}
ngOnInit(): void {
this.getCompanyEquirment()
this.getProjectEquirment()
}
getCompanyEquirment(){
this.eqService.getLists().subscribe(result => {
this.itemsListAll = result.filter(e => e.quantity > 0)
this.updatePagedItemsAll()
})
}
getProjectEquirment(){
this.projectEquipmentService.getLists(this.projectId).subscribe(result => {
this.itemsList = result
this.updatePagedItems()
})
......@@ -136,8 +154,8 @@ export class AdminProjectEquirementComponent {
this.pageIndex = 0;
return this.itemsList?.filter(
(x) =>
x.equipmentName.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.description?.toLowerCase().indexOf(v.toLowerCase()) !== -1
x.equipment.equipmentName.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.equipment.description?.toLowerCase().indexOf(v.toLowerCase()) !== -1
);
}
......@@ -247,6 +265,13 @@ export class AdminProjectEquirementComponent {
this.filterList = this.itemsList
}
updatePagedItemsAll() {
const startIndex = this.pageIndex * 10;
const endIndex = startIndex + 10;
// this.filterList = this.itemsList.slice(startIndex, endIndex);
this.filterListAll = this.itemsListAll
}
saveStock() {
console.log(this.selectStock)
swal({
......@@ -270,5 +295,40 @@ export class AdminProjectEquirementComponent {
}
stock(item: EquipmentModel) {
if (item.quantity > 0) {
swal({
title: "Are you sure?",
text: "คุณต้องการบันทึกหรือไม่",
icon: "warning",
dangerMode: false,
buttons: ["Cancel", "Confirm"],
})
.then((willDelete: any) => {
if (willDelete) {
this.projectEquipmentService.save({
"quantity_in_project": item.quantity,
"projectId": this.projectId,
"equipmentId": item.equipmentId
}).subscribe(result => {
this.selectStock = new EquipmentStockModel()
this.selectStock.quantity = item.quantity
this.selectStock.equipmentId = item.equipmentId
this.selectStock.created_by = this.tokenService.getUser().member.memberId
this.selectStock.action = "OUTBOUND",
this.selectStock.remark = "ย้ายเข้าสู่โครงการ " + this.tokenService.getSelectCompany().projectId + " (" + this.tokenService.getSelectCompany().project_code + ")"
this.eqService.stock(this.selectStock!).subscribe(result => {
swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success");
this.getProjectEquirment()
this.getCompanyEquirment()
this.childModal?.nativeElement.click()
})
})
}
});
}
}
}
import { TranslateService } from "@ngx-translate/core";
import { BaseModel } from "./base.model";
import { ProjectModel } from "./project.model";
import { EquipmentModel } from "./equipments.model";
export class ProjectEquipmentModel extends BaseModel {
pe_id: string;
project_id: string;
equipment_id?: string;
quantity_in_project: number;
created_at: string;
updated_at: string;
peId: string;
projectId: string;
equipmentId: string;
project: ProjectModel;
equipment: EquipmentModel;
constructor(data?: Partial<ProjectEquipmentModel>, translateService?: TranslateService) {
super(data, translateService);
this.pe_id = data?.pe_id ?? '';
this.project_id = data?.project_id ?? '';
this.equipment_id = data?.equipment_id ?? '';
this.peId = data?.peId ?? '';
this.projectId = data?.projectId ?? '';
this.equipmentId = data?.equipmentId ?? '';
this.quantity_in_project = data?.quantity_in_project ?? 0;
this.created_at = data?.created_at ?? new Date().toISOString();
this.updated_at = data?.updated_at ?? new Date().toISOString();
this.project = data?.project || new ProjectModel();
this.equipment = data?.equipment ? new EquipmentModel(data.equipment) : new EquipmentModel();
}
}
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import { map, tap, switchMap, filter, reduce } from "rxjs/operators";
import { ProjectEquipmentModel } from '../models/project-equipments';
import { environment } from '../../../environments/environment';
@Injectable({
providedIn: 'root'
})
export class ProjectEquipmentService {
apiBaseUrl = environment.baseUrl + "/project-equipments";
apiBaseUrl = environment.baseUrl + "/project-equipments";
constructor(
private http: HttpClient
) { }
......@@ -19,34 +19,30 @@ apiBaseUrl = environment.baseUrl + "/project-equipments";
.get<ProjectEquipmentModel>(this.apiBaseUrl + "/" + id)
.pipe(map((e) => new ProjectEquipmentModel(e)));
}
getLists() {
getLists(projectId: string) {
return this.http
.get<ProjectEquipmentModel[]>(this.apiBaseUrl)
.get<ProjectEquipmentModel[]>(this.apiBaseUrl+ "/project/" +projectId)
.pipe(
map((e) => e.map((e) => new ProjectEquipmentModel(e)))
);
}
save(body: ProjectEquipmentModel) {
return this.http.post<{
"message": string,
"user": ProjectEquipmentModel
}>(this.apiBaseUrl, new ProjectEquipmentModel(body));
save(body: any) {
return this.http.post<ProjectEquipmentModel>(this.apiBaseUrl, body);
}
update(body: ProjectEquipmentModel) {
return this.http.put<{
"message": string,
"user": ProjectEquipmentModel
}>(this.apiBaseUrl + "/" + body.equipment_id, new ProjectEquipmentModel(body));
}>(this.apiBaseUrl + "/" + body.equipmentId, new ProjectEquipmentModel(body));
}
delete(body: ProjectEquipmentModel) {
return this.http.delete<{
"message": string,
"user": ProjectEquipmentModel
}>(this.apiBaseUrl + "/" + body.equipment_id);
}>(this.apiBaseUrl + "/" + body.equipmentId);
}
......
......@@ -21,7 +21,7 @@ export class ProjectMemberService {
getLists(projectId: string) {
return this.http
.get<ProjectMemberModel[]>(this.apiBaseUrl)
.get<ProjectMemberModel[]>(this.apiBaseUrl+ "/project/" +projectId)
.pipe(
map((e) => e.map((e) => new ProjectMemberModel(e)))
);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment