diff --git a/src-tauri/src/apps/personemanagment/filters.rs b/src-tauri/src/apps/personemanagment/filters.rs index 864d665..37683b7 100644 --- a/src-tauri/src/apps/personemanagment/filters.rs +++ b/src-tauri/src/apps/personemanagment/filters.rs @@ -1,6 +1,6 @@ use che_tauri::{Filter, FilterSet}; -use super::models::{Employee, Message, Task}; +use super::models::{Employee, Message, Task, TaskTransfer}; static EMPLOYEE_FILTERS: &[Filter] = &[ Filter::exact("id"), @@ -24,6 +24,14 @@ static MESSAGE_FILTERS: &[Filter] = &[ Filter::exact("employee_id"), ]; +static TASK_TRANSFER_FILTERS: &[Filter] = &[ + Filter::exact("id"), + Filter::exact("employee_from_id"), + Filter::exact("employee_to_id"), + Filter::exact("status"), + Filter::exact("typ"), +]; + pub fn employee_filterset() -> FilterSet { FilterSet::new(EMPLOYEE_FILTERS) } @@ -35,3 +43,7 @@ pub fn task_filterset() -> FilterSet { pub fn message_filterset() -> FilterSet { FilterSet::new(MESSAGE_FILTERS) } + +pub fn task_transfer_filterset() -> FilterSet { + FilterSet::new(TASK_TRANSFER_FILTERS) +} diff --git a/src-tauri/src/apps/personemanagment/mod.rs b/src-tauri/src/apps/personemanagment/mod.rs index 72def80..d5dfbb3 100644 --- a/src-tauri/src/apps/personemanagment/mod.rs +++ b/src-tauri/src/apps/personemanagment/mod.rs @@ -21,11 +21,18 @@ impl AppModule for TaskModule { serializers::employee_serializer(), filters::employee_filterset(), ); - ctx.resource::( + ctx.remote_resource::( "task", + "/api/persone/task", serializers::task_serializer(), filters::task_filterset(), ); + ctx.remote_resource::( + "task_transfer", + "/api/persone/task_transfer", + serializers::task_transfer_serializer(), + filters::task_transfer_filterset(), + ); ctx.resource::( "message", serializers::message_serializer(), diff --git a/src-tauri/src/apps/personemanagment/models.rs b/src-tauri/src/apps/personemanagment/models.rs index 69c0296..3fcdce3 100644 --- a/src-tauri/src/apps/personemanagment/models.rs +++ b/src-tauri/src/apps/personemanagment/models.rs @@ -42,3 +42,22 @@ pub struct Message { pub text: String, } + +#[derive(Debug, Clone, Model)] +#[model(table = "task_transfer")] +pub struct TaskTransfer { + #[field(primary_key)] + pub id: i64, + + #[field(foreign_key = Employee)] + pub employee_from_id: Option, + + #[field(foreign_key = Employee)] + pub employee_to_id: Option, + + pub date_create: String, + + pub status: String, + + pub typ: String, +} diff --git a/src-tauri/src/apps/personemanagment/serializers.rs b/src-tauri/src/apps/personemanagment/serializers.rs index 4691f64..15857e4 100644 --- a/src-tauri/src/apps/personemanagment/serializers.rs +++ b/src-tauri/src/apps/personemanagment/serializers.rs @@ -1,6 +1,6 @@ use che_tauri::{Field, ModelSerializer}; -use super::models::{Employee, Message, Task}; +use super::models::{Employee, Message, Task, TaskTransfer}; static EMPLOYEE_FIELDS: &[Field] = &[ Field::new("id").read_only(), @@ -23,6 +23,15 @@ static MESSAGE_FIELDS: &[Field] = &[ Field::new("text"), ]; +static TASK_TRANSFER_FIELDS: &[Field] = &[ + Field::new("id").read_only(), + Field::new("employee_from_id").required(false).nullable(), + Field::new("employee_to_id").required(false).nullable(), + Field::new("date_create").read_only(), + Field::new("status"), + Field::new("typ"), +]; + pub fn employee_serializer() -> ModelSerializer { ModelSerializer::new(EMPLOYEE_FIELDS) } @@ -34,3 +43,7 @@ pub fn task_serializer() -> ModelSerializer { pub fn message_serializer() -> ModelSerializer { ModelSerializer::new(MESSAGE_FIELDS) } + +pub fn task_transfer_serializer() -> ModelSerializer { + ModelSerializer::new(TASK_TRANSFER_FIELDS) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4b7f13f..64512d9 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,6 +6,14 @@ use tauri::Manager; use crate::sync::SyncContractsResult; +#[derive(Debug, serde::Deserialize, serde::Serialize)] +struct CurrentEmployee { + id: i64, + name: String, + short_name: String, + avatar: Option, +} + #[tauri::command] fn greet(name: &str) -> String { format!("Hello, {}! You've been greeted from Rust!", name) @@ -43,6 +51,45 @@ fn auth_status(api: tauri::State<'_, TauriApi>) -> bool { api.is_authenticated() } +#[tauri::command] +async fn current_employee(api: tauri::State<'_, TauriApi>) -> Result { + let remote = api + .state() + .config + .remote + .as_ref() + .ok_or_else(|| ApiError::bad_request("current_employee requires [remote].base_url config"))?; + + let token = api + .state() + .auth_token() + .ok_or_else(|| ApiError::new("not_authenticated", "authentication token is missing"))?; + + let response = reqwest::Client::new() + .get(format!( + "{}/api/persone/employee/who_im/", + remote.base_url.trim_end_matches('/') + )) + .header(reqwest::header::AUTHORIZATION, format!("Token {token}")) + .send() + .await + .map_err(|error| ApiError::new("remote_error", error.to_string()))?; + + if !response.status().is_success() { + let status = response.status(); + let detail = response.text().await.unwrap_or_default(); + return Err(ApiError::new( + "remote_error", + format!("who_im request failed with {status}: {detail}"), + )); + } + + response + .json::() + .await + .map_err(|error| ApiError::new("remote_error", error.to_string())) +} + #[tauri::command] async fn sync_contracts( app: tauri::AppHandle, @@ -116,6 +163,7 @@ pub fn run() { auth_set_token, auth_logout, auth_status, + current_employee, sync_contracts, load_application_file ]) diff --git a/src/apps/tasks/views/TaskCreateView.vue b/src/apps/tasks/views/TaskCreateView.vue index 5177884..172dbb8 100644 --- a/src/apps/tasks/views/TaskCreateView.vue +++ b/src/apps/tasks/views/TaskCreateView.vue @@ -1,45 +1,91 @@ diff --git a/src/apps/tasks/views/TaskDetailView.vue b/src/apps/tasks/views/TaskDetailView.vue index 41a0513..1a6d50c 100644 --- a/src/apps/tasks/views/TaskDetailView.vue +++ b/src/apps/tasks/views/TaskDetailView.vue @@ -1,16 +1,12 @@ diff --git a/src/apps/tasks/views/TasksView.vue b/src/apps/tasks/views/TasksView.vue index 0c460ca..9f8471a 100644 --- a/src/apps/tasks/views/TasksView.vue +++ b/src/apps/tasks/views/TasksView.vue @@ -1,78 +1,377 @@ + + diff --git a/src/generated/api.ts b/src/generated/api.ts index 6b211bd..48dde8c 100644 --- a/src/generated/api.ts +++ b/src/generated/api.ts @@ -36,6 +36,8 @@ import type { TaskCreate, TaskUpdate, TaskListParams, + TaskTransfer, + TaskTransferListParams, User, UserCreate, UserUpdate, @@ -51,4 +53,5 @@ export const frcApi = createModelApi(" export const messageApi = createModelApi("message"); export const projectApi = createModelApi("project"); export const taskApi = createModelApi("task"); +export const taskTransferApi = createModelApi, Partial, TaskTransferListParams>("task_transfer"); export const userApi = createModelApi("users"); diff --git a/src/generated/models.ts b/src/generated/models.ts index e42678f..6a2fead 100644 --- a/src/generated/models.ts +++ b/src/generated/models.ts @@ -319,6 +319,107 @@ export interface MessageListParams extends ListParams { employee_id?: number; } +export interface TaskTransferPerson { + id: number; + name: string; + short_name: string; + first_position: string; + get_main_position: string; + departament_name: string; + company: Record | null; +} + +export interface TaskTransferProject { + id: number; + name: string; + short_name: string; + tender: string; + get_absolute_url: string; +} + +export interface TaskTransferTask { + id: number; + text: string; + author: TaskTransferPerson; + doer: TaskTransferPerson; + deadline: string; + get_last_day: string; + status: string; + project: TaskTransferProject | null; +} + +export interface TaskTransfer { + id: number; + employee_from: TaskTransferPerson; + employee_to: TaskTransferPerson; + date_create: string; + task: TaskTransferTask; + status: string; + typ: string; +} + +export interface TaskTransferListParams extends ListParams { + id?: number; + employee_from?: number; + employee_to?: number; + status?: string; + typ?: string; + date_create?: string; +} + +export interface TaskPosition { + id: number; + frc_name: string; + name: string; + frc: number; +} + +export interface TaskPerson { + id: number; + name: string; + short_name: string; + avatar: string | null; + avatar_small: string | null; + first_position: string; + company: Record | null; + position: TaskPosition[]; +} + +export interface TaskPersonInput { + id?: number; + name: string; + short_name: string; + avatar?: string | null; + avatar_small?: string | null; + first_position?: string; + company?: Record | null; + position?: TaskPosition[]; +} + +export interface TaskProject { + id: number; + name: string; + short_name: string; + tender: string; + get_absolute_url: string; +} + +export interface TaskMessage { + id: number; + author: TaskPerson; + text: string; + request_new_deadline: string | null; + recipient: TaskPerson; + date: string; + status: string; + task: number; +} + +export interface TaskRelatedObject { + id: number; + [key: string]: unknown; +} + export interface Project { id: number; name: string; @@ -354,29 +455,156 @@ export interface ProjectListParams extends ListParams { export interface Task { id: number; - name: string; - author_id: number | null; - responsible_id: number | null; + project: TaskProject | null; + doer: TaskPerson; + doer_name: string; + author: TaskPerson | null; + memo_full: TaskRelatedObject | null; + bill_full: TaskRelatedObject | null; + contract_full: TaskRelatedObject | null; + contract_application_full: TaskRelatedObject | null; + outgoing_letter_full: TaskRelatedObject | null; + entry_letter_full: TaskRelatedObject | null; + protocolitem_full: TaskRelatedObject | null; + decree_full: TaskRelatedObject | null; + delivery_full: TaskRelatedObject | null; + get_status: string; + get_status_class: string; + get_scan_url: string | null; + get_last_day: string; + frc_icon: string; + uploadfile_set: unknown[]; + deadline: string; + request_new_deadline: string | null; + plan_date: string | null; + date: string; + message_set: TaskMessage[]; + responsible: TaskPerson | null; + counterparty: TaskRelatedObject | null; + get_deadline_history: unknown[]; + duration: number | null; + bid_full: TaskRelatedObject | null; + price_agreement_full: TaskRelatedObject | null; + transfer: unknown; + text: string; + status: string; + result: string; + complit_date: string | null; + comment: string; + note: string; + approve: boolean; + archive: boolean; + approve_date: string | null; + approve_required: boolean; + progress_status: string; + start_date: string | null; + end_date: string | null; + order_number: number | null; + priority: number | null; + typ: string; + stage: unknown; + contract: unknown; + questionnair: unknown; + contract_application: unknown; + entry_letter: unknown; + outgoing_letter: unknown; + protocol: unknown; + bill: unknown; + decree: unknown; + court_case: unknown; + bill_register: unknown; + price_agreement: unknown; + bid: unknown; + delivery: unknown; + scheduled_task: unknown; + report: unknown; + memo: unknown; + protocolitem: unknown; + related_note: unknown; + task: unknown; } export interface TaskCreate { - name: string; - author_id?: number | null; - responsible_id?: number | null; + project?: TaskProject | null; + doer: TaskPersonInput; + get_status?: string; + get_status_class?: string; + get_scan_url?: string | null; + get_last_day?: string; + frc_icon?: string; + deadline: string; + request_new_deadline?: string | null; + plan_date?: string | null; + responsible?: TaskPersonInput | null; + counterparty?: TaskRelatedObject | null; + bid_full?: TaskRelatedObject | null; + price_agreement_full?: TaskRelatedObject | null; + text?: string; + status?: string; + result?: string; + complit_date?: string | null; + comment?: string; + note?: string; + approve?: boolean; + archive?: boolean; + approve_date?: string | null; + approve_required?: boolean; + progress_status?: string; + start_date?: string | null; + end_date?: string | null; + order_number?: number | null; + priority?: number | null; + typ?: string; } export interface TaskUpdate { - name?: string; - author_id?: number | null; - responsible_id?: number | null; + project?: TaskProject | null; + doer?: TaskPersonInput; + get_status?: string; + get_status_class?: string; + get_scan_url?: string | null; + get_last_day?: string; + frc_icon?: string; + deadline?: string; + request_new_deadline?: string | null; + plan_date?: string | null; + responsible?: TaskPersonInput | null; + counterparty?: TaskRelatedObject | null; + bid_full?: TaskRelatedObject | null; + price_agreement_full?: TaskRelatedObject | null; + text?: string; + status?: string; + result?: string; + complit_date?: string | null; + comment?: string; + note?: string; + approve?: boolean; + archive?: boolean; + approve_date?: string | null; + approve_required?: boolean; + progress_status?: string; + start_date?: string | null; + end_date?: string | null; + order_number?: number | null; + priority?: number | null; + typ?: string; } export interface TaskListParams extends ListParams { id?: number; - name?: string; - name__contains?: string; - author_id?: number | null; - responsible_id?: number | null; + text?: string; + text__contains?: string; + doer?: number | null; + author?: number | null; + archive?: boolean; + status?: string; + result?: string; + doer_name?: string; + doer_name__contains?: string; + deadline?: string; + progress_status?: string; + priority?: number | null; + typ?: string; } export interface User { @@ -397,4 +625,3 @@ export interface UserListParams extends ListParams { name?: string; name__contains?: string; } -