diff --git a/package.json b/package.json index 45349ca1b..346bc828a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+35", + "version": "0.8.2+38", "private": false, "scripts": { "dev": "next dev", diff --git a/prisma/migrations/1_beta_change/migration.sql b/prisma/migrations/1_beta_change/migration.sql new file mode 100644 index 000000000..2968738af --- /dev/null +++ b/prisma/migrations/1_beta_change/migration.sql @@ -0,0 +1,229 @@ +/* + Warnings: + + - You are about to drop the column `code` on the `company` table. All the data in the column will be lost. + - You are about to drop the column `kyc_status` on the `company` table. All the data in the column will be lost. + - You are about to drop the column `regional` on the `company` table. All the data in the column will be lost. + - You are about to drop the column `auto_renewal` on the `company_setting` table. All the data in the column will be lost. + - You are about to drop the column `notify_channel` on the `company_setting` table. All the data in the column will be lost. + - You are about to drop the column `notify_timing` on the `company_setting` table. All the data in the column will be lost. + - You are about to drop the column `reminder_freq` on the `company_setting` table. All the data in the column will be lost. + - You are about to drop the column `full_name` on the `user` table. All the data in the column will be lost. + - You are about to drop the column `phone` on the `user` table. All the data in the column will be lost. + - You are about to drop the `client` table. If the table is not empty, all the data it contains will be lost. + - A unique constraint covering the columns `[company_id]` on the table `company_setting` will be added. If there are existing duplicate values, this will fail. + - Added the required column `tax_id` to the `company` table without a default value. This is not possible if the table is not empty. + - Added the required column `address` to the `company_setting` table without a default value. This is not possible if the table is not empty. + - Added the required column `country` to the `company_setting` table without a default value. This is not possible if the table is not empty. + - Added the required column `phone` to the `company_setting` table without a default value. This is not possible if the table is not empty. + - Added the required column `representative_name` to the `company_setting` table without a default value. This is not possible if the table is not empty. + - Added the required column `tax_serial_number` to the `company_setting` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "client" DROP CONSTRAINT "client_company_id_fkey"; + +-- AlterTable company +-- Step 1: Drop the columns 'kyc_status' and 'regional' +ALTER TABLE "company" +DROP COLUMN "kyc_status", +DROP COLUMN "regional"; + +-- Step 2: Rename column 'code' to 'tax_id' +ALTER TABLE "company" +RENAME COLUMN "code" TO "tax_id"; + +-- Step 3: Add the new column 'tag' with a default value +ALTER TABLE "company" +ADD COLUMN "tag" TEXT NOT NULL DEFAULT 'all'; + +-- AlterTable +ALTER TABLE "company_setting" DROP COLUMN "auto_renewal", +DROP COLUMN "notify_channel", +DROP COLUMN "notify_timing", +DROP COLUMN "reminder_freq", +ADD COLUMN "address" TEXT NOT NULL, +ADD COLUMN "country" TEXT NOT NULL, +ADD COLUMN "phone" TEXT NOT NULL, +ADD COLUMN "representative_name" TEXT NOT NULL, +ADD COLUMN "tax_serial_number" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "role" ADD COLUMN "last_login_at" INTEGER NOT NULL DEFAULT 0; + +-- AlterTable +ALTER TABLE "user" DROP COLUMN "full_name", +DROP COLUMN "phone"; + +-- DropTable +DROP TABLE "client"; + +-- CreateTable +CREATE TABLE "accounting_setting" ( + "id" SERIAL NOT NULL, + "company_id" INTEGER NOT NULL, + "sales_tax_taxable" BOOLEAN NOT NULL, + "sales_tax_rate" DOUBLE PRECISION NOT NULL, + "purchase_tax_taxable" BOOLEAN NOT NULL, + "purchase_tax_rate" DOUBLE PRECISION NOT NULL, + "return_periodicity" TEXT NOT NULL, + "currency" TEXT NOT NULL, + + CONSTRAINT "accounting_setting_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "customer_vendor" ( + "id" SERIAL NOT NULL, + "company_id" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "tax_id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "note" TEXT NOT NULL, + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "customer_vendor_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "kyc_bookkeeper" ( + "id" SERIAL NOT NULL, + "user_id" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "birth_date" TEXT NOT NULL, + "email" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "qualification" BOOLEAN NOT NULL, + "certification_number" TEXT NOT NULL, + "personal_id_type" TEXT NOT NULL, + "personal_id_file_id" INTEGER NOT NULL, + "certification_file_id" INTEGER NOT NULL, + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "kyc_bookkeeper_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "news" ( + "id" SERIAL NOT NULL, + "type" TEXT NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "news_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shortcut" ( + "id" SERIAL NOT NULL, + "accounting_setting_id" INTEGER NOT NULL, + "action_name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "field_list" JSONB NOT NULL, + "key_list" TEXT[], + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "shortcut_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_action_log" ( + "id" SERIAL NOT NULL, + "session_id" TEXT NOT NULL, + "user_id" INTEGER NOT NULL, + "action_type" TEXT NOT NULL, + "action_description" TEXT NOT NULL, + "action_time" INTEGER NOT NULL, + "ip_address" TEXT NOT NULL, + "user_agent" TEXT NOT NULL, + "api_endpoint" TEXT NOT NULL, + "http_method" TEXT NOT NULL, + "request_payload" JSONB NOT NULL, + "http_status_code" INTEGER NOT NULL, + "status_message" TEXT NOT NULL, + + CONSTRAINT "user_action_log_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_setting" ( + "id" SERIAL NOT NULL, + "user_id" INTEGER NOT NULL, + "first_name" TEXT, + "last_name" TEXT, + "country" TEXT, + "language" TEXT, + "phone" TEXT, + "system_notification" BOOLEAN NOT NULL, + "update_and_subscription_notification" BOOLEAN NOT NULL, + "email_notification" BOOLEAN NOT NULL, + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "user_setting_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_role" ( + "id" SERIAL NOT NULL, + "user_id" INTEGER NOT NULL, + "role_id" INTEGER NOT NULL, + "created_at" INTEGER NOT NULL, + "updated_at" INTEGER NOT NULL, + "deleted_at" INTEGER, + + CONSTRAINT "user_role_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "kyc_bookkeeper_personal_id_file_id_key" ON "kyc_bookkeeper"("personal_id_file_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "kyc_bookkeeper_certification_file_id_key" ON "kyc_bookkeeper"("certification_file_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "company_setting_company_id_key" ON "company_setting"("company_id"); + +-- AddForeignKey +ALTER TABLE "accounting_setting" ADD CONSTRAINT "accounting_setting_company_id_fkey" FOREIGN KEY ("company_id") REFERENCES "company"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "customer_vendor" ADD CONSTRAINT "customer_vendor_company_id_fkey" FOREIGN KEY ("company_id") REFERENCES "company"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "kyc_bookkeeper" ADD CONSTRAINT "kyc_bookkeeper_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "kyc_bookkeeper" ADD CONSTRAINT "kyc_bookkeeper_personal_id_file_id_fkey" FOREIGN KEY ("personal_id_file_id") REFERENCES "file"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "kyc_bookkeeper" ADD CONSTRAINT "kyc_bookkeeper_certification_file_id_fkey" FOREIGN KEY ("certification_file_id") REFERENCES "file"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shortcut" ADD CONSTRAINT "shortcut_accounting_setting_id_fkey" FOREIGN KEY ("accounting_setting_id") REFERENCES "accounting_setting"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_role" ADD CONSTRAINT "user_role_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_role" ADD CONSTRAINT "user_role_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "role"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + + +ALTER SEQUENCE "accounting_setting_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "customer_vendor_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "kyc_bookkeeper_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "news_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "shortcut_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "user_action_log_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "user_setting_id_seq" RESTART WITH 10000000; +ALTER SEQUENCE "user_role_id_seq" RESTART WITH 10000000; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9feb2bdc7..74659102f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -111,37 +111,59 @@ model Authentication { @@map("authentication") } -model Client { - id Int @id @default(autoincrement()) - companyId Int @map("company_id") +model AccountingSetting { + id Int @id @default(autoincrement()) + companyId Int @map("company_id") + salesTaxTaxable Boolean @map("sales_tax_taxable") + salesTaxRate Float @map("sales_tax_rate") + purchaseTaxTaxable Boolean @map("purchase_tax_taxable") + purchaseTaxRate Float @map("purchase_tax_rate") + returnPeriodicity String @map("return_periodicity") + currency String + + company Company @relation(fields: [companyId], references: [id]) + + shortcuts Shortcut[] + + @@map("accounting_setting") +} + + +model CustomerVendor { + id Int @id @default(autoincrement()) + companyId Int @map("company_id") name String - taxId String @map("tax_id") - favorite Boolean - createdAt Int @map("created_at") - updatedAt Int @map("updated_at") - deletedAt Int? @map("deleted_at") - company Company @relation(fields: [companyId], references: [id]) + taxId String @map("tax_id") + type String + note String + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + company Company @relation(fields: [companyId], references: [id]) - @@map("client") + @@map("customer_vendor") } model Company { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) name String - code String - regional String - kycStatus Boolean @map("kyc_status") + taxId String @map("tax_id") + tag String @default("all") imageFileId Int @unique @map("image_file_id") - startDate Int @map("start_date") - createdAt Int @map("created_at") - updatedAt Int @map("updated_at") - deletedAt Int? @map("deleted_at") + startDate Int @map("start_date") + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") - imageFile File @relation("company_image_file", fields: [imageFileId], references: [id]) + imageFile File @relation("company_image_file", fields: [imageFileId], references: [id]) admins Admin[] - clients Client[] + accountingSettings AccountingSetting[] + customerVendors CustomerVendor[] + companySettings CompanySetting[] contracts Contract[] + companyKYCs CompanyKYC[] departments Department[] employees Employee[] invitations Invitation[] @@ -151,13 +173,12 @@ model Company { projects Project[] subscriptions Subscription[] auditReports AuditReport[] - companyKYCs CompanyKYC[] - companySettings CompanySetting[] incomeExpenses IncomeExpense[] accounts Account[] reports Report[] voucherSalaryRecordFolders VoucherSalaryRecordFolder[] + @@map("company") } @@ -199,16 +220,18 @@ model CompanyKYC { } model CompanySetting { - id Int @id @default(autoincrement()) - companyId Int @map("company_id") - autoRenewal Boolean @map("auto_renewal") - notifyTiming Int @map("notify_timing") - notifyChannel String @map("notify_channel") - reminderFreq Int @map("reminder_freq") - createdAt Int @map("created_at") - updatedAt Int @map("updated_at") - deletedAt Int? @map("deleted_at") - company Company @relation(fields: [companyId], references: [id]) + id Int @id @default(autoincrement()) + companyId Int @unique @map("company_id") + taxSerialNumber String @map("tax_serial_number") + representativeName String @map("representative_name") + country String + phone String + address String + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + company Company @relation(fields: [companyId], references: [id]) @@map("company_setting") } @@ -313,14 +336,16 @@ model File { updatedAt Int @map("updated_at") deletedAt Int? @map("deleted_at") - companyKYCregistrationCertificateFile CompanyKYC? @relation("registration_certificate_file") - companyKYCtaxCertificateFile CompanyKYC? @relation("tax_certificate_file") - companyKYCrepresentativeIdCardFile CompanyKYC? @relation("representative_id_card_file") - companyImageFile Company? @relation("company_image_file") - invoiceImageFile Invoice? @relation("invoice_image_file") - ocrImageFile Ocr? @relation("ocr_image_file") - userImageFile User? @relation("user_image_file") - projectImageFile Project? @relation("project_image_file") + companyImageFile Company? @relation("company_image_file") + invoiceImageFile Invoice? @relation("invoice_image_file") + ocrImageFile Ocr? @relation("ocr_image_file") + userImageFile User? @relation("user_image_file") + projectImageFile Project? @relation("project_image_file") + registrationCertificateFile CompanyKYC? @relation("registration_certificate_file") + taxCertificateFile CompanyKYC? @relation("tax_certificate_file") + representativeIdCardFile CompanyKYC? @relation("representative_id_card_file") + personalIdFile KYCBookkeeper? @relation("kyc_personal_id_file") + certificationFile KYCBookkeeper? @relation("kyc_certification_file") @@map("file") } @@ -406,6 +431,29 @@ model Journal { @@map("journal") } +model KYCBookkeeper { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + name String + birthDate String @map("birth_date") + email String + phone String + qualification Boolean + certificationNumber String @map("certification_number") + personalIdType String @map("personal_id_type") + personalIdFileId Int @unique @map("personal_id_file_id") + certificationFileId Int @unique @map("certification_file_id") + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + user User @relation(fields: [userId], references: [id]) + personalIdFile File @relation("kyc_personal_id_file", fields: [personalIdFileId], references: [id]) + certificationFile File @relation("kyc_certification_file", fields: [certificationFileId], references: [id]) + + @@map("kyc_bookkeeper") +} + model LineItem { id Int @id @default(autoincrement()) amount Int @@ -436,6 +484,18 @@ model Milestone { @@map("milestone") } +model News { + id Int @id @default(autoincrement()) + type String + title String + content String + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + @@map("news") +} + model Ocr { id Int @id @default(autoincrement()) aichResultId String @unique @map("aich_result_id") @@ -556,11 +616,13 @@ model Role { id Int @id @default(autoincrement()) name String @unique permissions String[] + lastLoginAt Int @map("last_login_at") @default(0) createdAt Int @map("created_at") updatedAt Int @map("updated_at") deletedAt Int? @map("deleted_at") admins Admin[] invitations Invitation[] + userRoles UserRole[] @@map("role") } @@ -656,12 +718,26 @@ model SalaryRecordProjectHour { @@map("salary_record_project_hour") } +model Shortcut { + id Int @id @default(autoincrement()) + accountingSettingId Int @map("accounting_setting_id") + actionName String @map("action_name") + description String + fieldList Json @map("field_list") + keyList String[] @map("key_list") + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + accountingSetting AccountingSetting @relation(fields: [accountingSettingId], references: [id]) + + @@map("shortcut") +} + model User { id Int @id @default(autoincrement()) name String - fullName String? @map("full_name") email String? - phone String? imageFileId Int @unique @map("image_File_id") createdAt Int @map("created_at") updatedAt Int @map("updated_at") @@ -670,6 +746,8 @@ model User { invitations Invitation[] authentications Authentication[] userAgreements UserAgreement[] + userRoles UserRole[] + kycBookkeepers KYCBookkeeper[] imageFile File @relation("user_image_file", fields: [imageFileId], references: [id]) @@ -690,6 +768,56 @@ model UserAgreement { @@map("user_agreement") } +model UserActionLog { + id Int @id @default(autoincrement()) + sessionId String @map("session_id") + userId Int @map("user_id") + actionType String @map("action_type") + actionDescription String @map("action_description") + actionTime Int @map("action_time") + ipAddress String @map("ip_address") + userAgent String @map("user_agent") + apiEndpoint String @map("api_endpoint") + httpMethod String @map("http_method") + requestPayload Json @map("request_payload") + httpStatusCode Int @map("http_status_code") + statusMessage String @map("status_message") + + @@map("user_action_log") +} + +model UserSetting { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + firstName String? @map("first_name") + lastName String? @map("last_name") + country String? + language String? + phone String? + systemNotification Boolean @map("system_notification") + updateAndSubscriptionNotification Boolean @map("update_and_subscription_notification") + emailNotification Boolean @map("email_notification") + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + @@map("user_setting") +} + +model UserRole { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + roleId Int @map("role_id") + createdAt Int @map("created_at") + updatedAt Int @map("updated_at") + deletedAt Int? @map("deleted_at") + + user User @relation(fields: [userId], references: [id]) + role Role @relation(fields: [roleId], references: [id]) + + @@map("user_role") +} + model Voucher { id Int @id @default(autoincrement()) journalId Int @unique @map("journal_id") diff --git a/prisma/seed.ts b/prisma/seed.ts index ef941bbda..56dbfedce 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -23,7 +23,6 @@ import subscriptions from '@/seed_json/subscription.json'; import orders from '@/seed_json/order.json'; import paymentRecords from '@/seed_json/payment_record.json'; import invitations from '@/seed_json/invitation.json'; -import clients from '@/seed_json/client.json'; import journals from '@/seed_json/journal.json'; import vouchers from '@/seed_json/voucher.json'; import lineItems from '@/seed_json/line_item.json'; @@ -105,12 +104,6 @@ async function createCompanyKYC() { }); } -async function createClient() { - await prisma.client.createMany({ - data: clients, - }); -} - async function createDepartment() { await prisma.department.createMany({ data: departments, @@ -264,7 +257,6 @@ async function main() { await createRole(); await createCompanyKYC(); - await createClient(); await createAccount(); await createAdmin(); await createDepartment(); diff --git a/prisma/seed_json/client.json b/prisma/seed_json/client.json deleted file mode 100644 index 31d58b4f0..000000000 --- a/prisma/seed_json/client.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "id": 1000, - "companyId": 1000, - "name": "Test Client", - "taxId": "1234567890", - "favorite": false, - "createdAt": 1634567890, - "updatedAt": 1634567890 - } -] diff --git a/prisma/seed_json/company.json b/prisma/seed_json/company.json index 9784d333a..b1b02dfdc 100644 --- a/prisma/seed_json/company.json +++ b/prisma/seed_json/company.json @@ -2,9 +2,7 @@ { "id": 1000, "name": "Test Company", - "code": "TEST123", - "regional": "United States", - "kycStatus": true, + "taxId": "TEST123", "imageFileId": 1000, "startDate": 1717751006, "createdAt": 1717751006, @@ -13,9 +11,7 @@ { "id": 1001, "name": "Trial Company", - "code": "TRIAL123", - "regional": "United States", - "kycStatus": true, + "taxId": "TRIAL123", "imageFileId": 1001, "startDate": 1717751006, "createdAt": 1717751006, @@ -24,9 +20,7 @@ { "id": 1002, "name": "Public_Company", - "code": "1", - "regional": "Taiwan", - "kycStatus": false, + "taxId": "1", "imageFileId": 1002, "startDate": 1717751006, "createdAt": 1717751006, @@ -35,9 +29,7 @@ { "id": 8867, "name": "CNN", - "code": "202406111752", - "regional": "Taiwan", - "kycStatus": false, + "taxId": "202406111752", "imageFileId": 1003, "startDate": 1717751006, "createdAt": 1717751006, diff --git a/prisma/seed_json/user.json b/prisma/seed_json/user.json index 0c5398639..71c7c0140 100644 --- a/prisma/seed_json/user.json +++ b/prisma/seed_json/user.json @@ -2,9 +2,7 @@ { "id": 1000, "name": "Test_User_1", - "fullName": "Test User 1", "email": "test1@gmail.com", - "phone": "1234567891", "imageFileId": 1002, "createdAt": 1, "updatedAt": 1 @@ -12,9 +10,7 @@ { "id": 1001, "name": "Test_User_2", - "fullName": "Test User 2", "email": "test2@gmail.com", - "phone": "1234567892", "imageFileId": 1003, "createdAt": 1, "updatedAt": 1 @@ -22,9 +18,7 @@ { "id": 1002, "name": "Test_User_3", - "fullName": "Test User 3", "email": "test3@gmail.com", - "phone": "1234567893", "imageFileId": 1004, "createdAt": 1, "updatedAt": 1 @@ -32,9 +26,7 @@ { "id": 1003, "name": "Test_User", - "fullName": "Test User", "email": "test@gmail.com", - "phone": "1234567890", "imageFileId": 1005, "createdAt": 1, "updatedAt": 1 diff --git a/public/icons/graduation_cap.svg b/public/icons/graduation_cap.svg new file mode 100644 index 000000000..dcabca890 --- /dev/null +++ b/public/icons/graduation_cap.svg @@ -0,0 +1,9 @@ + diff --git a/public/icons/information_desk.svg b/public/icons/information_desk.svg new file mode 100644 index 000000000..11fc019bf --- /dev/null +++ b/public/icons/information_desk.svg @@ -0,0 +1,11 @@ + diff --git a/public/images/accountant.png b/public/images/accountant.png new file mode 100644 index 000000000..d7c61069d Binary files /dev/null and b/public/images/accountant.png differ diff --git a/public/images/bg_bookkeeper.png b/public/images/bg_bookkeeper.png new file mode 100644 index 000000000..7f836cc35 Binary files /dev/null and b/public/images/bg_bookkeeper.png differ diff --git a/public/images/bg_educational_trial_version.png b/public/images/bg_educational_trial_version.png new file mode 100644 index 000000000..779403d88 Binary files /dev/null and b/public/images/bg_educational_trial_version.png differ diff --git a/public/images/bg_select_role.png b/public/images/bg_select_role.png new file mode 100644 index 000000000..cc24c7f40 Binary files /dev/null and b/public/images/bg_select_role.png differ diff --git a/public/images/bookkeeper.png b/public/images/bookkeeper.png new file mode 100644 index 000000000..eb459d9a2 Binary files /dev/null and b/public/images/bookkeeper.png differ diff --git a/public/images/educational_trial.png b/public/images/educational_trial.png new file mode 100644 index 000000000..e56a34adb Binary files /dev/null and b/public/images/educational_trial.png differ diff --git a/src/components/asset/asset_list_page_body.tsx b/src/components/asset/asset_list_page_body.tsx index e31450a8d..e7797e662 100644 --- a/src/components/asset/asset_list_page_body.tsx +++ b/src/components/asset/asset_list_page_body.tsx @@ -2,7 +2,7 @@ import AssetList from '@/components/asset/asset_list'; const AssetListPageBody = () => { return ( -
+ iSunFA offers various roles for users to choose from, each with its own dedicated + interface and commonly used features. You can select the role that best suits your needs, + allowing iSunFA to assist you in your work. The key advantage of iSunFA lies in its + role-optimized interface and AI-integrated accounting, enabling you to complete tasks more + efficiently! +
+{`A bookkeeper is a professional financial worker responsible for managing the daily financial records and accounting tasks of a business or individual. Their primary duties include preparing accounting vouchers, recording entries in ledgers, reconciling accounts, and generating financial statements to ensure the accuracy and completeness of financial information.`}
+General Ledger, Voucher Issuance, Preparation of Financial and Tax Reports
++ {`The iSunFA Student Version is an educational tool tailored for students and interns in the accounting field. It offers practical hands-on experience in managing financial tasks such as creating accounting vouchers, journal entries, and reconciling accounts. It's ideal for building a solid foundation in financial management and preparing for professional bookkeeping or accounting roles.`} +
+General Ledger, Voucher Issuance
+- {t(`journal:ACCOUNT_TYPE.${value.toUpperCase()}`)} -
-- {t('journal:ADD_NEW_VOUCHER.NO_ACCOUNTING_FOUND')} -
- ); - - const displayedAccountingMenu = isAccountingMenuOpen ? ( -{accountTitle}
- ); - - return ( - <> - {/* Info: (20240927 - Julian) Accounting */} -{counterparty}
++ {counterparty} +
); const counterMenu = @@ -641,12 +514,16 @@ const NewVoucherForm = () => { debitChangeHandler={debitChangeHandler} creditChangeHandler={creditChangeHandler} flagOfClear={flagOfClear} + flagOfSubmit={flagOfSubmit} + accountIsNull={isAccountingNull} + amountIsZero={haveZeroLine} + amountNotEqual={totalCredit !== totalDebit} /> ); }); const voucherLineBlock = ( -