Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion controllers/WarehouseController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class WarehouseController extends Controller
private Workshop $workshopModel;
private Employee $employeeModel;
private Product $productModel;
private WorkshopAssignment $assignmentModel;
private ?array $visibleWarehouseIds = null;
private const WAREHOUSE_TYPE_KEYWORDS = [
'finished' => ['thành phẩm', 'thanh pham'],
Expand All @@ -26,6 +27,7 @@ public function __construct()
$this->workshopModel = new Workshop();
$this->employeeModel = new Employee();
$this->productModel = new Product();
$this->assignmentModel = new WorkshopAssignment();
}

public function index(): void
Expand Down Expand Up @@ -562,6 +564,10 @@ private function getAccessibleWorkshops(): array
if (!$employeeId) {
return [];
}
$managedIds = $this->assignmentModel->getWorkshopsManagedBy($employeeId);
if ($this->hasStorageWorkshop($managedIds)) {
return $this->workshopModel->all(200);
}
$workshopIds = $this->employeeModel->getWorkshopIdsForEmployee($employeeId);
return $this->workshopModel->findByIds($workshopIds);
}
Expand Down Expand Up @@ -620,7 +626,8 @@ private function resolveWarehouseIdsByWorkshop(array $user): ?array
return [];
}

if ($this->hasStorageWorkshop($workshopIds)) {
$managedIds = $this->assignmentModel->getWorkshopsManagedBy($employeeId);
if ($this->hasStorageWorkshop($managedIds)) {
return null;
}

Expand Down
32 changes: 31 additions & 1 deletion controllers/Warehouse_sheetController.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class Warehouse_sheetController extends Controller
private Warehouse $warehouseModel;
private Workshop $workshopModel;
private Employee $employeeModel;
private WorkshopAssignment $assignmentModel;
private array $warehouseCache = [];
private ?array $accessibleWarehouseIds = null;

Expand All @@ -36,14 +37,15 @@ class Warehouse_sheetController extends Controller

public function __construct()
{
$this->authorize(['VT_NHANVIEN_KHO', 'VT_KHO_TRUONG']);
$this->authorize(array_merge(['VT_NHANVIEN_KHO', 'VT_KHO_TRUONG'], $this->getWorkshopManagerRoles()));
$this->sheetModel = new InventorySheet();
$this->lotModel = new InventoryLot();
$this->sheetDetailModel = new InventorySheetDetail();
$this->productModel = new Product();
$this->warehouseModel = new Warehouse();
$this->workshopModel = new Workshop();
$this->employeeModel = new Employee();
$this->assignmentModel = new WorkshopAssignment();
}

public function index(): void
Expand Down Expand Up @@ -1248,9 +1250,37 @@ private function resolveWarehouseIdsByWorkshop(array $user): ?array
return [];
}

$managedIds = $this->assignmentModel->getWorkshopsManagedBy($employeeId);
if ($this->hasStorageWorkshop($managedIds)) {
return null;
}

return $this->warehouseModel->getWarehouseIdsByWorkshops($workshopIds);
}

private function hasStorageWorkshop(array $workshopIds): bool
{
foreach ($workshopIds as $workshopId) {
$workshop = $this->workshopModel->find($workshopId);
$type = mb_strtolower((string) ($workshop['LoaiXuong'] ?? ''));
if (str_contains($type, 'lưu trữ')) {
return true;
}
}

return false;
}

private function getWorkshopManagerRoles(): array
{
return [
'VT_TRUONG_XUONG_KIEM_DINH',
'VT_TRUONG_XUONG_LAP_RAP_DONG_GOI',
'VT_TRUONG_XUONG_SAN_XUAT',
'VT_TRUONG_XUONG_LUU_TRU',
];
}

private function classifyDocumentType(string $documentType): array
{
$normalized = $this->normalizeText($documentType);
Expand Down
15 changes: 15 additions & 0 deletions controllers/WorkshopController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class WorkshopController extends Controller
private Employee $employeeModel;
private WorkshopAssignment $assignmentModel;
private Warehouse $warehouseModel;
private WorkShift $workShiftModel;

public function __construct()
{
Expand All @@ -20,6 +21,7 @@ public function __construct()
$this->employeeModel = new Employee();
$this->assignmentModel = new WorkshopAssignment();
$this->warehouseModel = new Warehouse();
$this->workShiftModel = new WorkShift();
}

public function index(): void
Expand Down Expand Up @@ -118,6 +120,10 @@ public function store(): void
$assignments['warehouse'],
$assignments['production'],
);
if ($this->isStorageWorkshopType($data['LoaiXuong'] ?? null)) {
$this->warehouseModel->createDefaultWarehousesForWorkshop($data, $data['XUONGTRUONG_IdNhanVien'] ?? null);
$this->workShiftModel->ensureFixedShiftsForDate(date('Y-m-d'));
}
$this->setFlash('success', 'Đã thêm xưởng sản xuất mới.');
} catch (Throwable $exception) {
Logger::error('Lỗi khi thêm xưởng: ' . $exception->getMessage());
Expand Down Expand Up @@ -1109,4 +1115,13 @@ private function getWorkshopManagerRoles(): array
'VT_TRUONG_XUONG_LUU_TRU',
];
}

private function isStorageWorkshopType(?string $workshopType): bool
{
if ($workshopType === null) {
return false;
}

return mb_strtolower(trim($workshopType)) === 'xưởng lưu trữ hàng hóa';
}
}
24 changes: 14 additions & 10 deletions models/Employee.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,18 @@ public function getWorkshopIdsForEmployee(?string $employeeId): array
}

$sql = 'SELECT DISTINCT IdXuong FROM (
SELECT idXuong AS IdXuong FROM nhan_vien WHERE IdNhanVien = :employee
SELECT idXuong AS IdXuong FROM nhan_vien WHERE IdNhanVien = ?
UNION ALL
SELECT IdXuong FROM xuong_nhan_vien WHERE IdNhanVien = :employee
SELECT IdXuong FROM xuong_nhan_vien WHERE IdNhanVien = ?
UNION ALL
SELECT IdXuong FROM xuong WHERE XUONGTRUONG_IdNhanVien = :employee
SELECT IdXuong FROM xuong WHERE XUONGTRUONG_IdNhanVien = ?
) AS workshop_ids
WHERE IdXuong IS NOT NULL AND IdXuong <> ""';

$stmt = $this->db->prepare($sql);
$stmt->bindValue(':employee', $employeeId);
$stmt->bindValue(1, $employeeId);
$stmt->bindValue(2, $employeeId);
$stmt->bindValue(3, $employeeId);
$stmt->execute();

return array_values(array_unique($stmt->fetchAll(PDO::FETCH_COLUMN) ?: []));
Expand All @@ -93,18 +95,20 @@ public function isEmployeeInWorkshop(?string $employeeId, ?string $workshopId):

$sql = 'SELECT 1
FROM (
SELECT idXuong AS IdXuong FROM nhan_vien WHERE IdNhanVien = :employee
SELECT idXuong AS IdXuong FROM nhan_vien WHERE IdNhanVien = ?
UNION ALL
SELECT IdXuong FROM xuong_nhan_vien WHERE IdNhanVien = :employee
SELECT IdXuong FROM xuong_nhan_vien WHERE IdNhanVien = ?
UNION ALL
SELECT IdXuong FROM xuong WHERE XUONGTRUONG_IdNhanVien = :employee
SELECT IdXuong FROM xuong WHERE XUONGTRUONG_IdNhanVien = ?
) AS workshop_ids
WHERE IdXuong = :workshop
WHERE IdXuong = ?
LIMIT 1';

$stmt = $this->db->prepare($sql);
$stmt->bindValue(':employee', $employeeId);
$stmt->bindValue(':workshop', $workshopId);
$stmt->bindValue(1, $employeeId);
$stmt->bindValue(2, $employeeId);
$stmt->bindValue(3, $employeeId);
$stmt->bindValue(4, $workshopId);
$stmt->execute();

return (bool) $stmt->fetchColumn();
Expand Down
49 changes: 49 additions & 0 deletions models/Warehouse.php
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,55 @@ public function generateWarehouseId(): string
return 'KHO' . date('YmdHis');
}

public function hasWarehousesForWorkshop(string $workshopId): bool
{
$stmt = $this->db->prepare('SELECT 1 FROM KHO WHERE IdXuong = :workshopId LIMIT 1');
$stmt->bindValue(':workshopId', $workshopId);
$stmt->execute();

return (bool) $stmt->fetchColumn();
}

public function createDefaultWarehousesForWorkshop(array $workshop, ?string $managerId = null): array
{
$workshopId = $workshop['IdXuong'] ?? null;
if (!$workshopId) {
return [];
}

if ($this->hasWarehousesForWorkshop($workshopId)) {
return [];
}

$workshopName = $workshop['TenXuong'] ?? $workshopId;
$location = $workshop['DiaDiem'] ?? null;
$managerId = $managerId ?? ($workshop['XUONGTRUONG_IdNhanVien'] ?? null);

$created = [];
foreach (self::WAREHOUSE_TYPES as $label) {
$payload = [
'IdKho' => uniqid('KHO'),
'TenKho' => trim($label . ' - ' . $workshopName),
'TenLoaiKho' => $label,
'DiaChi' => $location,
'TongSLLo' => 0,
'ThanhTien' => 0,
'TrangThai' => 'Đang sử dụng',
'TongSL' => 0,
'IdXuong' => $workshopId,
'NHAN_VIEN_KHO_IdNhanVien' => $managerId,
];

if (!$this->createWarehouse($payload)) {
throw new RuntimeException('Không thể tạo kho mặc định cho xưởng ' . $workshopId);
}

$created[] = $payload['IdKho'];
}

return $created;
}

public function adjustWarehouseStock(string $warehouseId, int $quantityDelta = 0, int $lotDelta = 0): bool
{
$sql = 'UPDATE KHO
Expand Down
Loading