Obieg Dokumentu Wychodzącego

1. Wyszczególnienie Aktorów

W procesie obiegu pisma wychodzącego biorą udział następujące osoby:

  • Pracownik (Inicjator dokumentu): Osoba, która rozpoczyna proces wysyłki pisma wychodzącego. Może przesłać pismo do akceptacji przez Kierownika.
  • Kierownik: Odpowiedzialny za akceptację pisma wychodzącego. Jeśli jest dostępny, akceptuje pismo. Jeśli jest na urlopie, akceptację przejmuje jego zastępca.
  • Dyrektor: Odpowiedzialny za zatwierdzenie pisma wychodzącego. Jeśli jest dostępny, zatwierdza pismo. Jeśli jest na urlopie, zatwierdzenie przejmuje jego zastępca.
  • Zastępca Kierownika: Osoba pełniąca rolę Kierownika, gdy ten jest na urlopie.
  • Zastępca Dyrektora: Osoba pełniąca rolę Dyrektora, gdy ten jest na urlopie.

2. Zamodelowanie Obiegu Dokumentu

Obieg dokumentu można przedstawić w następujący sposób:

  • Pismo wychodzące generowane przez pracownika.
  • Pismo wysyłane do Akceptacji Kierownika.
  • Kierownik akceptuje pismo, jeśli jest dostępny; w przeciwnym razie Zastępca Kierownika je akceptuje.
  • Po akceptacji przez Kierownika, pismo trafia do Zatwierdzenia przez Dyrektora.
  • Dyrektor zatwierdza pismo, jeśli jest dostępny; w przeciwnym razie Zastępca Dyrektora je zatwierdza.
  • Pismo zostało wysłane.

3. Struktura Bazy Danych

Users


CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    role VARCHAR(50) NOT NULL,
    is_on_vacation BOOLEAN DEFAULT FALSE
);
                

Documents


CREATE TABLE documents (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    status VARCHAR(50) NOT NULL,
    created_by INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (created_by) REFERENCES users(id)
);
                

Approvals


CREATE TABLE approvals (
    id INT PRIMARY KEY AUTO_INCREMENT,
    document_id INT,
    user_id INT,
    action VARCHAR(50), -- 'approved' or 'rejected'
    approval_type VARCHAR(50), -- 'manager' or 'director'
    approved_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    is_substitute BOOLEAN DEFAULT FALSE, -- Jeżeli akceptacja została dokonana przez zastępcę
    FOREIGN KEY (document_id) REFERENCES documents(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
                

Substitutes


CREATE TABLE substitutes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT, -- Kierownik lub Dyrektor
    substitute_id INT, -- Zastępca
    start_date DATE,
    end_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (substitute_id) REFERENCES users(id)
);
                

4. Przykład Kodu PHP (Procesowanie Pisma Wychodzącego)

Poniżej znajduje się przykład kodu PHP, który pokazuje procesowanie pisma wychodzącego:


<?php
class DocumentFlow {
    protected $document;
    protected $employee;
    protected $manager;
    protected $director;
    protected $substituteManager;
    protected $substituteDirector;

    public function __construct($document, $employee, $manager, $director, $substituteManager, $substituteDirector) {
        $this->document = $document;
        $this->employee = $employee;
        $this->manager = $manager;
        $this->director = $director;
        $this->substituteManager = $substituteManager;
        $this->substituteDirector = $substituteDirector;
    }

    public function startProcess() {
        $this->sendToManager();
    }

    public function sendToManager() {
        if ($this->manager->isAvailable()) {
            $this->manager->approveDocument($this->document);
            $this->sendToDirector();
        } else {
            $this->substituteManager->approveDocument($this->document);
            $this->sendToDirector();
        }
    }

    public function sendToDirector() {
        if ($this->director->isAvailable()) {
            $this->director->approveDocument($this->document);
            $this->sendToFinalStep();
        } else {
            $this->substituteDirector->approveDocument($this->document);
            $this->sendToFinalStep();
        }
    }

    public function sendToFinalStep() {
        echo "Pismo zostało wysłane.";
    }
}
?>