From 2dd7d33c8b92773003a724faec8dc4196d19409e Mon Sep 17 00:00:00 2001 From: che Date: Mon, 27 Jul 2026 15:24:23 +0500 Subject: [PATCH] fix --- src-tauri/src/apps/contractapp/serializers.rs | 8 +- src-tauri/src/apps/mod.rs | 2 + .../src/apps/personemanagment/filters.rs | 1 + src-tauri/src/apps/personemanagment/mod.rs | 3 +- src-tauri/src/apps/personemanagment/models.rs | 2 + .../src/apps/personemanagment/serializers.rs | 313 ++++++++-- src-tauri/src/apps/supplyapp/filters.rs | 26 + .../apps/supplyapp/migrations/0001_auto.sql | 33 + .../src/apps/supplyapp/migrations/schema.json | 350 +++++++++++ src-tauri/src/apps/supplyapp/mod.rs | 26 + src-tauri/src/apps/supplyapp/models.rs | 40 ++ src-tauri/src/apps/supplyapp/serializers.rs | 65 ++ src/App.vue | 14 +- src/app/router/index.ts | 30 +- .../components/ContractApprovalTasks.vue | 42 +- .../contracts/views/ContractDetailView.vue | 9 +- src/apps/contracts/views/ContractsView.vue | 27 +- src/apps/documents/routes.ts | 8 + src/apps/documents/views/DocumentsView.vue | 108 ++++ src/apps/supply/routes.ts | 17 + src/apps/supply/views/BillDetailView.vue | 283 +++++++++ src/apps/supply/views/BillsView.vue | 492 +++++++++++++++ src/apps/tasks/views/TaskCreateView.vue | 24 +- src/apps/tasks/views/TaskDetailView.vue | 23 +- src/apps/tasks/views/TasksView.vue | 50 +- src/generated/api.ts | 9 +- src/generated/models.ts | 427 +++++++------ .../components/DocumentApprovalTaskCard.vue | 591 ++++++++++++++++++ .../components/DocumentApprovalTasks.vue | 126 ++++ 29 files changed, 2796 insertions(+), 353 deletions(-) create mode 100644 src-tauri/src/apps/supplyapp/filters.rs create mode 100644 src-tauri/src/apps/supplyapp/migrations/0001_auto.sql create mode 100644 src-tauri/src/apps/supplyapp/migrations/schema.json create mode 100644 src-tauri/src/apps/supplyapp/mod.rs create mode 100644 src-tauri/src/apps/supplyapp/models.rs create mode 100644 src-tauri/src/apps/supplyapp/serializers.rs create mode 100644 src/apps/documents/routes.ts create mode 100644 src/apps/documents/views/DocumentsView.vue create mode 100644 src/apps/supply/routes.ts create mode 100644 src/apps/supply/views/BillDetailView.vue create mode 100644 src/apps/supply/views/BillsView.vue create mode 100644 src/shared/components/DocumentApprovalTaskCard.vue create mode 100644 src/shared/components/DocumentApprovalTasks.vue diff --git a/src-tauri/src/apps/contractapp/serializers.rs b/src-tauri/src/apps/contractapp/serializers.rs index 40d77a1..8275743 100644 --- a/src-tauri/src/apps/contractapp/serializers.rs +++ b/src-tauri/src/apps/contractapp/serializers.rs @@ -52,10 +52,10 @@ static CONTRACT_FIELDS: &[Field] = &[ .required(false) .nullable(), Field::related("category_ref", "category_id", &CATEGORY_RELATION), - Field::related("counterparty", "company", &COUNTERPARTY_RELATION), - Field::related("project", "project", &PROJECT_RELATION), - Field::related("frc", "frc", &FRC_RELATION), - Field::related("employee", "get_employee", &EMPLOYEE_RELATION), + Field::related("counterparty", "counterparty_id", &COUNTERPARTY_RELATION), + Field::related("project", "project_id", &PROJECT_RELATION), + Field::related("frc", "frc_id", &FRC_RELATION), + Field::related("employee", "employee_id", &EMPLOYEE_RELATION), ]; static CONTRACT_CATEGORY_FIELDS: &[Field] = &[ diff --git a/src-tauri/src/apps/mod.rs b/src-tauri/src/apps/mod.rs index 0bfc9e4..b0c3c26 100644 --- a/src-tauri/src/apps/mod.rs +++ b/src-tauri/src/apps/mod.rs @@ -1,6 +1,7 @@ pub mod frcapp; pub mod personemanagment; pub mod projectapp; +pub mod supplyapp; pub mod users; use che_tauri::InstalledApps; @@ -12,5 +13,6 @@ pub fn installed_apps() -> InstalledApps { .add(projectapp::module()) .add(personemanagment::module()) .add(contractapp::module()) + .add(supplyapp::module()) } pub mod contractapp; diff --git a/src-tauri/src/apps/personemanagment/filters.rs b/src-tauri/src/apps/personemanagment/filters.rs index a0bbd59..f55a4b1 100644 --- a/src-tauri/src/apps/personemanagment/filters.rs +++ b/src-tauri/src/apps/personemanagment/filters.rs @@ -14,6 +14,7 @@ static TASK_FILTERS: &[Filter] = &[ Filter::exact("id"), Filter::contains("text"), Filter::remote_only("contract"), + Filter::remote_only("bill"), Filter::remote_only("doer"), Filter::remote_only("author"), Filter::exact("archive"), diff --git a/src-tauri/src/apps/personemanagment/mod.rs b/src-tauri/src/apps/personemanagment/mod.rs index bcfe078..45d094e 100644 --- a/src-tauri/src/apps/personemanagment/mod.rs +++ b/src-tauri/src/apps/personemanagment/mod.rs @@ -34,8 +34,9 @@ impl AppModule for TaskModule { serializers::task_transfer_serializer(), filters::task_transfer_filterset(), ); - ctx.resource::( + ctx.mapped_remote_resource::( "message", + "/api/persone/messages/", serializers::message_serializer(), filters::message_filterset(), ); diff --git a/src-tauri/src/apps/personemanagment/models.rs b/src-tauri/src/apps/personemanagment/models.rs index c28fcba..b5ef0ae 100644 --- a/src-tauri/src/apps/personemanagment/models.rs +++ b/src-tauri/src/apps/personemanagment/models.rs @@ -101,6 +101,8 @@ pub struct Message { pub employee_id: i64, pub text: String, + + pub status: String, } #[derive(Debug, Clone, Model)] diff --git a/src-tauri/src/apps/personemanagment/serializers.rs b/src-tauri/src/apps/personemanagment/serializers.rs index 0d55503..cabbea8 100644 --- a/src-tauri/src/apps/personemanagment/serializers.rs +++ b/src-tauri/src/apps/personemanagment/serializers.rs @@ -11,92 +11,271 @@ static EMPLOYEE_FIELDS: &[Field] = &[ static TASK_FIELDS: &[Field] = &[ Field::new("id").read_only(), - Field::json("project").required(false).nullable(), - Field::json("doer").required(false).nullable(), - Field::new("doer_name"), - Field::json("author").required(false).nullable(), - Field::json("memo_full").required(false).nullable(), - Field::json("bill_full").required(false).nullable(), - Field::json("contract_full").required(false).nullable(), + Field::json("project") + .ts_type("string") + .required(false) + .nullable() + .read_only(), + Field::json("doer") + .ts_type("Employee") + .input_ts_type("Employee") + .required(false) + .nullable(), + Field::new("doer_name").read_only(), + Field::json("author") + .ts_type("Employee") + .required(false) + .nullable() + .read_only(), + Field::json("memo_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("bill_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("contract_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), Field::json("contract_application_full") + .ts_type("unknown") .required(false) - .nullable(), + .nullable() + .read_only(), Field::json("outgoing_letter_full") + .ts_type("unknown") .required(false) - .nullable(), - Field::json("entry_letter_full").required(false).nullable(), - Field::json("protocolitem_full").required(false).nullable(), - Field::json("decree_full").required(false).nullable(), - Field::json("delivery_full").required(false).nullable(), - Field::new("get_status"), - Field::new("get_status_class"), - Field::new("get_scan_url").required(false).nullable(), - Field::new("get_last_day"), - Field::new("frc_icon"), - Field::json("uploadfile_set").required(false).nullable(), + .nullable() + .read_only(), + Field::json("entry_letter_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("protocolitem_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("decree_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("delivery_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::new("get_status").read_only(), + Field::new("get_status_class").read_only(), + Field::new("get_scan_url") + .required(false) + .nullable() + .read_only(), + Field::new("get_last_day").read_only(), + Field::new("frc_icon").read_only(), + Field::json("uploadfile_set") + .ts_type("unknown[]") + .required(false) + .nullable() + .read_only(), Field::new("deadline"), Field::new("request_new_deadline") + .required(false) + .nullable() + .read_only(), + Field::new("plan_date") + .required(false) + .nullable() + .read_only(), + Field::new("date").read_only(), + Field::json("message_set") + .ts_type("unknown[]") + .required(false) + .nullable() + .read_only(), + Field::json("responsible") + .ts_type("Employee") + .input_ts_type("Employee") .required(false) .nullable(), - Field::new("plan_date").required(false).nullable(), - Field::new("date"), - Field::json("message_set").required(false).nullable(), - Field::json("responsible").required(false).nullable(), - Field::json("counterparty").required(false).nullable(), + Field::json("counterparty") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), Field::json("get_deadline_history") + .ts_type("unknown[]") .required(false) - .nullable(), - Field::new("duration").required(false).nullable(), - Field::json("bid_full").required(false).nullable(), + .nullable() + .read_only(), + Field::new("duration") + .required(false) + .nullable() + .read_only(), + Field::json("bid_full") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), Field::json("price_agreement_full") + .ts_type("unknown") .required(false) - .nullable(), - Field::json("transfer").required(false).nullable(), + .nullable() + .read_only(), + Field::json("transfer") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), Field::new("text"), - Field::new("status"), - Field::new("result"), - Field::new("complit_date").required(false).nullable(), - Field::new("comment"), - Field::new("note"), - Field::new("approve"), - Field::new("archive"), - Field::new("approve_date").required(false).nullable(), - Field::new("approve_required"), - Field::new("progress_status"), - Field::new("start_date").required(false).nullable(), - Field::new("end_date").required(false).nullable(), - Field::new("order_number").required(false).nullable(), - Field::new("priority").required(false).nullable(), - Field::new("typ"), - Field::json("stage").required(false).nullable(), - Field::json("contract").required(false).nullable(), - Field::json("questionnair").required(false).nullable(), - Field::json("contract_application") + Field::new("status").read_only(), + Field::new("result").read_only(), + Field::new("complit_date") .required(false) - .nullable(), - Field::json("entry_letter").required(false).nullable(), - Field::json("outgoing_letter").required(false).nullable(), - Field::json("protocol").required(false).nullable(), - Field::json("bill").required(false).nullable(), - Field::json("decree").required(false).nullable(), - Field::json("court_case").required(false).nullable(), - Field::json("bill_register").required(false).nullable(), - Field::json("price_agreement").required(false).nullable(), - Field::json("bid").required(false).nullable(), - Field::json("delivery").required(false).nullable(), - Field::json("scheduled_task").required(false).nullable(), - Field::json("report").required(false).nullable(), - Field::json("memo").required(false).nullable(), - Field::json("protocolitem").required(false).nullable(), - Field::json("related_note").required(false).nullable(), - Field::json("task").required(false).nullable(), + .nullable() + .read_only(), + Field::new("comment").read_only(), + Field::new("note").read_only(), + Field::new("approve").read_only(), + Field::new("archive").read_only(), + Field::new("approve_date") + .required(false) + .nullable() + .read_only(), + Field::new("approve_required").read_only(), + Field::new("progress_status").read_only(), + Field::new("start_date") + .required(false) + .nullable() + .read_only(), + Field::new("end_date") + .required(false) + .nullable() + .read_only(), + Field::new("order_number") + .required(false) + .nullable() + .read_only(), + Field::new("priority") + .required(false) + .nullable() + .read_only(), + Field::new("typ").read_only(), + Field::json("stage") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("contract") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("questionnair") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("contract_application") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("entry_letter") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("outgoing_letter") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("protocol") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("bill") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("decree") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("court_case") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("bill_register") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("price_agreement") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("bid") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("delivery") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("scheduled_task") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("report") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("memo") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("protocolitem") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("related_note") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), + Field::json("task") + .ts_type("unknown") + .required(false) + .nullable() + .read_only(), ]; static MESSAGE_FIELDS: &[Field] = &[ Field::new("id").read_only(), - Field::new("task_id"), - Field::new("employee_id"), + Field::new("task").source("task_id"), + Field::new("recipient").source("employee_id"), Field::new("text"), + Field::new("status"), ]; static TASK_TRANSFER_FIELDS: &[Field] = &[ diff --git a/src-tauri/src/apps/supplyapp/filters.rs b/src-tauri/src/apps/supplyapp/filters.rs new file mode 100644 index 0000000..7fd1e97 --- /dev/null +++ b/src-tauri/src/apps/supplyapp/filters.rs @@ -0,0 +1,26 @@ +use che_tauri::{Filter, FilterSet}; + +use super::models::Bill; + +static BILL_FILTERS: &[Filter] = &[ + Filter::exact("id"), + Filter::exact("number"), + Filter::contains("number"), + Filter::exact("text"), + Filter::contains("text"), + Filter::exact("status"), + Filter::exact("status_name"), + Filter::contains("status_name"), + Filter::exact("date"), + Filter::exact("date_due"), + Filter::exact("date_bill"), + Filter::exact("contract_typ"), + Filter::remote_only("counterparty"), + Filter::remote_only("frc"), + Filter::remote_only("project"), + Filter::remote_only("category"), +]; + +pub fn bill_filterset() -> FilterSet { + FilterSet::new(BILL_FILTERS).remote_ordering("order_by") +} diff --git a/src-tauri/src/apps/supplyapp/migrations/0001_auto.sql b/src-tauri/src/apps/supplyapp/migrations/0001_auto.sql new file mode 100644 index 0000000..6ac69ee --- /dev/null +++ b/src-tauri/src/apps/supplyapp/migrations/0001_auto.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS supply_bill ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + number TEXT NOT NULL, + text TEXT NOT NULL, + status TEXT NOT NULL, + status_name TEXT NOT NULL, + date TEXT NOT NULL, + date_due TEXT, + date_bill TEXT, + month_of_costs TEXT, + cost REAL NOT NULL, + to_payd REAL NOT NULL, + paid REAL NOT NULL, + nds_cost REAL NOT NULL, + scan TEXT, + comment TEXT NOT NULL, + absolute_url TEXT NOT NULL, + date_pay TEXT, + transaction_date TEXT, + date_applay TEXT, + archive_s BOOLEAN NOT NULL, + pp_maked BOOLEAN NOT NULL, + composit BOOLEAN NOT NULL, + contract_typ TEXT NOT NULL, + frc TEXT, + project TEXT, + counterparty TEXT, + contract TEXT, + responsible TEXT, + author TEXT, + category TEXT, + transferdocument_set TEXT +); diff --git a/src-tauri/src/apps/supplyapp/migrations/schema.json b/src-tauri/src/apps/supplyapp/migrations/schema.json new file mode 100644 index 0000000..5a25e5d --- /dev/null +++ b/src-tauri/src/apps/supplyapp/migrations/schema.json @@ -0,0 +1,350 @@ +{ + "models": [ + { + "table": "supply_bill", + "fields": [ + { + "name": "id", + "ty": "integer", + "primary_key": true, + "nullable": false, + "auto": true, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "number", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "text", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "status", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "status_name", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "date", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "date_due", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "date_bill", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "month_of_costs", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "cost", + "ty": "real", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "to_payd", + "ty": "real", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "paid", + "ty": "real", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "nds_cost", + "ty": "real", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "scan", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "comment", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "absolute_url", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "date_pay", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "transaction_date", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "date_applay", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "archive_s", + "ty": "boolean", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "pp_maked", + "ty": "boolean", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "composit", + "ty": "boolean", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "contract_typ", + "ty": "text", + "primary_key": false, + "nullable": false, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "frc", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "project", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "counterparty", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "contract", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "responsible", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "author", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "category", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + }, + { + "name": "transferdocument_set", + "ty": "text", + "primary_key": false, + "nullable": true, + "auto": false, + "unique": false, + "max_length": null, + "default": null, + "foreign_key": null + } + ] + } + ] +} diff --git a/src-tauri/src/apps/supplyapp/mod.rs b/src-tauri/src/apps/supplyapp/mod.rs new file mode 100644 index 0000000..6589efe --- /dev/null +++ b/src-tauri/src/apps/supplyapp/mod.rs @@ -0,0 +1,26 @@ +pub mod filters; +pub mod models; +pub mod serializers; + +use che_tauri::{AppModule, ModuleContext}; + +pub fn module() -> SupplyappModule { + SupplyappModule +} + +pub struct SupplyappModule; + +impl AppModule for SupplyappModule { + fn name(&self) -> &'static str { + "supplyapp" + } + + fn init(&self, ctx: &mut ModuleContext) { + ctx.mapped_remote_resource::( + "bill", + "/api/supply/bill/", + serializers::bill_serializer(), + filters::bill_filterset(), + ); + } +} diff --git a/src-tauri/src/apps/supplyapp/models.rs b/src-tauri/src/apps/supplyapp/models.rs new file mode 100644 index 0000000..ced469c --- /dev/null +++ b/src-tauri/src/apps/supplyapp/models.rs @@ -0,0 +1,40 @@ +use che_orm::Model; + +#[derive(Debug, Clone, Model)] +#[model(table = "supply_bill")] +pub struct Bill { + #[field(primary_key)] + pub id: i64, + + pub number: String, + pub text: String, + pub status: String, + pub status_name: String, + pub date: String, + pub date_due: Option, + pub date_bill: Option, + pub month_of_costs: Option, + pub cost: f64, + pub to_payd: f64, + pub paid: f64, + pub nds_cost: f64, + pub scan: Option, + pub comment: String, + pub absolute_url: String, + pub date_pay: Option, + pub transaction_date: Option, + pub date_applay: Option, + pub archive_s: bool, + pub pp_maked: bool, + pub composit: bool, + pub contract_typ: String, + + pub frc: Option, + pub project: Option, + pub counterparty: Option, + pub contract: Option, + pub responsible: Option, + pub author: Option, + pub category: Option, + pub transferdocument_set: Option, +} diff --git a/src-tauri/src/apps/supplyapp/serializers.rs b/src-tauri/src/apps/supplyapp/serializers.rs new file mode 100644 index 0000000..7e23565 --- /dev/null +++ b/src-tauri/src/apps/supplyapp/serializers.rs @@ -0,0 +1,65 @@ +use che_tauri::{Field, ModelSerializer}; + +use super::models::Bill; + +static BILL_FIELDS: &[Field] = &[ + Field::new("id").read_only(), + Field::new("number"), + Field::new("text"), + Field::new("status"), + Field::new("status_name").source("get_status_display"), + Field::new("date"), + Field::new("date_due").required(false).nullable(), + Field::new("date_bill").required(false).nullable(), + Field::new("month_of_costs").required(false).nullable(), + Field::new("cost"), + Field::new("to_payd"), + Field::new("paid"), + Field::new("nds_cost"), + Field::new("scan").required(false).nullable(), + Field::new("comment"), + Field::new("absolute_url").source("get_absolute_url"), + Field::new("date_pay").required(false).nullable(), + Field::new("transaction_date").required(false).nullable(), + Field::new("date_applay").required(false).nullable(), + Field::new("archive_s"), + Field::new("pp_maked"), + Field::new("composit"), + Field::new("contract_typ"), + Field::json("frc") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("project") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("counterparty") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("contract") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("responsible") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("author") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("category") + .ts_type("unknown") + .required(false) + .nullable(), + Field::json("transferdocument_set") + .ts_type("unknown[]") + .required(false) + .nullable(), +]; + +pub fn bill_serializer() -> ModelSerializer { + ModelSerializer::new(BILL_FIELDS) +} diff --git a/src/App.vue b/src/App.vue index 1b801e4..a08b88a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,8 +9,16 @@ const { logout } = useAuth(); const activeTab = computed({ get() { + if (route.path.startsWith("/documents")) { + return "/documents"; + } + + if (route.path.startsWith("/bills")) { + return "/documents"; + } + if (route.path.startsWith("/contracts")) { - return "/contracts"; + return "/documents"; } if (route.path.startsWith("/settings")) { @@ -61,8 +69,8 @@ async function logoutAndRedirect() { Задачи - КонтрактыДокументы Пользователи { const { restoreToken } = useAuth(); @@ -30,6 +34,6 @@ router.beforeEach(async (to) => { } if (to.path === "/login" && isAuthenticated()) { - return "/tasks"; + return "/documents"; } }); diff --git a/src/apps/contracts/components/ContractApprovalTasks.vue b/src/apps/contracts/components/ContractApprovalTasks.vue index 8fc82db..f31c45a 100644 --- a/src/apps/contracts/components/ContractApprovalTasks.vue +++ b/src/apps/contracts/components/ContractApprovalTasks.vue @@ -1,10 +1,24 @@ diff --git a/src/apps/documents/routes.ts b/src/apps/documents/routes.ts new file mode 100644 index 0000000..f917b54 --- /dev/null +++ b/src/apps/documents/routes.ts @@ -0,0 +1,8 @@ +import DocumentsView from "./views/DocumentsView.vue"; + +export const documentsRoute = { + path: "/documents", + name: "documents", + component: DocumentsView, + meta: { title: "Документы", requiresAuth: true }, +}; diff --git a/src/apps/documents/views/DocumentsView.vue b/src/apps/documents/views/DocumentsView.vue new file mode 100644 index 0000000..1e6e8d1 --- /dev/null +++ b/src/apps/documents/views/DocumentsView.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/apps/supply/routes.ts b/src/apps/supply/routes.ts new file mode 100644 index 0000000..f31becb --- /dev/null +++ b/src/apps/supply/routes.ts @@ -0,0 +1,17 @@ +import BillsView from "./views/BillsView.vue"; +import BillDetailView from "./views/BillDetailView.vue"; + +export const supplyRoutes = [ + { + path: "/bills", + name: "bills", + component: BillsView, + meta: { title: "Счета", requiresAuth: true }, + }, + { + path: "/bills/:id", + name: "bill-detail", + component: BillDetailView, + meta: { title: "Детали счета", back: true, requiresAuth: true }, + }, +]; diff --git a/src/apps/supply/views/BillDetailView.vue b/src/apps/supply/views/BillDetailView.vue new file mode 100644 index 0000000..9bf75a5 --- /dev/null +++ b/src/apps/supply/views/BillDetailView.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/apps/supply/views/BillsView.vue b/src/apps/supply/views/BillsView.vue new file mode 100644 index 0000000..35778d8 --- /dev/null +++ b/src/apps/supply/views/BillsView.vue @@ -0,0 +1,492 @@ + + + + + diff --git a/src/apps/tasks/views/TaskCreateView.vue b/src/apps/tasks/views/TaskCreateView.vue index 172dbb8..e0c6c0d 100644 --- a/src/apps/tasks/views/TaskCreateView.vue +++ b/src/apps/tasks/views/TaskCreateView.vue @@ -3,7 +3,7 @@ import { computed, ref } from "vue"; import { useRouter } from "vue-router"; import { showToast } from "vant"; import { employeeApi, taskApi } from "../../../generated/api"; -import type { Employee, TaskCreate, TaskPersonInput } from "../../../generated/models"; +import type { Employee, TaskCreate } from "../../../generated/models"; import { useModelApi } from "../../../shared/composables/useModelApi"; import EmployeeSelect from "../../personnel/components/EmployeeSelect.vue"; @@ -40,22 +40,20 @@ function makeShortName(name: string) { return `${parts[0]} ${parts.slice(1).map((part) => `${part[0]?.toUpperCase()}.`).join(" ")}`.trim(); } -async function buildPerson(id: number): Promise { +async function buildPerson(id: number): Promise { if (!id) { return null; } const employee = await loadEmployee(id); - return employeeToTaskPerson(employee); -} - -function employeeToTaskPerson(employee: Employee): TaskPersonInput { - return { - id: employee.id, - name: employee.name, - short_name: makeShortName(employee.name), - avatar_small: employee.avatar_small, - }; + return employee + ? { + id: employee.id, + name: employee.name, + short_name: makeShortName(employee.name), + avatar_small: employee.avatar_small, + } + : null; } async function createTask() { @@ -75,7 +73,7 @@ async function createTask() { const payload: TaskCreate = { doer, deadline: deadline.value, - text: taskText.value.trim() || undefined, + text: taskText.value.trim(), responsible, }; diff --git a/src/apps/tasks/views/TaskDetailView.vue b/src/apps/tasks/views/TaskDetailView.vue index 4ebcb22..b65b523 100644 --- a/src/apps/tasks/views/TaskDetailView.vue +++ b/src/apps/tasks/views/TaskDetailView.vue @@ -2,9 +2,24 @@ import { computed, onMounted } from "vue"; import { useRoute, useRouter } from "vue-router"; import { taskApi } from "../../../generated/api"; +import type { Employee, Task } from "../../../generated/models"; import RemoteImage from "../../../shared/components/RemoteImage.vue"; import { useModelApi } from "../../../shared/composables/useModelApi"; +type TaskMessage = { + id: number; + author: Employee; + recipient: Employee; + text: string; + date: string; + status: string; + task: number; +}; + +type TaskDetail = Omit & { + message_set?: TaskMessage[] | null; +}; + const route = useRoute(); const router = useRouter(); const taskId = computed(() => Number(route.params.id)); @@ -39,6 +54,10 @@ function formatBoolean(value: boolean) { return value ? "Да" : "Нет"; } +function messageList(taskItem: Task | null | undefined) { + return (taskItem as TaskDetail | null | undefined)?.message_set ?? []; +} + onMounted(() => { if (Number.isFinite(taskId.value)) { loadTask(taskId.value); @@ -90,10 +109,10 @@ onMounted(() => {

Диалог

- +
-
+
{{ personName(message.author) }}
diff --git a/src/apps/tasks/views/TasksView.vue b/src/apps/tasks/views/TasksView.vue index f2715f0..8f97e65 100644 --- a/src/apps/tasks/views/TasksView.vue +++ b/src/apps/tasks/views/TasksView.vue @@ -1,13 +1,15 @@ + + + + diff --git a/src/shared/components/DocumentApprovalTasks.vue b/src/shared/components/DocumentApprovalTasks.vue new file mode 100644 index 0000000..20257ff --- /dev/null +++ b/src/shared/components/DocumentApprovalTasks.vue @@ -0,0 +1,126 @@ + + + + +