├── .github ├── actions │ └── slack-notify │ │ └── action.yml └── workflows │ ├── _initail_setup_dev_1.yml │ ├── _initail_setup_dev_2.yml │ ├── _initial_setup_prod_1.yml │ ├── _initial_setup_prod_2.yml │ ├── codeql-analysis.yml │ ├── db_backup.yml │ ├── db_dev_script.yml │ ├── db_prod_script.yml │ ├── db_sync.yml │ ├── django_dev.yml │ ├── django_prod.yml │ ├── dokube_nginx.yml │ ├── dokube_web.yml │ ├── helm_dev.yml │ ├── helm_prod.yml │ ├── svelte_dev.yml │ ├── svelte_prod.yml │ ├── vue_dev.yml │ └── vue_prod.yml ├── .gitignore ├── README.md ├── SECURITY.md ├── app ├── django │ ├── _assets │ │ ├── book │ │ │ ├── css │ │ │ │ └── app.css │ │ │ ├── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ └── js │ │ │ │ └── app.js │ │ ├── common │ │ │ └── js │ │ │ │ ├── daum_post_api.js │ │ │ │ └── formset_add_form.js │ │ ├── fonts │ │ │ └── vendor │ │ │ │ └── font-awesome │ │ │ │ └── fontawesome-webfont.woff2 │ │ ├── ibs │ │ │ ├── css │ │ │ │ ├── app-dark.min.css │ │ │ │ ├── app.min.css │ │ │ │ ├── icons.min.css │ │ │ │ └── vendor │ │ │ │ │ ├── fullcalendar.min.css │ │ │ │ │ └── jquery-jvectormap-1.2.2.css │ │ │ ├── fonts │ │ │ │ ├── Nunito-Bold.woff │ │ │ │ ├── Nunito-Light.woff │ │ │ │ ├── Nunito-Regular.woff │ │ │ │ ├── Nunito-SemiBold.woff │ │ │ │ ├── dripicons-v2.woff │ │ │ │ ├── materialdesignicons-webfont.woff2 │ │ │ │ └── unicons.woff2 │ │ │ ├── images │ │ │ │ ├── bg-auth.jpg │ │ │ │ ├── bg-auth1.jpg │ │ │ │ ├── bg-pattern-dark.png │ │ │ │ ├── bg-pattern-light.svg │ │ │ │ ├── brands │ │ │ │ │ ├── bitbucket.png │ │ │ │ │ ├── dribbble.png │ │ │ │ │ ├── dropbox.png │ │ │ │ │ ├── g-suite.png │ │ │ │ │ ├── github.png │ │ │ │ │ └── slack.png │ │ │ │ ├── carousel │ │ │ │ │ ├── 001.png │ │ │ │ │ ├── 002.png │ │ │ │ │ ├── 003.png │ │ │ │ │ ├── 004.png │ │ │ │ │ ├── 005.png │ │ │ │ │ ├── 006.png │ │ │ │ │ ├── 007.png │ │ │ │ │ ├── 008.png │ │ │ │ │ ├── 009.png │ │ │ │ │ ├── 010.png │ │ │ │ │ ├── 011.png │ │ │ │ │ ├── 012.png │ │ │ │ │ └── 013.png │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon.png │ │ │ │ ├── flags │ │ │ │ │ ├── germany.jpg │ │ │ │ │ ├── italy.jpg │ │ │ │ │ ├── korea.jpg │ │ │ │ │ ├── russia.jpg │ │ │ │ │ ├── spain.jpg │ │ │ │ │ └── us.jpg │ │ │ │ ├── help-icon.svg │ │ │ │ ├── logo-dark.png │ │ │ │ ├── logo.png │ │ │ │ ├── logo.svg │ │ │ │ ├── sygnet.png │ │ │ │ └── users │ │ │ │ │ ├── avatar-1.jpg │ │ │ │ │ ├── avatar-2.jpg │ │ │ │ │ ├── avatar-4.jpg │ │ │ │ │ └── avatar-5.jpg │ │ │ └── js │ │ │ │ ├── app.min.js │ │ │ │ ├── pages │ │ │ │ ├── demo.calendar.js │ │ │ │ └── demo.dashboard.js │ │ │ │ ├── vendor.min.js │ │ │ │ └── vendor │ │ │ │ ├── apexcharts.min.js │ │ │ │ ├── fullcalendar.min.js │ │ │ │ ├── jquery-jvectormap-1.2.2.min.js │ │ │ │ ├── jquery-jvectormap-world-mill-en.js │ │ │ │ └── jquery-ui.min.js │ │ └── svelte │ │ │ ├── favicon.png │ │ │ └── global.css │ ├── _config │ │ ├── __init__.py │ │ ├── asgi.py │ │ ├── asset_storage.py │ │ ├── database_router.py │ │ ├── settings │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ └── local.py │ │ ├── urls.py │ │ └── wsgi.py │ ├── _excel │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── _pdf │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── templates │ │ │ └── pdf │ │ │ │ ├── bill_control.html │ │ │ │ ├── calculation_by_contractor.html │ │ │ │ ├── partials │ │ │ │ ├── bill_page.html │ │ │ │ ├── calculation_page.html │ │ │ │ └── payment_page.html │ │ │ │ └── payments_by_contractor.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── accounts │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── install │ │ │ │ ├── create_company.html │ │ │ │ ├── create_project.html │ │ │ │ └── create_superuser.html │ │ ├── templatetags │ │ │ └── sort_apps.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── apiV1 │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── pagination.py │ │ ├── permission.py │ │ ├── serializers │ │ │ ├── __init__.py │ │ │ ├── accounts.py │ │ │ ├── board.py │ │ │ ├── cash.py │ │ │ ├── company.py │ │ │ ├── contract.py │ │ │ ├── docs.py │ │ │ ├── ibs.py │ │ │ ├── items.py │ │ │ ├── notice.py │ │ │ ├── payment.py │ │ │ ├── project.py │ │ │ └── work │ │ │ │ ├── __init__.py │ │ │ │ ├── github.py │ │ │ │ ├── inform.py │ │ │ │ ├── issue.py │ │ │ │ ├── logging.py │ │ │ │ └── project.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views │ │ │ ├── __init__.py │ │ │ ├── accounts.py │ │ │ ├── board.py │ │ │ ├── cash.py │ │ │ ├── company.py │ │ │ ├── contract.py │ │ │ ├── docs.py │ │ │ ├── ibs.py │ │ │ ├── items.py │ │ │ ├── notice.py │ │ │ ├── payment.py │ │ │ ├── project.py │ │ │ └── work │ │ │ ├── __init__.py │ │ │ ├── github.py │ │ │ ├── inform.py │ │ │ ├── issue.py │ │ │ ├── logging.py │ │ │ └── project.py │ ├── board │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py │ ├── book │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── book │ │ │ │ ├── book_confirm_delete.html │ │ │ │ ├── book_detail.html │ │ │ │ ├── book_form.html │ │ │ │ ├── book_list.html │ │ │ │ ├── layouts │ │ │ │ ├── base.html │ │ │ │ ├── footer.html │ │ │ │ └── navigation.html │ │ │ │ └── subjects │ │ │ │ ├── index.html │ │ │ │ ├── main │ │ │ │ ├── content.html │ │ │ │ ├── search.html │ │ │ │ └── subject_confirm_delete.html │ │ │ │ ├── partial │ │ │ │ ├── footer │ │ │ │ │ ├── back-to-top.html │ │ │ │ │ ├── prev-next.html │ │ │ │ │ └── tail-nav.html │ │ │ │ ├── form.html │ │ │ │ ├── header │ │ │ │ │ └── sub-top.html │ │ │ │ └── sidebar.html │ │ │ │ └── subject_form.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── cash │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── cash │ │ │ │ ├── cashbook_form.html │ │ │ │ ├── cashbook_list.html │ │ │ │ ├── cashbook_report.html │ │ │ │ ├── partials │ │ │ │ ├── account_subject.html │ │ │ │ ├── head_menu_cash.html │ │ │ │ ├── head_menu_p_cash.html │ │ │ │ ├── head_menu_payment.html │ │ │ │ ├── payment_form_data_table.html │ │ │ │ ├── payment_form_form_table.html │ │ │ │ ├── payment_form_info.html │ │ │ │ ├── payment_form_search_area.html │ │ │ │ ├── payment_list_search_form.html │ │ │ │ ├── payment_list_summary.html │ │ │ │ └── payment_list_table.html │ │ │ │ ├── project_payment_form.html │ │ │ │ ├── project_payment_list.html │ │ │ │ ├── projectcashbook_form.html │ │ │ │ ├── projectcashbook_list.html │ │ │ │ └── projectcashbook_report.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── company │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── company │ │ │ │ ├── company_form.html │ │ │ │ ├── company_list.html │ │ │ │ └── partials │ │ │ │ ├── company_list.html │ │ │ │ └── head_menu.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── contract │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── contract │ │ │ │ ├── contract_form.html │ │ │ │ ├── contract_list.html │ │ │ │ ├── dashboard.html │ │ │ │ ├── partials │ │ │ │ ├── contract_summary.html │ │ │ │ ├── contract_table.html │ │ │ │ ├── head_menu.html │ │ │ │ ├── list_search_form.html │ │ │ │ ├── release_table.html │ │ │ │ ├── reservation_table.html │ │ │ │ └── unit_number_graph.html │ │ │ │ └── release_form.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── docs │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py │ ├── ibs │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── fixtures │ │ │ ├── dumpdata.sh │ │ │ ├── loaddata.sh │ │ │ └── seeds-data.json │ │ ├── models.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── items │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py │ ├── manage.py │ ├── migrations.sh │ ├── notice │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── notice │ │ │ │ ├── contractor_bill_publish.html │ │ │ │ └── partials │ │ │ │ ├── bill_issue_form.html │ │ │ │ ├── contractor_payment_list.html │ │ │ │ ├── contractor_search_form.html │ │ │ │ └── head_menu.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── payment │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py │ ├── project │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── models.py │ │ ├── templates │ │ │ └── project │ │ │ │ ├── partials │ │ │ │ ├── head_menu.html │ │ │ │ ├── second_menu.html │ │ │ │ └── site_sub_menu.html │ │ │ │ ├── project_confirm_delete.html │ │ │ │ ├── project_form.html │ │ │ │ ├── project_list.html │ │ │ │ ├── settings_down_payment.html │ │ │ │ ├── settings_floor_type.html │ │ │ │ ├── settings_order_group.html │ │ │ │ ├── settings_payment_order.html │ │ │ │ ├── settings_sales_price.html │ │ │ │ ├── settings_unit_type.html │ │ │ │ ├── site_contract_manage.html │ │ │ │ ├── site_manage.html │ │ │ │ └── site_owner_manage.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── templates │ │ ├── account │ │ │ ├── account_inactive.html │ │ │ ├── base.html │ │ │ ├── email.html │ │ │ ├── email │ │ │ │ ├── base_message.txt │ │ │ │ ├── email_confirmation_message.txt │ │ │ │ ├── email_confirmation_signup_message.txt │ │ │ │ ├── email_confirmation_signup_subject.txt │ │ │ │ ├── email_confirmation_subject.txt │ │ │ │ ├── password_reset_key_message.txt │ │ │ │ └── password_reset_key_subject.txt │ │ │ ├── email_confirm.html │ │ │ ├── login.html │ │ │ ├── logout.html │ │ │ ├── messages │ │ │ │ ├── cannot_delete_primary_email.txt │ │ │ │ ├── email_confirmation_sent.txt │ │ │ │ ├── email_confirmed.txt │ │ │ │ ├── email_deleted.txt │ │ │ │ ├── logged_in.txt │ │ │ │ ├── logged_out.txt │ │ │ │ ├── password_changed.txt │ │ │ │ ├── password_set.txt │ │ │ │ ├── primary_email_set.txt │ │ │ │ └── unverified_primary_email.txt │ │ │ ├── password_change.html │ │ │ ├── password_reset.html │ │ │ ├── password_reset_done.html │ │ │ ├── password_reset_from_key.html │ │ │ ├── password_reset_from_key_done.html │ │ │ ├── password_set.html │ │ │ ├── signup.html │ │ │ ├── signup_closed.html │ │ │ ├── snippets │ │ │ │ └── already_logged_in.html │ │ │ ├── verification_sent.html │ │ │ └── verified_email_required.html │ │ ├── admin │ │ │ ├── index.html │ │ │ └── nav_sidebar.html │ │ ├── base-docs.html │ │ ├── base-svelte.html │ │ ├── base-vue.html │ │ ├── errors │ │ │ ├── 404.html │ │ │ └── 500.html │ │ ├── ibs │ │ │ ├── layouts │ │ │ │ ├── base.html │ │ │ │ ├── footer.html │ │ │ │ ├── header.html │ │ │ │ ├── partials │ │ │ │ │ ├── menu_company_cash.html │ │ │ │ │ ├── menu_company_docs.html │ │ │ │ │ ├── menu_company_settings.html │ │ │ │ │ ├── menu_contract.html │ │ │ │ │ ├── menu_dashboard.html │ │ │ │ │ ├── menu_humanresource.html │ │ │ │ │ ├── menu_new_project.html │ │ │ │ │ ├── menu_notice.html │ │ │ │ │ ├── menu_payment.html │ │ │ │ │ ├── menu_project_cash.html │ │ │ │ │ ├── menu_project_docs.html │ │ │ │ │ └── menu_schedule.html │ │ │ │ ├── right_side.html │ │ │ │ └── sidebar.html │ │ │ ├── main │ │ │ │ ├── 1_1_dashboard.html │ │ │ │ ├── 2_1_schedule.html │ │ │ │ ├── 3_1_list.html │ │ │ │ ├── 3_2_post.html │ │ │ │ ├── 3_3_contractor.html │ │ │ │ └── 3_4_sheet.html │ │ │ └── partials │ │ │ │ ├── content_title.html │ │ │ │ ├── logo.html │ │ │ │ ├── no_data.html │ │ │ │ └── project_select.html │ │ ├── layouts │ │ │ ├── registration-1.html │ │ │ └── registration-2.html │ │ ├── partials │ │ │ ├── center_modal.html │ │ │ └── pagination.html │ │ ├── registration │ │ │ ├── login-form.html │ │ │ ├── login.html │ │ │ ├── password_change_done.html │ │ │ ├── password_change_form.html │ │ │ ├── password_reset_done.html │ │ │ ├── password_reset_form.html │ │ │ ├── register-form.html │ │ │ ├── register.html │ │ │ └── register_done.html │ │ └── robots.txt │ └── work │ │ ├── __init__.py │ │ ├── admin │ │ ├── __init__.py │ │ ├── github.py │ │ ├── inform.py │ │ ├── issue.py │ │ ├── logging.py │ │ └── project.py │ │ ├── apps.py │ │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── fetch_commits.py │ │ ├── models │ │ ├── __init__.py │ │ ├── github.py │ │ ├── inform.py │ │ ├── issue.py │ │ ├── logging.py │ │ └── project.py │ │ ├── signals.py │ │ ├── templates │ │ └── mail │ │ │ ├── issue_create.html │ │ │ ├── issue_progress.html │ │ │ └── issue_reassign.html │ │ ├── templatetags │ │ ├── __init__.py │ │ └── markdown_filters.py │ │ ├── tests.py │ │ └── views.py ├── svelte │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── pnpm-lock.yaml │ ├── public │ │ ├── favicon.png │ │ ├── global.css │ │ └── index.html │ ├── rollup.config.js │ ├── scripts │ │ └── setupTypeScript.js │ └── src │ │ ├── App.svelte │ │ └── main.js └── vue │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .prettierrc.json │ ├── README.md │ ├── cypress.config.ts │ ├── cypress │ ├── e2e │ │ ├── example.cy.ts │ │ └── tsconfig.json │ ├── fixtures │ │ └── example.json │ └── support │ │ ├── commands.ts │ │ └── e2e.ts │ ├── docs │ ├── .vitepress │ │ └── config.ts │ ├── authority │ │ ├── admin-page.md │ │ └── index.md │ ├── cashes │ │ ├── manage.md │ │ └── settings.md │ ├── contract │ │ ├── bill-notice.md │ │ ├── index.md │ │ ├── payment.md │ │ └── release.md │ ├── document │ │ ├── index.md │ │ └── legal-case.md │ ├── favicon.png │ ├── favicon.svg │ ├── index.md │ ├── intro │ │ └── getting-started.md │ └── settings │ │ ├── company.md │ │ ├── details.md │ │ ├── project.md │ │ └── site-manage.md │ ├── env.d.ts │ ├── index.html │ ├── package.json │ ├── pnpm-lock.yaml │ ├── public │ ├── img │ │ ├── NoImage.jpeg │ │ └── icons │ │ │ ├── android-icon-144x144.png │ │ │ ├── android-icon-192x192.png │ │ │ ├── android-icon-36x36.png │ │ │ ├── android-icon-48x48.png │ │ │ ├── android-icon-72x72.png │ │ │ ├── android-icon-96x96.png │ │ │ ├── apple-icon-114x114.png │ │ │ ├── apple-icon-120x120.png │ │ │ ├── apple-icon-144x144.png │ │ │ ├── apple-icon-152x152.png │ │ │ ├── apple-icon-180x180.png │ │ │ ├── apple-icon-57x57.png │ │ │ ├── apple-icon-60x60.png │ │ │ ├── apple-icon-72x72.png │ │ │ ├── apple-icon-76x76.png │ │ │ ├── apple-icon-precomposed.png │ │ │ ├── apple-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ ├── favicon.ico │ │ │ ├── manifest.json │ │ │ ├── ms-icon-144x144.png │ │ │ ├── ms-icon-150x150.png │ │ │ ├── ms-icon-310x310.png │ │ │ └── ms-icon-70x70.png │ └── robots.txt │ ├── src │ ├── App.vue │ ├── api │ │ └── index.ts │ ├── assets │ │ ├── base.css │ │ ├── brand │ │ │ ├── current-logo.ts │ │ │ ├── logo-negative.ts │ │ │ ├── logo.ts │ │ │ └── sygnet.ts │ │ ├── icons │ │ │ └── index.ts │ │ ├── images │ │ │ └── avatars │ │ │ │ ├── 1.jpg │ │ │ │ ├── 2.jpg │ │ │ │ ├── 3.jpg │ │ │ │ ├── 4.jpg │ │ │ │ ├── 5.jpg │ │ │ │ ├── 6.jpg │ │ │ │ ├── 7.jpg │ │ │ │ └── 8.jpg │ │ ├── logo.svg │ │ └── main.css │ ├── components │ │ ├── BackToTop │ │ │ └── index.vue │ │ ├── BlankComponent.vue │ │ ├── Comments │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Comment.vue │ │ │ │ ├── CommentForm.vue │ │ │ │ └── CommentList.vue │ │ ├── ContChoicer │ │ │ └── Index.vue │ │ ├── DatePicker │ │ │ └── index.vue │ │ ├── DaumPostcode │ │ │ ├── address.ts │ │ │ └── index.vue │ │ ├── Documents │ │ │ ├── CategoryTabs.vue │ │ │ ├── DocsForm.vue │ │ │ ├── DocsList.vue │ │ │ ├── DocsView.vue │ │ │ ├── ListController.vue │ │ │ ├── ModalCaseForm.vue │ │ │ └── components │ │ │ │ ├── CateListModal.vue │ │ │ │ ├── Docs.vue │ │ │ │ ├── TopDocs.vue │ │ │ │ └── TypeListModal.vue │ │ ├── DownLoad │ │ │ ├── ExcelExport.vue │ │ │ └── PdfExport.vue │ │ ├── FileUpload.vue │ │ ├── LawSuitCase │ │ │ ├── CaseForm.vue │ │ │ ├── CaseList.vue │ │ │ ├── CaseView.vue │ │ │ ├── ListController.vue │ │ │ └── components │ │ │ │ ├── Case.vue │ │ │ │ └── court.ts │ │ ├── Loading │ │ │ └── Index.vue │ │ ├── MdEditor │ │ │ └── Index.vue │ │ ├── Modals │ │ │ ├── AlertModal.vue │ │ │ ├── ConfirmModal.vue │ │ │ ├── FormModal.vue │ │ │ └── TodoModal.vue │ │ ├── MultiSelect │ │ │ └── index.vue │ │ ├── NotFound.vue │ │ ├── OtherParts │ │ │ ├── FileForms.vue │ │ │ ├── LinkForms.vue │ │ │ ├── PostContent.vue │ │ │ ├── PostInfo.vue │ │ │ ├── PostedFile.vue │ │ │ └── PostedLink.vue │ │ ├── Pagination │ │ │ ├── Pagination.ts │ │ │ └── index.ts │ │ ├── Posts │ │ │ ├── CategoryTabs.vue │ │ │ ├── ListController.vue │ │ │ ├── PostForm.vue │ │ │ ├── PostList.vue │ │ │ ├── PostView.vue │ │ │ └── components │ │ │ │ ├── BoardListModal.vue │ │ │ │ ├── CateListModal.vue │ │ │ │ ├── Post.vue │ │ │ │ └── TopPosts.vue │ │ ├── QuillEditor │ │ │ └── index.vue │ │ ├── Spinner │ │ │ └── index.vue │ │ ├── TableTitleRow.vue │ │ ├── TodoListApp │ │ │ ├── Todo.vue │ │ │ ├── index.scss │ │ │ └── index.vue │ │ └── __tests__ │ │ │ ├── BackToTop.spec.ts │ │ │ ├── BlankComponent.spec.ts │ │ │ ├── DatePicker.spec.ts │ │ │ ├── DaumPostCode.spec.ts │ │ │ ├── Documents.spec.ts │ │ │ ├── DownLoad.spec.ts │ │ │ ├── FileUpload.spec.ts │ │ │ ├── Modals.spec.ts │ │ │ ├── MultiSelect.spec.ts │ │ │ ├── NotFound.spec.ts │ │ │ ├── Pagination.spec.ts │ │ │ ├── QuillEditor.spec.ts │ │ │ ├── Spinner.spec.ts │ │ │ ├── TableTitleRow.spec.ts │ │ │ └── TodoListApp.spec.ts │ ├── layouts │ │ ├── ContentBody │ │ │ └── Index.vue │ │ ├── ContentHeader │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── CompanySelect.vue │ │ │ │ ├── HeaderNav.vue │ │ │ │ └── ProjectSelect.vue │ │ ├── DefaultLayout.vue │ │ ├── __tests__ │ │ │ ├── App.spec.ts │ │ │ ├── ContentBody.spec.ts │ │ │ ├── ContentHeader.spec.ts │ │ │ └── DefaultLayout.spec.ts1 │ │ ├── _nav.ts │ │ └── containers │ │ │ ├── AppAside.vue │ │ │ ├── AppBreadcrumb.vue │ │ │ ├── AppFooter.vue │ │ │ ├── AppHeader.vue │ │ │ ├── AppHeaderDropdown.vue │ │ │ ├── AppSidebar.vue │ │ │ ├── AppSidebarNav.ts │ │ │ ├── TagsView.vue │ │ │ └── __tests__ │ │ │ ├── AppAside.spec.ts │ │ │ ├── AppFooter.spec.ts │ │ │ ├── AppHeader.spec.ts │ │ │ ├── AppSidebar.spec.ts │ │ │ ├── DropdownAccnt.spec.ts │ │ │ └── TagsView.spec.ts │ ├── main.ts │ ├── plugins │ │ ├── vuetify.ts │ │ └── webfontloader.ts │ ├── public │ │ └── favicon.ico │ ├── router │ │ ├── index.ts │ │ ├── modules │ │ │ ├── comCash.ts │ │ │ ├── comDocs.ts │ │ │ ├── contracts.ts │ │ │ ├── hrManage.ts │ │ │ ├── mypage.ts │ │ │ ├── notices.ts │ │ │ ├── payments.ts │ │ │ ├── proCash.ts │ │ │ ├── proDocs.ts │ │ │ ├── projects.ts │ │ │ ├── settings.ts │ │ │ ├── workProject.ts │ │ │ └── workSetting.ts │ │ └── routes.ts │ ├── shims-vue.d.ts │ ├── shims-vuetify.d.ts │ ├── store │ │ ├── index.ts │ │ ├── pinia │ │ │ ├── account.ts │ │ │ ├── board.ts │ │ │ ├── comCash.ts │ │ │ ├── company.ts │ │ │ ├── contract.ts │ │ │ ├── docs.ts │ │ │ ├── ibs.ts │ │ │ ├── notice.ts │ │ │ ├── payment.ts │ │ │ ├── proCash.ts │ │ │ ├── project.ts │ │ │ ├── project_data.ts │ │ │ ├── project_site.ts │ │ │ ├── schedule.ts │ │ │ ├── tagsView.ts │ │ │ ├── work_github.ts │ │ │ ├── work_inform.ts │ │ │ ├── work_issue.ts │ │ │ ├── work_logging.ts │ │ │ └── work_project.ts │ │ └── types │ │ │ ├── accounts.ts │ │ │ ├── board.ts │ │ │ ├── comCash.ts │ │ │ ├── company.ts │ │ │ ├── contract.ts │ │ │ ├── docs.ts │ │ │ ├── notice.ts │ │ │ ├── payment.ts │ │ │ ├── proCash.ts │ │ │ ├── project.ts │ │ │ ├── schedule.ts │ │ │ ├── settings.ts │ │ │ ├── tagsView.ts │ │ │ ├── work_github.ts │ │ │ ├── work_inform.ts │ │ │ ├── work_issue.ts │ │ │ ├── work_logging.ts │ │ │ └── work_project.ts │ ├── styles │ │ ├── _custom.scss │ │ ├── _layout.scss │ │ ├── _transition.scss │ │ ├── _variables.scss │ │ ├── customize │ │ │ ├── _calendar.scss │ │ │ ├── _datepicker.scss │ │ │ └── _multi_select.scss │ │ ├── style.scss │ │ └── ui │ │ │ └── scss │ │ │ ├── mixins │ │ │ └── _theme.scss │ │ │ └── themes │ │ │ ├── dark.scss │ │ │ └── dark │ │ │ ├── _root.scss │ │ │ ├── _utilities.scss │ │ │ └── _variables.scss │ ├── types │ │ └── images.d.ts │ ├── utils │ │ ├── areaMixins.ts │ │ ├── baseMixins.ts │ │ ├── cssMixins.ts │ │ ├── docsMixins.ts │ │ ├── helper.ts │ │ ├── nprogress.ts │ │ ├── pageAuth.ts │ │ └── postMixins.ts │ └── views │ │ ├── _Accounts │ │ ├── Login.vue │ │ ├── NoAuth.vue │ │ ├── PasswordReset.vue │ │ ├── Register.vue │ │ ├── RegisterCode.vue │ │ └── components │ │ │ ├── FindPassword.vue │ │ │ ├── LoginForm.vue │ │ │ ├── RegisterForm.vue │ │ │ ├── ResetForm.vue │ │ │ └── SocialLogin.vue │ │ ├── _Dashboard │ │ ├── Index.vue │ │ └── components │ │ │ ├── Charts │ │ │ ├── CChartBarExample.vue │ │ │ ├── CChartDoughnutExample.vue │ │ │ ├── CChartLineExample.vue │ │ │ ├── CChartPieExample.vue │ │ │ ├── CChartPolarAreaExample.vue │ │ │ ├── CChartRadarExample.vue │ │ │ ├── Charts.vue │ │ │ ├── MainChartExample.vue │ │ │ └── index.js │ │ │ ├── MainCarousel.vue │ │ │ ├── NoticeBoard │ │ │ ├── Index.vue │ │ │ └── ListComp.vue │ │ │ └── WiseWord.vue │ │ ├── _MyPage │ │ ├── Modify │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AvatarInput.vue │ │ │ │ ├── CropperModal.vue │ │ │ │ ├── PasswordChange.vue │ │ │ │ ├── PasswordCheck.vue │ │ │ │ └── ProfileForm.vue │ │ ├── MyTodoList │ │ │ └── Index.vue │ │ ├── OwnDocs │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Docs.vue │ │ │ │ ├── DocsList.vue │ │ │ │ └── ListController.vue │ │ ├── OwnInfo │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ └── UserProfile.vue │ │ ├── OwnPost │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Comment.vue │ │ │ │ ├── CommentList.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Post.vue │ │ │ │ └── PostList.vue │ │ ├── OwnScrap │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── DocScrape.vue │ │ │ │ ├── DocScrapeList.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── PostScrape.vue │ │ │ │ └── PostScrapeList.vue │ │ ├── Secession │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ └── PasswordCheck.vue │ │ ├── TrashCan │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ListController.vue │ │ │ │ ├── TrashDocs.vue │ │ │ │ ├── TrashDocsList.vue │ │ │ │ └── TrashDocsView.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── _Schedules │ │ ├── components │ │ │ └── CalendarInfo.vue │ │ └── index.vue │ │ ├── _Work │ │ ├── Manages │ │ │ ├── Activity │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ ├── ActivityLogs.vue │ │ │ │ │ ├── ActivityLogsComponent.vue │ │ │ │ │ └── aside │ │ │ │ │ └── AsideActivity.vue │ │ │ ├── Calendar │ │ │ │ └── Index.vue │ │ │ ├── Gantt │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ └── GanttChart.vue │ │ │ ├── Issues │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ ├── FormInIssueCategory.vue │ │ │ │ │ ├── FormInIssueVersion.vue │ │ │ │ │ ├── IssueControl.vue │ │ │ │ │ ├── IssueDropDown.vue │ │ │ │ │ ├── IssueForm.vue │ │ │ │ │ ├── IssueHistory.vue │ │ │ │ │ ├── IssueList.vue │ │ │ │ │ ├── IssueReport.vue │ │ │ │ │ ├── IssueView.vue │ │ │ │ │ ├── SearchList.vue │ │ │ │ │ ├── aside │ │ │ │ │ ├── AsideIssue.vue │ │ │ │ │ └── WatcherAdd.vue │ │ │ │ │ ├── histories │ │ │ │ │ ├── AtomicComment.vue │ │ │ │ │ ├── AtomicLog.vue │ │ │ │ │ └── AtomicTimeEntry.vue │ │ │ │ │ ├── issueFiles │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── relations │ │ │ │ │ ├── AddRelationForm.vue │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── Summary.vue │ │ │ │ │ └── subIssues │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── Summary.vue │ │ │ ├── News │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ └── NewsList.vue │ │ │ ├── Projects │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ ├── Activity │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Calendar │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Documents │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── AddNewDoc.vue │ │ │ │ │ │ ├── Docs.vue │ │ │ │ │ │ ├── DocsForm.vue │ │ │ │ │ │ ├── DocsList.vue │ │ │ │ │ │ └── DocsView.vue │ │ │ │ │ ├── Files │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Forums │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Gantt │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Issues │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── News │ │ │ │ │ └── Index.vue │ │ │ │ │ ├── Overview │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── IssueTracker.vue │ │ │ │ │ │ ├── MemberBox.vue │ │ │ │ │ │ ├── NewsBox.vue │ │ │ │ │ │ ├── OverViewHeader.vue │ │ │ │ │ │ ├── SubProjects.vue │ │ │ │ │ │ └── TimeSummary.vue │ │ │ │ │ ├── ProjectCard.vue │ │ │ │ │ ├── ProjectCreate.vue │ │ │ │ │ ├── ProjectForm.vue │ │ │ │ │ ├── ProjectList.vue │ │ │ │ │ ├── Repository │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── BranchTree.vue │ │ │ │ │ │ ├── HeaderMenu │ │ │ │ │ │ ├── BranchControl.vue │ │ │ │ │ │ └── RevisionControl.vue │ │ │ │ │ │ ├── Revisions.vue │ │ │ │ │ │ ├── TreeNode.vue │ │ │ │ │ │ ├── ViewDiff.vue │ │ │ │ │ │ ├── ViewFile.vue │ │ │ │ │ │ ├── ViewRevision.vue │ │ │ │ │ │ └── atomics │ │ │ │ │ │ ├── Diff.vue │ │ │ │ │ │ └── PathTree.vue │ │ │ │ │ ├── Roadmap │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── Roadmap.vue │ │ │ │ │ │ ├── RoadmapList.vue │ │ │ │ │ │ ├── VersionForm.vue │ │ │ │ │ │ ├── VersionSummary.vue │ │ │ │ │ │ ├── VersionTimes.vue │ │ │ │ │ │ └── VersionView.vue │ │ │ │ │ ├── SearchList.vue │ │ │ │ │ ├── Settings │ │ │ │ │ ├── Index.vue │ │ │ │ │ ├── category │ │ │ │ │ │ └── CategoryForm.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── Forum.vue │ │ │ │ │ │ ├── IssueCategory.vue │ │ │ │ │ │ ├── IssueTracking.vue │ │ │ │ │ │ ├── Member.vue │ │ │ │ │ │ ├── Repository.vue │ │ │ │ │ │ ├── TimeTracking.vue │ │ │ │ │ │ └── Version.vue │ │ │ │ │ ├── SpentTime │ │ │ │ │ └── Index.vue │ │ │ │ │ └── Wiki │ │ │ │ │ └── Index.vue │ │ │ └── SpentTime │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ ├── HeaderTab.vue │ │ │ │ ├── SearchList.vue │ │ │ │ ├── TimeEntryForm.vue │ │ │ │ ├── TimeEntryList.vue │ │ │ │ └── TimeEntryReport.vue │ │ ├── MyIssue │ │ │ └── Index.vue │ │ ├── Settings │ │ │ ├── Category │ │ │ │ └── Index.vue │ │ │ ├── Enumerations │ │ │ │ └── Index.vue │ │ │ ├── Forums │ │ │ │ └── Index.vue │ │ │ ├── Groups │ │ │ │ └── Index.vue │ │ │ ├── Projects │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ └── ProjectTable.vue │ │ │ ├── Repository │ │ │ │ └── Index.vue │ │ │ ├── Roles_Perms │ │ │ │ └── Index.vue │ │ │ ├── Settings │ │ │ │ └── Index.vue │ │ │ ├── Statuses │ │ │ │ └── Index.vue │ │ │ ├── Trackers │ │ │ │ └── Index.vue │ │ │ ├── Users │ │ │ │ ├── Index.vue │ │ │ │ └── components │ │ │ │ │ ├── UserForm.vue │ │ │ │ │ ├── UserList.vue │ │ │ │ │ ├── UserTable.vue │ │ │ │ │ ├── UserView.vue │ │ │ │ │ └── atomicViews │ │ │ │ │ ├── IssueSummary.vue │ │ │ │ │ └── ProjectSummary.vue │ │ │ ├── Versions │ │ │ │ └── Index.vue │ │ │ └── Workflow │ │ │ │ └── Index.vue │ │ ├── _menu │ │ │ ├── headermixin1.ts │ │ │ └── headermixin3.ts │ │ └── components │ │ │ ├── ContentBody │ │ │ └── Index.vue │ │ │ ├── Header │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── HeaderNav.vue │ │ │ │ └── Search.vue │ │ │ ├── IProjectSelect.vue │ │ │ ├── NoData.vue │ │ │ └── SearchBody │ │ │ └── Index.vue │ │ ├── comCash │ │ ├── CashManage │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AccDepth.vue │ │ │ │ ├── AddCash.vue │ │ │ │ ├── BankAcc.vue │ │ │ │ ├── BankAccForm.vue │ │ │ │ ├── Cash.vue │ │ │ │ ├── CashForm.vue │ │ │ │ ├── CashList.vue │ │ │ │ └── ListController.vue │ │ ├── Status │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Calculated.vue │ │ │ │ ├── CashListByDate.vue │ │ │ │ ├── DateChoicer.vue │ │ │ │ ├── StatusByAccount.vue │ │ │ │ └── TabSelect.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── comDocs │ │ ├── GeneralDocs │ │ │ └── Index.vue │ │ ├── LawsuitCase │ │ │ └── Index.vue │ │ ├── LawsuitDocs │ │ │ └── Index.vue │ │ ├── OfficialLetter │ │ │ └── Index.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── contracts │ │ ├── List │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Contract.vue │ │ │ │ ├── ContractList.vue │ │ │ │ ├── ContractSummary.vue │ │ │ │ ├── ListController.vue │ │ │ │ └── SelectItems.vue │ │ ├── Register │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ContController.vue │ │ │ │ ├── ContFiles.vue │ │ │ │ ├── ContNavigation.vue │ │ │ │ ├── ContractForm.vue │ │ │ │ └── ContractorAlert.vue │ │ ├── Release │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ContController.vue │ │ │ │ ├── Release.vue │ │ │ │ ├── ReleaseForm.vue │ │ │ │ ├── ReleaseList.vue │ │ │ │ └── ReleasetButton.vue │ │ ├── Status │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Building.vue │ │ │ │ ├── ContSummary.vue │ │ │ │ ├── ContractBoard.vue │ │ │ │ └── Unit.vue │ │ ├── Succession │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ContController.vue │ │ │ │ ├── Succession.vue │ │ │ │ ├── SuccessionButton.vue │ │ │ │ ├── SuccessionForm.vue │ │ │ │ └── SuccessionList.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── hrManage │ │ ├── Department │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddDepartment.vue │ │ │ │ ├── Department.vue │ │ │ │ ├── DepartmentForm.vue │ │ │ │ ├── DepartmentList.vue │ │ │ │ └── ListController.vue │ │ ├── Duty │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddDuty.vue │ │ │ │ ├── Duty.vue │ │ │ │ ├── DutyForm.vue │ │ │ │ ├── DutyList.vue │ │ │ │ └── ListController.vue │ │ ├── Grade │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddGrade.vue │ │ │ │ ├── Grade.vue │ │ │ │ ├── GradeForm.vue │ │ │ │ ├── GradeList.vue │ │ │ │ └── ListController.vue │ │ ├── Position │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddPosition.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Position.vue │ │ │ │ ├── PositionForm.vue │ │ │ │ └── PositionList.vue │ │ ├── Staff │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddStaff.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Staff.vue │ │ │ │ ├── StaffForm.vue │ │ │ │ └── StaffList.vue │ │ └── _menu │ │ │ ├── headermixin1.ts │ │ │ └── headermixin2.ts │ │ ├── notices │ │ ├── Bill │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Contract.vue │ │ │ │ ├── ContractList.vue │ │ │ │ ├── DownloadButton.vue │ │ │ │ ├── ListController.vue │ │ │ │ └── SalesBillIssueForm.vue │ │ ├── Label │ │ │ └── Index.vue │ │ ├── Log │ │ │ └── Index.vue │ │ ├── Mailing │ │ │ └── Index.vue │ │ ├── Sms │ │ │ └── Index.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── payments │ │ ├── List │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ContChoicer.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Payment.vue │ │ │ │ ├── PaymentList.vue │ │ │ │ └── PaymentSummary.vue │ │ ├── Register │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── ContChoicer.vue │ │ │ │ ├── CreateButton.vue │ │ │ │ ├── Order.vue │ │ │ │ ├── OrdersBoard.vue │ │ │ │ ├── Payment.vue │ │ │ │ ├── PaymentForm.vue │ │ │ │ └── PaymentListAll.vue │ │ ├── Status │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── DateChoicer.vue │ │ │ │ ├── OverallSummary.vue │ │ │ │ └── PaymentStatus.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── proCash │ │ ├── Imprest │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddProImprest.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── ProImprest.vue │ │ │ │ ├── ProImprestForm.vue │ │ │ │ └── ProImprestList.vue │ │ ├── Manage │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AccDepth.vue │ │ │ │ ├── AddProCash.vue │ │ │ │ ├── BankAcc.vue │ │ │ │ ├── BankAccForm.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── ProCash.vue │ │ │ │ ├── ProCashForm.vue │ │ │ │ └── ProCashList.vue │ │ ├── Status │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── CashListByDate.vue │ │ │ │ ├── DateChoicer.vue │ │ │ │ ├── StatusByAccount.vue │ │ │ │ ├── SummaryForBudget.vue │ │ │ │ └── TabSelect.vue │ │ └── _menu │ │ │ └── headermixin.ts │ │ ├── proDocs │ │ ├── GeneralDocs │ │ │ └── Index.vue │ │ ├── LawsuitCase │ │ │ └── Index.vue │ │ ├── LawsuitDocs │ │ │ └── Index.vue │ │ └── _menu │ │ │ ├── headermixin1.ts │ │ │ └── headermixin2.ts │ │ ├── projects │ │ ├── Building │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Building.vue │ │ │ │ ├── BuildingAddForm.vue │ │ │ │ └── BuildingFormList.vue │ │ ├── DownPay │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── DownPay.vue │ │ │ │ ├── DownPayAddForm.vue │ │ │ │ └── DownPayFormList.vue │ │ ├── Floor │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Floor.vue │ │ │ │ ├── FloorAddForm.vue │ │ │ │ └── FloorFormList.vue │ │ ├── IncBudget │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── BudgetAddForm.vue │ │ │ │ ├── BudgetFormList.vue │ │ │ │ └── IncBudget.vue │ │ ├── List │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── IndexDetail.vue │ │ │ │ ├── IndexForm.vue │ │ │ │ └── IssueProjectForm.vue │ │ ├── OrderGroup │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── OrderAddForm.vue │ │ │ │ ├── OrderFormList.vue │ │ │ │ └── OrderGroup.vue │ │ ├── OutBudget │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── BudgetAddForm.vue │ │ │ │ ├── BudgetFormList.vue │ │ │ │ └── OutBudget.vue │ │ ├── PaidOption │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── OptionAddForm.vue │ │ │ │ ├── OptionFormList.vue │ │ │ │ └── PaidOption.vue │ │ ├── PayOrder │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── PayOrder.vue │ │ │ │ ├── PayOrderAddForm.vue │ │ │ │ └── PayOrderFormList.vue │ │ ├── Price │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Price.vue │ │ │ │ ├── PriceFormList.vue │ │ │ │ └── PriceSelectForm.vue │ │ ├── SiteContract │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddSiteContract.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── SiteContFiles.vue │ │ │ │ ├── SiteContract.vue │ │ │ │ ├── SiteContractForm.vue │ │ │ │ └── SiteContractList.vue │ │ ├── SiteList │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddSite.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Site.vue │ │ │ │ ├── SiteForm.vue │ │ │ │ └── SiteList.vue │ │ ├── SiteOwner │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── AddSiteOwner.vue │ │ │ │ ├── ListController.vue │ │ │ │ ├── Site.vue │ │ │ │ ├── SiteOwner.vue │ │ │ │ ├── SiteOwnerForm.vue │ │ │ │ └── SiteOwnerList.vue │ │ ├── Type │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Type.vue │ │ │ │ ├── TypeAddForm.vue │ │ │ │ └── TypeFormList.vue │ │ ├── Unit │ │ │ ├── Index.vue │ │ │ └── components │ │ │ │ ├── Unit.vue │ │ │ │ ├── UnitController.vue │ │ │ │ ├── UnitForm.vue │ │ │ │ └── UnitTable.vue │ │ └── _menu │ │ │ ├── headermixin1.ts │ │ │ ├── headermixin2.ts │ │ │ ├── headermixin3.ts │ │ │ ├── headermixin4.ts │ │ │ ├── headermixin5.ts │ │ │ └── headermixin6.ts │ │ └── settings │ │ ├── Authorization │ │ ├── Index.vue │ │ ├── __tests__ │ │ │ └── Authorization.spec.ts │ │ └── components │ │ │ ├── AddUserFormModal.vue │ │ │ ├── ProjectManageAuth.vue │ │ │ ├── SideBarManageAuth.vue │ │ │ └── UserSelect.vue │ │ ├── Company │ │ ├── Index.vue │ │ ├── __tests__ │ │ │ └── Company.spec.ts │ │ └── components │ │ │ ├── CompanyDetail.vue │ │ │ └── CompanyForm.vue │ │ └── _menu │ │ └── headermixin.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── tsconfig.vitest.json │ ├── vite.config.mts │ └── vitest.config.mts ├── deploy ├── .docker-compose.yml ├── docker │ ├── nginx │ │ ├── Dockerfile │ │ ├── conf.d │ │ │ ├── log.conf │ │ │ ├── public.conf │ │ │ └── upstream.conf │ │ └── nginx.conf │ └── python │ │ ├── Dockerfile │ │ └── requirements.txt ├── helm │ ├── .helmignore │ ├── Chart.yaml │ ├── charts │ │ ├── mariadb │ │ │ ├── .helmignore │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ │ ├── NOTES.txt │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── configmap.yaml │ │ │ │ ├── pv.yaml │ │ │ │ ├── pvc.yaml │ │ │ │ ├── secrets.yaml │ │ │ │ ├── service.yaml │ │ │ │ ├── serviceaccount.yaml │ │ │ │ ├── statefulset.yaml │ │ │ │ └── tests │ │ │ │ │ └── test-connection.yaml │ │ │ └── values.yaml │ │ ├── nginx │ │ │ ├── .helmignore │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ │ ├── NOTES.txt │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── configmap.yaml │ │ │ │ ├── deployment.yaml │ │ │ │ ├── hpa.yaml │ │ │ │ ├── ingress.yaml │ │ │ │ ├── pv.yaml │ │ │ │ ├── pvc.yaml │ │ │ │ ├── service.yaml │ │ │ │ ├── serviceaccount.yaml │ │ │ │ └── tests │ │ │ │ │ └── test-connection.yaml │ │ │ └── values.yaml │ │ ├── postgres │ │ │ ├── .helmignore │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ │ ├── NOTES.txt │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── configmap.yaml │ │ │ │ ├── pv.yaml │ │ │ │ ├── pvc.yaml │ │ │ │ ├── secrets.yaml │ │ │ │ ├── service.yaml │ │ │ │ ├── serviceaccount.yaml │ │ │ │ ├── statefulset.yaml │ │ │ │ └── tests │ │ │ │ │ └── test-connection.yaml │ │ │ └── values.yaml │ │ └── web │ │ │ ├── .helmignore │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── configmap.yaml │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── pv.yaml │ │ │ ├── pvc.yaml │ │ │ ├── rbac.yaml │ │ │ ├── secrets.yaml │ │ │ ├── service.yaml │ │ │ ├── serviceaccount.yaml │ │ │ └── tests │ │ │ │ └── test-connection.yaml │ │ │ └── values.yaml │ ├── templates │ │ ├── NOTES.txt │ │ ├── _helpers.tpl │ │ └── tests │ │ │ └── test-connection.yaml │ ├── values-dev.yaml │ └── values.yaml └── kubectl │ ├── .certificate.yml │ ├── .cluster-issuer.yml │ ├── README.md │ └── class-roles │ └── cluster-role.yaml └── volume ├── backups ├── copy_script.sh ├── dump_mariadb.sh ├── dump_postgres.sh ├── mariadb_restore.sh └── postgres_restore.sh └── initdb ├── mariadb └── init.sql └── postgres └── init-schema.sql /.github/actions/slack-notify/action.yml: -------------------------------------------------------------------------------- 1 | name: 'slack-notify' 2 | 3 | inputs: 4 | status: 5 | required: false 6 | default: 'failure' 7 | description: 'default -> failure' 8 | slack_incoming_url: 9 | required: true 10 | description: 'required -> true' 11 | 12 | runs: 13 | using: 'composite' 14 | 15 | steps: 16 | - name: Send slack 17 | shell: bash 18 | run: | 19 | if [ "${{ inputs.status }}" = "success" ]; then 20 | EMOTICON="✅" 21 | else 22 | EMOTICON="⛔" 23 | fi 24 | MSG="{ \"text\":\">${EMOTICON} workflow () in \n> job ${{ inputs.status }}, branch=\`${GITHUB_REF#refs/heads/}\`\"}" 25 | curl -X POST -H 'Content-type: application/json' --data "${MSG}" "${{ inputs.slack_incoming_url }}" 26 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /app/django/_assets/book/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/book/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /app/django/_assets/book/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/book/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /app/django/_assets/book/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/book/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /app/django/_assets/book/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/book/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /app/django/_assets/book/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/book/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /app/django/_assets/fonts/vendor/font-awesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/fonts/vendor/font-awesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /app/django/_assets/ibs/css/vendor/jquery-jvectormap-1.2.2.css: -------------------------------------------------------------------------------- 1 | tormap-label { 2 | position: absolute; 3 | display: none; 4 | border: solid 1px #CDCDCD; 5 | -webkit-border-radius: 3px; 6 | -moz-border-radius: 3px; 7 | border-radius: 3px; 8 | background: #292929; 9 | color: white; 10 | font-family: sans-serif, Verdana; 11 | font-size: smaller; 12 | padding: 3px; 13 | } 14 | 15 | .jvectormap-zoomin, .jvectormap-zoomout { 16 | position: absolute; 17 | left: 10px; 18 | -webkit-border-radius: 3px; 19 | -moz-border-radius: 3px; 20 | background: #424242; 21 | padding: 2px; 22 | color: white; 23 | width: 15px; 24 | height: 15px; 25 | cursor: pointer; 26 | line-height: 10px; 27 | text-align: center; 28 | } 29 | 30 | .jvectormap-zoomin { 31 | top: 10px; 32 | } 33 | 34 | .jvectormap-zoomout { 35 | top: 30px; 36 | } 37 | -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/Nunito-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/Nunito-Bold.woff -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/Nunito-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/Nunito-Light.woff -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/Nunito-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/Nunito-Regular.woff -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/Nunito-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/Nunito-SemiBold.woff -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/dripicons-v2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/dripicons-v2.woff -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/materialdesignicons-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/materialdesignicons-webfont.woff2 -------------------------------------------------------------------------------- /app/django/_assets/ibs/fonts/unicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/fonts/unicons.woff2 -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/bg-auth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/bg-auth.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/bg-auth1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/bg-auth1.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/bg-pattern-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/bg-pattern-dark.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/bg-pattern-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/bitbucket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/bitbucket.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/dribbble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/dribbble.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/dropbox.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/g-suite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/g-suite.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/github.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/brands/slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/brands/slack.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/001.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/002.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/003.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/004.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/005.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/006.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/007.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/008.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/009.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/010.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/011.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/012.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/carousel/013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/carousel/013.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/favicon.ico -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/favicon.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/germany.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/germany.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/italy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/italy.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/korea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/korea.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/russia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/russia.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/spain.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/spain.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/flags/us.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/flags/us.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/logo-dark.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/logo.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/sygnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/sygnet.png -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/users/avatar-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/users/avatar-1.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/users/avatar-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/users/avatar-2.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/users/avatar-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/users/avatar-4.jpg -------------------------------------------------------------------------------- /app/django/_assets/ibs/images/users/avatar-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/ibs/images/users/avatar-5.jpg -------------------------------------------------------------------------------- /app/django/_assets/svelte/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_assets/svelte/favicon.png -------------------------------------------------------------------------------- /app/django/_config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_config/__init__.py -------------------------------------------------------------------------------- /app/django/_config/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for _config project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /app/django/_config/asset_storage.py: -------------------------------------------------------------------------------- 1 | from storages.backends.s3boto3 import S3Boto3Storage 2 | 3 | 4 | class MediaStorage(S3Boto3Storage): 5 | location = 'media' 6 | file_overwrite = False 7 | -------------------------------------------------------------------------------- /app/django/_config/database_router.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | class MasterSlaveRouter: 5 | @staticmethod 6 | def db_for_read(model, **hints): 7 | # 읽기 작업은 slave1 또는 slave2에서 처리 8 | return random.choice(['slave1', 'slave2']) 9 | 10 | @staticmethod 11 | def db_for_write(model, **hints): 12 | # 쓰기 작업은 default 데이터베이스에서만 처리 13 | return 'default' 14 | 15 | @staticmethod 16 | def allow_relation(obj1, obj2, **hints): 17 | # 두 객체가 동일한 DB에 있을 때 관계 허용 18 | db_list = ('default', 'slave1', 'slave2') 19 | if obj1._state.db in db_list and obj2._state.db in db_list: 20 | return True 21 | return None 22 | 23 | @staticmethod 24 | def allow_migrate(db, app_label, model_name=None, **hints): 25 | # default 데이터베이스에서만 마이그레이션 수행 26 | return db == 'default' 27 | -------------------------------------------------------------------------------- /app/django/_config/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_config/settings/__init__.py -------------------------------------------------------------------------------- /app/django/_config/settings/local.py: -------------------------------------------------------------------------------- 1 | from .base import * 2 | 3 | # SECURITY WARNING: don't run with debug turned on in production! 4 | DEBUG = True 5 | 6 | ALLOWED_HOSTS = ['*'] 7 | 8 | CSRF_TRUSTED_ORIGINS = ['http://localhost', 'http://localhost:8000', 'http://localhost:8888', 'http://localhost:5173'] 9 | -------------------------------------------------------------------------------- /app/django/_config/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for _config project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /app/django/_excel/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_excel/__init__.py -------------------------------------------------------------------------------- /app/django/_excel/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /app/django/_excel/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ExcelConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = '_excel' 7 | -------------------------------------------------------------------------------- /app/django/_excel/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /app/django/_excel/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/_pdf/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/_pdf/__init__.py -------------------------------------------------------------------------------- /app/django/_pdf/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /app/django/_pdf/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PdfConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = '_pdf' 7 | -------------------------------------------------------------------------------- /app/django/_pdf/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /app/django/_pdf/templates/pdf/bill_control.html: -------------------------------------------------------------------------------- 1 | {% for data in data_list %} 2 | 3 | 4 | 5 | 6 | 8 | 9 | 21 | 분양대금 납부 고지서 22 | 23 | 24 | {% include 'pdf/partials/bill_page.html' %} 25 | 26 | 27 | {% endfor %} 28 | -------------------------------------------------------------------------------- /app/django/_pdf/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/_pdf/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import * 3 | 4 | app_name = 'pdf' 5 | 6 | urlpatterns = [ 7 | # pdf url 8 | path('bill/', PdfExportBill.as_view(), name='bill'), 9 | path('payments/', PdfExportPayments.as_view(), name='payments'), 10 | path('calculation/', PdfExportCalculation.as_view(), name='calculation'), 11 | ] 12 | -------------------------------------------------------------------------------- /app/django/accounts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/accounts/__init__.py -------------------------------------------------------------------------------- /app/django/accounts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AccountsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'accounts' 7 | verbose_name = '*** 계정 관련 정보' 8 | -------------------------------------------------------------------------------- /app/django/accounts/templatetags/sort_apps.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.conf import settings 3 | register = template.Library() 4 | 5 | @register.filter 6 | def sort_apps(apps): 7 | count = len(apps) 8 | apps.sort( 9 | key = lambda x: 10 | settings.APP_ORDER.index(x['app_label']) 11 | if x['app_label'] in settings.APP_ORDER 12 | else count 13 | ) 14 | return apps 15 | -------------------------------------------------------------------------------- /app/django/accounts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/accounts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import (install_check_step, create_superuser, create_company, 3 | create_project, pass_create_project) 4 | 5 | app_name = 'install' 6 | 7 | urlpatterns = [ 8 | path('', install_check_step), 9 | path('create/superuser/', create_superuser, name='create_superuser'), 10 | path('create/company/', create_company, name='create_company'), 11 | path('create/project/', create_project, name='create_project'), 12 | path('create/pass_project/', pass_create_project, name='pass_create_project') 13 | # path('', include('django.contrib.auth.urls')), 14 | # path('register/', UserCreateView.as_view(), name='register'), 15 | # path('register/done/', UserCreateDoneTV.as_view(), name='register_done'), 16 | ] 17 | -------------------------------------------------------------------------------- /app/django/apiV1/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/apiV1/__init__.py -------------------------------------------------------------------------------- /app/django/apiV1/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /app/django/apiV1/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApiV1Config(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'apiV1' 7 | -------------------------------------------------------------------------------- /app/django/apiV1/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /app/django/apiV1/serializers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/apiV1/serializers/__init__.py -------------------------------------------------------------------------------- /app/django/apiV1/serializers/notice.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from notice.models import SalesBillIssue 4 | 5 | 6 | # Notice -------------------------------------------------------------------------- 7 | class SallesBillIssueSerializer(serializers.ModelSerializer): 8 | class Meta: 9 | model = SalesBillIssue 10 | fields = ('pk', 'project', 'now_payment_order', 'host_name', 'host_tel', 11 | 'agency', 'agency_tel', 'bank_account1', 'bank_number1', 'bank_host1', 12 | 'bank_account2', 'bank_number2', 'bank_host2', 'zipcode', 'address1', 13 | 'address2', 'address3', 'title', 'content') 14 | -------------------------------------------------------------------------------- /app/django/apiV1/serializers/work/__init__.py: -------------------------------------------------------------------------------- 1 | from .github import * 2 | from .inform import * 3 | from .issue import * 4 | from .logging import * 5 | from .project import * 6 | -------------------------------------------------------------------------------- /app/django/apiV1/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/apiV1/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/apiV1/views/__init__.py -------------------------------------------------------------------------------- /app/django/apiV1/views/notice.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | 3 | from ..permission import * 4 | from ..serializers.notice import * 5 | 6 | from notice.models import SalesBillIssue 7 | 8 | 9 | class BillIssueViewSet(viewsets.ModelViewSet): 10 | queryset = SalesBillIssue.objects.all() 11 | serializer_class = SallesBillIssueSerializer 12 | filterset_fields = ('project',) 13 | permission_classes = (permissions.IsAuthenticated, IsProjectStaffOrReadOnly) 14 | 15 | def perform_create(self, serializer): 16 | serializer.save(user=self.request.user) 17 | -------------------------------------------------------------------------------- /app/django/apiV1/views/work/__init__.py: -------------------------------------------------------------------------------- 1 | from .github import * 2 | from .inform import * 3 | from .issue import * 4 | from .logging import * 5 | from .project import * 6 | -------------------------------------------------------------------------------- /app/django/board/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/board/__init__.py -------------------------------------------------------------------------------- /app/django/board/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BoardConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'board' 7 | verbose_name = '*** 게시판 관리' 8 | -------------------------------------------------------------------------------- /app/django/board/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/board/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /app/django/book/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/book/__init__.py -------------------------------------------------------------------------------- /app/django/book/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BookConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'book' 7 | verbose_name = '*** 도서/문서 정보' 8 | -------------------------------------------------------------------------------- /app/django/book/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from .models import Subject, Image 3 | 4 | 5 | class SubjectForm(forms.ModelForm): 6 | 7 | class Meta: 8 | model = Subject 9 | fields = ('title', 'level', 'content') 10 | 11 | 12 | class ImageForm(forms.ModelForm): 13 | 14 | class Meta: 15 | model = Image 16 | fields = ('image', ) 17 | 18 | 19 | ImageFormSet = forms.models.inlineformset_factory(Subject, Image, form=ImageForm, extra=1) 20 | -------------------------------------------------------------------------------- /app/django/book/templates/book/layouts/footer.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/django/book/templates/book/subjects/main/content.html: -------------------------------------------------------------------------------- 1 |
2 | {% if object %} 3 |

{{ object.title }}

4 |
5 | {% endif %} 6 | 7 |
8 | {% load md2 %} 9 | {% with default_html="

등록된 단원(내용)이 없습니다.

" %} 10 | {{ object.content|default:default_html|markdown:"tables, fenced-code-blocks, highlightjs-lang, cuddled-lists, break-on-newline, toc, markdown-in-html, strike" }} 11 | {% endwith %} 12 |
13 |
14 | -------------------------------------------------------------------------------- /app/django/book/templates/book/subjects/main/search.html: -------------------------------------------------------------------------------- 1 |
2 | {% if request.GET.q %} 3 | {% for result in search_list %} 4 | 16 | {% empty %} 17 |
18 |

해당 키워드의 검색 항목이 존재하지 않습니다.

19 |
20 | {% endfor %} 21 | {% endif %} 22 |
23 | -------------------------------------------------------------------------------- /app/django/book/templates/book/subjects/main/subject_confirm_delete.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

삭제기능을 사용할 수 없습니다. 관리자에게 문의해 주십시요!

4 |
5 |
-------------------------------------------------------------------------------- /app/django/book/templates/book/subjects/partial/footer/back-to-top.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /app/django/book/templates/book/subjects/partial/footer/tail-nav.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 24 |
25 |
-------------------------------------------------------------------------------- /app/django/book/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/cash/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/cash/__init__.py -------------------------------------------------------------------------------- /app/django/cash/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CashConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'cash' 7 | verbose_name = '자금 관리 관련 정보' 8 | -------------------------------------------------------------------------------- /app/django/cash/templates/cash/partials/payment_form_info.html: -------------------------------------------------------------------------------- 1 |
2 | {% if this_contract %} 3 |
4 | 5 | [일련번호 : {{ this_contract.serial_number }}] (타입 6 | : {{ this_contract.unit_type }} 7 | 9 | {% if this_project.is_unit_set %}{{ this_contract.keyunit.houseunit }}{% endif %} | 10 | {% if not this_contract.activation %}해지{% endif %} 11 | 계약자 : {{ this_contract.contractor.name }}) 12 |
13 | 14 | (납부내역서 출력) 17 | {% endif %} 18 |
19 | -------------------------------------------------------------------------------- /app/django/cash/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/company/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/company/__init__.py -------------------------------------------------------------------------------- /app/django/company/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CompanyConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'company' 7 | verbose_name = '회사 관련 정보' 8 | -------------------------------------------------------------------------------- /app/django/company/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from .models import Company 4 | 5 | 6 | class CompanyForm(forms.ModelForm): 7 | class Meta: 8 | model = Company 9 | exclude = ('user',) 10 | -------------------------------------------------------------------------------- /app/django/company/templates/company/partials/company_list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /app/django/company/templates/company/partials/head_menu.html: -------------------------------------------------------------------------------- 1 | 19 | -------------------------------------------------------------------------------- /app/django/company/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/company/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import CompanyRegisterView, CompanyCV 3 | 4 | app_name = 'company' 5 | 6 | urlpatterns = [ 7 | path('', CompanyRegisterView.as_view(), name='index'), 8 | path('create/', CompanyCV.as_view(), name='create'), 9 | ] 10 | -------------------------------------------------------------------------------- /app/django/contract/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/contract/__init__.py -------------------------------------------------------------------------------- /app/django/contract/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ContractConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'contract' 7 | verbose_name = '분양 계약 관련 정보' 8 | -------------------------------------------------------------------------------- /app/django/contract/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/contract/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import * 3 | 4 | app_name = 'contract' 5 | 6 | urlpatterns = [ 7 | path('', ContractLV.as_view(), name='index'), 8 | path('register/', ContractRegisterView.as_view(), name='register'), 9 | path('contractor//', ContractorUpdate.as_view(), name='contractor'), 10 | path('trans//', ContractorTrans.as_view(), name='trans'), 11 | path('release/register/', ContractorReleaseRegister.as_view(), name='release'), 12 | path('dashboard/', BuildDashboard.as_view(), name='dashboard'), 13 | ] 14 | -------------------------------------------------------------------------------- /app/django/docs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/docs/__init__.py -------------------------------------------------------------------------------- /app/django/docs/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DocsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'docs' 7 | verbose_name = '*** 문서관리' 8 | -------------------------------------------------------------------------------- /app/django/docs/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/docs/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /app/django/ibs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/ibs/__init__.py -------------------------------------------------------------------------------- /app/django/ibs/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class IbsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'ibs' 7 | verbose_name = '회계 계정 정보' 8 | -------------------------------------------------------------------------------- /app/django/ibs/fixtures/dumpdata.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python ../../manage.py dumpdata \ 4 | board.group board.board docs.doctype docs.category cash.bankcode \ 5 | ibs.accountsort ibs.accountsubd1 ibs.accountsubd2 ibs.accountsubd3 \ 6 | ibs.projectaccountd2 ibs.projectaccountd3 ibs.wisesaying \ 7 | work.role work.permission work.tracker work.issuestatus \ 8 | work.codeactivity work.codeissuepriority work.codedocscategory \ 9 | --indent 2 > seeds-data.json 10 | -------------------------------------------------------------------------------- /app/django/ibs/fixtures/loaddata.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python ../../manage.py loaddata seeds-data.json -------------------------------------------------------------------------------- /app/django/ibs/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/ibs/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from django.views.generic import RedirectView 3 | from .views import * 4 | 5 | app_name = 'ibs' 6 | 7 | urlpatterns = [ 8 | path('', RedirectView.as_view(url='/ibs/dashboard/'), name='home'), 9 | path('dashboard/', Dashboard.as_view(), name='dashboard'), 10 | path('schedule/', menu2_1, name='menu2_1'), 11 | path('cash/', include('cash.urls')), 12 | path('company/', include('company.urls')), 13 | path('project/', include('project.urls')), 14 | path('contract/', include('contract.urls')), 15 | path('notice/', include('notice.urls')), 16 | # path('docs/', include('document.urls')), 17 | ] 18 | -------------------------------------------------------------------------------- /app/django/items/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/items/__init__.py -------------------------------------------------------------------------------- /app/django/items/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ItemsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'items' 7 | verbose_name = '개발 상품 정보' 8 | -------------------------------------------------------------------------------- /app/django/items/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/items/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /app/django/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /app/django/migrations.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python manage.py makemigrations accounts board book cash company contract docs ibs items notice payment project work -------------------------------------------------------------------------------- /app/django/notice/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/notice/__init__.py -------------------------------------------------------------------------------- /app/django/notice/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import SalesBillIssue 3 | 4 | 5 | @admin.register(SalesBillIssue) 6 | class SalesBillIssueAdmin(admin.ModelAdmin): 7 | pass 8 | -------------------------------------------------------------------------------- /app/django/notice/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NoticeConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'notice' 7 | verbose_name = '수납 고지서 정보' 8 | -------------------------------------------------------------------------------- /app/django/notice/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/notice/urls.py: -------------------------------------------------------------------------------- 1 | """config URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.urls import path 17 | from .views import * 18 | 19 | app_name = 'notice' 20 | 21 | urlpatterns = [ 22 | path('bill/', BillManageView.as_view(), name='bill'), 23 | ] 24 | -------------------------------------------------------------------------------- /app/django/payment/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/payment/__init__.py -------------------------------------------------------------------------------- /app/django/payment/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PaymentConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'payment' 7 | verbose_name = '수납 관련 정보 설정' 8 | -------------------------------------------------------------------------------- /app/django/payment/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/payment/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /app/django/project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/project/__init__.py -------------------------------------------------------------------------------- /app/django/project/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ProjectConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'project' 7 | verbose_name = '현장 관련 정보' 8 | -------------------------------------------------------------------------------- /app/django/project/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/templates/account/account_inactive.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Account Inactive" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Account Inactive" %}

9 | 10 |

{% trans "This account is inactive." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /app/django/templates/account/email/base_message.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name %}Hello from {{ site_name }}!{% endblocktrans %} 2 | 3 | {% block content %}{% endblock %} 4 | 5 | {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you for using {{ site_name }}! 6 | {{ site_domain }}{% endblocktrans %} 7 | {% endautoescape %} 8 | -------------------------------------------------------------------------------- /app/django/templates/account/email/email_confirmation_message.txt: -------------------------------------------------------------------------------- 1 | {% extends "account/email/base_message.txt" %} 2 | {% load account %} 3 | {% load i18n %} 4 | 5 | {% block content %}{% autoescape off %}{% user_display user as user_display %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}You're receiving this e-mail because user {{ user_display }} has given your e-mail address to register an account on {{ site_domain }}. 6 | 7 | To confirm this is correct, go to {{ activate_url }}{% endblocktrans %}{% endautoescape %}{% endblock %} 8 | -------------------------------------------------------------------------------- /app/django/templates/account/email/email_confirmation_signup_message.txt: -------------------------------------------------------------------------------- 1 | {% include "account/email/email_confirmation_message.txt" %} 2 | -------------------------------------------------------------------------------- /app/django/templates/account/email/email_confirmation_signup_subject.txt: -------------------------------------------------------------------------------- 1 | {% include "account/email/email_confirmation_subject.txt" %} 2 | -------------------------------------------------------------------------------- /app/django/templates/account/email/email_confirmation_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% autoescape off %} 3 | {% blocktrans %}Please Confirm Your E-mail Address{% endblocktrans %} 4 | {% endautoescape %} 5 | -------------------------------------------------------------------------------- /app/django/templates/account/email/password_reset_key_message.txt: -------------------------------------------------------------------------------- 1 | {% extends "account/email/base_message.txt" %} 2 | {% load i18n %} 3 | 4 | {% block content %}{% autoescape off %}{% blocktrans %}You're receiving this e-mail because you or someone else has requested a password for your user account. 5 | It can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %} 6 | 7 | {{ password_reset_url }}{% if username %} 8 | 9 | {% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %}{% endif %}{% endautoescape %}{% endblock %} 10 | -------------------------------------------------------------------------------- /app/django/templates/account/email/password_reset_key_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% autoescape off %} 3 | {% blocktrans %}Password Reset E-mail{% endblocktrans %} 4 | {% endautoescape %} 5 | -------------------------------------------------------------------------------- /app/django/templates/account/email_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %} 7 | 8 | 9 | {% block content %} 10 |

{% trans "Confirm E-mail Address" %}

11 | 12 | {% if confirmation %} 13 | 14 | {% user_display confirmation.email_address.user as user_display %} 15 | 16 |

{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

17 | 18 |
19 | {% csrf_token %} 20 | 21 |
22 | 23 | {% else %} 24 | 25 | {% url 'account_email' as email_url %} 26 | 27 |

{% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktrans %}

28 | 29 | {% endif %} 30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /app/django/templates/account/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Sign Out" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Sign Out" %}

9 | 10 |

{% trans 'Are you sure you want to sign out?' %}

11 | 12 |
13 | {% csrf_token %} 14 | {% if redirect_field_value %} 15 | 16 | {% endif %} 17 | 18 |
19 | 20 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/cannot_delete_primary_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/email_confirmation_sent.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Confirmation e-mail sent to {{email}}.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/email_confirmed.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}You have confirmed {{email}}.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/email_deleted.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Removed e-mail address {{email}}.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/logged_in.txt: -------------------------------------------------------------------------------- 1 | {% load account %} 2 | {% load i18n %} 3 | {% user_display user as name %} 4 | {% blocktrans %}Successfully signed in as {{name}}.{% endblocktrans %} 5 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/logged_out.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}You have signed out.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/password_changed.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Password successfully changed.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/password_set.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Password successfully set.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/primary_email_set.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Primary e-mail address set.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/messages/unverified_primary_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Your primary e-mail address must be verified.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /app/django/templates/account/password_change.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Change Password" %}

9 | 10 |
11 | {% csrf_token %} 12 | {{ form.as_p }} 13 | 14 | {% trans "Forgot Password?" %} 15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /app/django/templates/account/password_reset.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% trans "Password Reset" %}{% endblock %} 7 | 8 | {% block content %} 9 | 10 |

{% trans "Password Reset" %}

11 | {% if user.is_authenticated %} 12 | {% include "account/snippets/already_logged_in.html" %} 13 | {% endif %} 14 | 15 |

{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

16 | 17 |
18 | {% csrf_token %} 19 | {{ form.as_p }} 20 | 21 |
22 | 23 |

{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /app/django/templates/account/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% trans "Password Reset" %}{% endblock %} 7 | 8 | {% block content %} 9 |

{% trans "Password Reset" %}

10 | 11 | {% if user.is_authenticated %} 12 | {% include "account/snippets/already_logged_in.html" %} 13 | {% endif %} 14 | 15 |

{% blocktrans %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /app/django/templates/account/password_reset_from_key.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 5 | 6 | {% block content %} 7 |

{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

8 | 9 | {% if token_fail %} 10 | {% url 'account_reset_password' as passwd_reset_url %} 11 |

{% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

12 | {% else %} 13 | {% if form %} 14 |
15 | {% csrf_token %} 16 | {{ form.as_p }} 17 | 18 |
19 | {% else %} 20 |

{% trans 'Your password is now changed.' %}

21 | {% endif %} 22 | {% endif %} 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /app/django/templates/account/password_reset_from_key_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 5 | 6 | {% block content %} 7 |

{% trans "Change Password" %}

8 |

{% trans 'Your password is now changed.' %}

9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /app/django/templates/account/password_set.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Set Password" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Set Password" %}

9 | 10 |
11 | {% csrf_token %} 12 | {{ form.as_p }} 13 | 14 |
15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /app/django/templates/account/signup_closed.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Sign Up Closed" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Sign Up Closed" %}

9 | 10 |

{% trans "We are sorry, but the sign up is currently closed." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /app/django/templates/account/snippets/already_logged_in.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% load account %} 3 | 4 | {% user_display user as user_display %} 5 |

{% trans "Note" %}: {% blocktrans %}you are already logged in as {{ user_display }}.{% endblocktrans %}

6 | -------------------------------------------------------------------------------- /app/django/templates/account/verification_sent.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Verify Your E-mail Address" %}

9 | 10 |

{% blocktrans %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /app/django/templates/account/verified_email_required.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Verify Your E-mail Address" %}

9 | 10 | {% url 'account_email' as email_url %} 11 | 12 |

{% blocktrans %}This part of the site requires us to verify that 13 | you are who you claim to be. For this purpose, we require that you 14 | verify ownership of your e-mail address. {% endblocktrans %}

15 | 16 |

{% blocktrans %}We have sent an e-mail to you for 17 | verification. Please click on the link inside this e-mail. Please 18 | contact us if you do not receive it within a few minutes.{% endblocktrans %}

19 | 20 |

{% blocktrans %}Note: you can still change your e-mail address.{% endblocktrans %}

21 | 22 | 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /app/django/templates/admin/nav_sidebar.html: -------------------------------------------------------------------------------- 1 | {% load i18n sort_apps %} 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/django/templates/base-docs.html: -------------------------------------------------------------------------------- 1 | ../../vue/docs/.vitepress/dist/index.html 2 | -------------------------------------------------------------------------------- /app/django/templates/base-svelte.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Svelte app 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/django/templates/base-vue.html: -------------------------------------------------------------------------------- 1 | ../static/dist/index.html -------------------------------------------------------------------------------- /app/django/templates/ibs/layouts/footer.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 | 2015 - {% now "Y" %} © IBS. 7 |
8 |
9 | 14 |
15 |
16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /app/django/templates/ibs/layouts/partials/menu_dashboard.html: -------------------------------------------------------------------------------- 1 |
  • 2 | 3 | 4 | {# 4#} 5 | 준비중.. 6 | 대시보드 7 | 8 |
  • 9 | -------------------------------------------------------------------------------- /app/django/templates/ibs/layouts/partials/menu_payment.html: -------------------------------------------------------------------------------- 1 | {% if request.user.is_superuser or request.user.staffauth.payment > '0' %} 2 |
  • 3 | 4 | 5 | 분양 수납 관리 6 | 7 | 8 | 20 |
  • 21 | {% endif %} 22 | -------------------------------------------------------------------------------- /app/django/templates/ibs/layouts/partials/menu_schedule.html: -------------------------------------------------------------------------------- 1 |
  • 2 | 3 | 4 | 일정 관리 5 | 준비중.. 6 | 7 |
  • 8 | -------------------------------------------------------------------------------- /app/django/templates/ibs/main/3_1_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'ibs/layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block third_party_css %}{% endblock %} 5 | 6 | {% block content %} 7 | 8 | 9 |
    10 | 11 | 12 | {% include 'ibs/partials/content_title.html' with title="계약 현황 조회" second_bs="분양 계약 관리" %} 13 | 14 | 15 |
    16 |
    17 |
    18 |
    19 |
    20 | content 21 |
    22 |
    23 |
    24 |
    25 |
    26 | 27 |
    28 | 29 | {% endblock %} 30 | 31 | {% block third_party_js %}{% endblock %} 32 | 33 | 34 | {% block demo_js %}{% endblock %} 35 | -------------------------------------------------------------------------------- /app/django/templates/ibs/partials/content_title.html: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 |
    5 |
    6 | 16 |
    17 |

    {{ title }}

    18 |
    19 |
    20 |
    21 | 22 | -------------------------------------------------------------------------------- /app/django/templates/ibs/partials/logo.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 13 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /app/django/templates/ibs/partials/no_data.html: -------------------------------------------------------------------------------- 1 |
    2 | 등록된 데이터가 없습니다. 3 |
    4 | -------------------------------------------------------------------------------- /app/django/templates/ibs/partials/project_select.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 | 11 |
    12 |
    13 |
    14 | -------------------------------------------------------------------------------- /app/django/templates/partials/center_modal.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 20 | -------------------------------------------------------------------------------- /app/django/templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block title %}Log In | IBS{% endblock %} 4 | 5 | {% block content %} 6 | 7 | 8 |

    로그인

    9 |

    Enter your ID and password to access account.

    10 | 11 | {% include 'registration/login-form.html' %} 12 | 13 | 14 | 19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /app/django/templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block title %}Success Password Change{% endblock %} 4 | 5 | {% block content %} 6 |
    7 |
    {{ title }}
    8 | 9 |

    Your password was changed. :: Go Home

    10 |
    11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /app/django/templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block content %} 4 |
    5 |
    {{ title }}
    6 | 7 |

    Check your inbox.

    8 |

    We've emailed you instructions for setting your password. You should receive the email shortly!

    9 |
    10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /app/django/templates/registration/password_reset_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block content %} 4 |
    5 | {% csrf_token %} 6 | 7 | 8 |

    비밀번호 초기화

    9 | 비밀번호를 잊어버렸나요? 이메일 주소를 아래에 입력하시면 새로운 비밀번호를 설정하는 절차를 이메일로 보내드리겠습니다. 10 | 11 | {% for f in form %} 12 |
    13 | 15 |
    16 | {% endfor %} 17 | 18 | 19 |
    20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /app/django/templates/registration/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block title %}Sign Up | IBS{% endblock %} 4 | 5 | {% block content %} 6 | 7 |

    회원가입

    8 |

    Enter your ID and password to make account.

    9 | 10 | {% include 'registration/register-form.html' %} 11 | 12 | 13 |
    14 |

    Already have account? 15 | 로그인 16 |

    17 |
    18 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /app/django/templates/registration/register_done.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/registration-2.html' %} 2 | 3 | {% block title %}Success Register{% endblock %} 4 | 5 | {% block content %} 6 | 7 | {#

    로그인

    #} 8 | {#

    Enter your ID and password to access account.

    #} 9 | 10 |
    11 |
    Registration Completed Successfully
    12 | 13 |

    Thank you for registering.

    14 | 15 |

    로그인 하러가기

    16 |
    17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /app/django/templates/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /app/django/work/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/work/__init__.py -------------------------------------------------------------------------------- /app/django/work/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from .project import * 2 | from .issue import * 3 | from .github import * 4 | from .inform import * 5 | from .logging import * 6 | -------------------------------------------------------------------------------- /app/django/work/admin/github.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from import_export.admin import ImportExportMixin 3 | from rangefilter.filters import DateRangeFilter 4 | 5 | from work.models import Repository, Commit, Branch 6 | 7 | 8 | @admin.register(Repository) 9 | class RepositoryAdmin(ImportExportMixin, admin.ModelAdmin): 10 | list_display = ('id', 'project', 'is_default', 'slug', 'local_path', 'is_report') 11 | list_display_links = ('project', 'slug') 12 | list_editable = ('is_default', 'local_path', 'is_report') 13 | list_filter = ('project', 'is_default', 'is_report') 14 | 15 | 16 | @admin.register(Branch) 17 | class BranchAdmin(ImportExportMixin, admin.ModelAdmin): 18 | list_display = ('id', 'repo', 'name') 19 | list_display_links = ('repo', 'name') 20 | list_filter = ('repo',) 21 | 22 | 23 | @admin.register(Commit) 24 | class CommitAdmin(admin.ModelAdmin): 25 | list_display = ('id', 'repo', 'commit_hash', 'author', 'date') 26 | list_display_links = ('commit_hash',) 27 | list_filter = ('repo', ('date', DateRangeFilter)) 28 | -------------------------------------------------------------------------------- /app/django/work/admin/inform.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from import_export.admin import ImportExportMixin 3 | 4 | from work.models import CodeDocsCategory, News, NewsFile 5 | 6 | 7 | @admin.register(CodeDocsCategory) 8 | class CodeDocsCategoryAdmin(ImportExportMixin, admin.ModelAdmin): 9 | list_display = ('pk', 'name', 'active', 'default', 'order', 'user') 10 | list_display_links = ('name',) 11 | list_editable = ('active', 'default', 'order') 12 | list_filter = ('active', 'default') 13 | 14 | 15 | class NewsFileInline(admin.TabularInline): 16 | model = NewsFile 17 | extra = 1 18 | 19 | 20 | @admin.register(News) 21 | class NewsAdmin(ImportExportMixin, admin.ModelAdmin): 22 | list_display = ('pk', 'title', 'project', 'summary', 'author') 23 | list_display_links = ('title',) 24 | inlines = (NewsFileInline,) 25 | -------------------------------------------------------------------------------- /app/django/work/admin/logging.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from rangefilter.filters import DateRangeFilter 3 | 4 | from work.models import ActivityLogEntry, IssueLogEntry 5 | 6 | 7 | @admin.register(ActivityLogEntry) 8 | class ActivityLogEntryAdmin(admin.ModelAdmin): 9 | list_display = ('pk', 'sort', 'issue', 'project', 'spent_time', 'act_date') 10 | list_display_links = ('issue',) 11 | list_filter = ('project', 'sort', ('act_date', DateRangeFilter)) 12 | 13 | 14 | @admin.register(IssueLogEntry) 15 | class IssueLogEntryAdmin(admin.ModelAdmin): 16 | list_display = ('pk', 'action', 'issue', 'comment_id', 'details', 'diff', 'timestamp') 17 | list_display_links = ('issue',) 18 | list_filter = ('action',) 19 | -------------------------------------------------------------------------------- /app/django/work/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class WorkConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'work' 7 | verbose_name = '업무 협업 관리' 8 | 9 | def ready(self): 10 | import work.signals 11 | -------------------------------------------------------------------------------- /app/django/work/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/work/management/__init__.py -------------------------------------------------------------------------------- /app/django/work/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/work/management/commands/__init__.py -------------------------------------------------------------------------------- /app/django/work/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .project import * 2 | from .issue import * 3 | from .github import * 4 | from .inform import * 5 | from .logging import * 6 | -------------------------------------------------------------------------------- /app/django/work/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/django/work/templatetags/__init__.py -------------------------------------------------------------------------------- /app/django/work/templatetags/markdown_filters.py: -------------------------------------------------------------------------------- 1 | import markdown2 2 | from django import template 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter(name='markdown') 8 | def markdown_filter(value): 9 | return markdown2.markdown(value) 10 | -------------------------------------------------------------------------------- /app/django/work/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /app/django/work/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /app/svelte/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /public/build/ 3 | 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /app/svelte/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-app", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "build": "rollup -c", 7 | "dev": "rollup -c -w", 8 | "start": "sirv public --no-clear" 9 | }, 10 | "devDependencies": { 11 | "@rollup/plugin-commonjs": "^17.1.0", 12 | "@rollup/plugin-node-resolve": "^11.2.1", 13 | "rollup": "^2.79.2", 14 | "rollup-plugin-css-only": "^3.1.0", 15 | "rollup-plugin-livereload": "^2.0.5", 16 | "rollup-plugin-svelte": "^7.2.2", 17 | "rollup-plugin-terser": "^7.0.2", 18 | "svelte": "^4.2.19" 19 | }, 20 | "dependencies": { 21 | "sirv-cli": "^2.0.2" 22 | }, 23 | "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1" 24 | } 25 | -------------------------------------------------------------------------------- /app/svelte/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/svelte/public/favicon.png -------------------------------------------------------------------------------- /app/svelte/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Svelte app 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/svelte/src/App.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
    6 |

    Hello {name}!

    7 |

    Visit the Svelte tutorial to learn how to build Svelte apps.

    8 |
    9 | 10 | 31 | -------------------------------------------------------------------------------- /app/svelte/src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | 3 | const app = new App({ 4 | target: document.body, 5 | props: { 6 | name: 'world' 7 | } 8 | }); 9 | 10 | export default app; -------------------------------------------------------------------------------- /app/vue/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | require('@rushstack/eslint-patch/modern-module-resolution') 3 | 4 | module.exports = { 5 | root: true, 6 | 'extends': [ 7 | 'plugin:vue/vue3-essential', 8 | 'eslint:recommended', 9 | '@vue/eslint-config-typescript', 10 | '@vue/eslint-config-prettier/skip-formatting' 11 | ], 12 | overrides: [ 13 | { 14 | files: [ 15 | 'cypress/e2e/**/*.{cy,spec}.{js,ts,jsx,tsx}' 16 | ], 17 | 'extends': [ 18 | 'plugin:cypress/recommended' 19 | ] 20 | } 21 | ], 22 | parserOptions: { 23 | ecmaVersion: 'latest' 24 | }, 25 | rules: { 26 | 'no-extra-boolean-cast': 'off', 27 | 'vue/multi-word-component-names': 'off' 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/vue/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | # vue3 project 31 | */api/host.ts 32 | 33 | # vitepress 34 | **/.vitepress/cache 35 | .vite_opt_cache 36 | -------------------------------------------------------------------------------- /app/vue/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/prettierrc", 3 | "arrowParens": "avoid", 4 | "bracketSpacing": true, 5 | "semi": false, 6 | "trailingComma": "all", 7 | "singleQuote": true, 8 | "tabWidth": 2, 9 | "printWidth": 100 10 | } 11 | -------------------------------------------------------------------------------- /app/vue/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | projectId: '6v5mmc', 5 | e2e: { 6 | specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}', 7 | baseUrl: 'http://localhost:4173' 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /app/vue/cypress/e2e/example.cy.ts: -------------------------------------------------------------------------------- 1 | // https://on.cypress.io/api 2 | 3 | describe('My First Test', () => { 4 | it('visits the app root url', () => { 5 | cy.visit('/') 6 | cy.contains('h1', 'You did it!') 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /app/vue/cypress/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["./**/*", "../support/**/*"], 4 | "compilerOptions": { 5 | "isolatedModules": false, 6 | "target": "es5", 7 | "lib": ["es5", "dom"], 8 | "types": ["cypress"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/vue/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /app/vue/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /app/vue/docs/authority/admin-page.md: -------------------------------------------------------------------------------- 1 | # 관리자 페이지 소개 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/authority/index.md: -------------------------------------------------------------------------------- 1 | # 사용자 권한 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/cashes/manage.md: -------------------------------------------------------------------------------- 1 | # 입출금 정보 관리 2 | 3 | ## aa 4 | -------------------------------------------------------------------------------- /app/vue/docs/cashes/settings.md: -------------------------------------------------------------------------------- 1 | # 입출금 관련 기본 설정 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/contract/bill-notice.md: -------------------------------------------------------------------------------- 1 | # 수납 고지서 발급 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/contract/index.md: -------------------------------------------------------------------------------- 1 | # 계약 정보 등록 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/contract/payment.md: -------------------------------------------------------------------------------- 1 | # 대금 수납 등록 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/contract/release.md: -------------------------------------------------------------------------------- 1 | # 계약 해지 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/document/index.md: -------------------------------------------------------------------------------- 1 | # 일반 문서 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/document/legal-case.md: -------------------------------------------------------------------------------- 1 | # 소송 기록 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/docs/favicon.png -------------------------------------------------------------------------------- /app/vue/docs/intro/getting-started.md: -------------------------------------------------------------------------------- 1 | # 시작하기 2 | 3 | ## 설치 4 | 5 | -------------------------------------------------------------------------------- /app/vue/docs/settings/company.md: -------------------------------------------------------------------------------- 1 | # 회사정보 설정 및 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/settings/details.md: -------------------------------------------------------------------------------- 1 | # 세부정보 설정 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/settings/project.md: -------------------------------------------------------------------------------- 1 | # 프로젝트 정보 설정 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/docs/settings/site-manage.md: -------------------------------------------------------------------------------- 1 | # 사업부지 정보 관리 2 | 3 | ## 메뉴 4 | -------------------------------------------------------------------------------- /app/vue/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /app/vue/public/img/NoImage.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/NoImage.jpeg -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-144x144.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-192x192.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-36x36.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-48x48.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-72x72.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/android-icon-96x96.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-114x114.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-120x120.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-144x144.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-180x180.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-57x57.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-60x60.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-72x72.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-76x76.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/apple-icon.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /app/vue/public/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/favicon-96x96.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/favicon.ico -------------------------------------------------------------------------------- /app/vue/public/img/icons/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /app/vue/public/img/icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/ms-icon-150x150.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/ms-icon-310x310.png -------------------------------------------------------------------------------- /app/vue/public/img/icons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/public/img/icons/ms-icon-70x70.png -------------------------------------------------------------------------------- /app/vue/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /app/vue/src/assets/brand/sygnet.ts: -------------------------------------------------------------------------------- 1 | export const sygnet = [ 2 | '160 160', 3 | ` 4 | coreui logo 5 | 6 | 7 | 8 | 9 | 10 | 11 | `, 12 | ] 13 | -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/1.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/2.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/3.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/4.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/5.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/6.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/7.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/images/avatars/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/assets/images/avatars/8.jpg -------------------------------------------------------------------------------- /app/vue/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/vue/src/assets/main.css: -------------------------------------------------------------------------------- 1 | @import './base.css'; 2 | 3 | #app { 4 | max-width: 1280px; 5 | margin: 0 auto; 6 | padding: 2rem; 7 | 8 | font-weight: normal; 9 | } 10 | 11 | a, 12 | .green { 13 | text-decoration: none; 14 | color: hsla(160, 100%, 37%, 1); 15 | transition: 0.4s; 16 | } 17 | 18 | @media (hover: hover) { 19 | a:hover { 20 | background-color: hsla(160, 100%, 37%, 0.2); 21 | } 22 | } 23 | 24 | @media (min-width: 1024px) { 25 | body { 26 | display: flex; 27 | place-items: center; 28 | } 29 | 30 | #app { 31 | display: grid; 32 | grid-template-columns: 1fr 1fr; 33 | padding: 0 2rem; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/vue/src/components/BlankComponent.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/vue/src/components/ContChoicer/Index.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /app/vue/src/components/Documents/CategoryTabs.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 34 | -------------------------------------------------------------------------------- /app/vue/src/components/DownLoad/ExcelExport.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /app/vue/src/components/DownLoad/PdfExport.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /app/vue/src/components/FileUpload.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 20 | -------------------------------------------------------------------------------- /app/vue/src/components/Loading/Index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /app/vue/src/components/MdEditor/Index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | 28 | -------------------------------------------------------------------------------- /app/vue/src/components/Modals/TodoModal.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | -------------------------------------------------------------------------------- /app/vue/src/components/MultiSelect/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | -------------------------------------------------------------------------------- /app/vue/src/components/OtherParts/PostContent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /app/vue/src/components/Pagination/index.ts: -------------------------------------------------------------------------------- 1 | import { Pagination } from './Pagination' 2 | 3 | export default Pagination 4 | -------------------------------------------------------------------------------- /app/vue/src/components/Posts/CategoryTabs.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 34 | -------------------------------------------------------------------------------- /app/vue/src/components/QuillEditor/index.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /app/vue/src/components/TableTitleRow.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/BackToTop.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest' 2 | 3 | import { shallowMount } from '@vue/test-utils' 4 | import BackToTop from '../BackToTop/index.vue' 5 | 6 | describe('BackToTop', () => { 7 | it('BackToTop component', () => { 8 | const wrapper = shallowMount(BackToTop, { 9 | props: { 10 | customStyle: { 11 | right: '50px', 12 | bottom: '50px', 13 | width: '46px', 14 | height: '46px', 15 | }, 16 | transitionName: 'fade', 17 | }, 18 | }) 19 | 20 | expect(wrapper.find('div').attributes('style')).toContain( 21 | 'right: 50px; bottom: 50px; width: 46px; height: 46px;', 22 | ) 23 | expect(wrapper.find('transition-stub').attributes('name')).toBe('fade') 24 | }) 25 | }) 26 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/BlankComponent.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createVuetify } from 'vuetify' 4 | import CoreuiVue from '@coreui/vue' 5 | 6 | import BlankComponent from '../BlankComponent.vue' 7 | 8 | const vuetify = createVuetify() 9 | 10 | describe('BlankComponent Component Test', () => { 11 | it('Blank comp test', () => { 12 | const wrapper = mount(BlankComponent, { 13 | global: { 14 | plugins: [vuetify, CoreuiVue], 15 | stubs: ['CIcon'], 16 | }, 17 | }) 18 | 19 | expect(wrapper.find('.card').exists()).toBeTruthy() 20 | expect(wrapper.find('.card').findAll('div')).toHaveLength(3) 21 | expect(wrapper.find('.card-header').exists()).toBeTruthy() 22 | expect(wrapper.find('.card-header').text()).toBe('Subpage Title') 23 | expect(wrapper.find('.card-body').exists()).toBeTruthy() 24 | expect(wrapper.find('.card-footer').exists()).toBeTruthy() 25 | }) 26 | }) 27 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/DatePicker.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | 6 | import DatePicker from '../DatePicker/index.vue' 7 | 8 | const vuetify = createVuetify() 9 | 10 | describe('DatePicker Component Test', () => { 11 | it('VueDatePicker elements test', () => { 12 | const wrapper = mount(DatePicker, { 13 | global: { 14 | plugins: [createTestingPinia(), vuetify], 15 | }, 16 | }) 17 | 18 | expect(wrapper.find('.dp__input_wrap').find('input').exists()).toBeTruthy() 19 | expect(wrapper.find('.dp__input_wrap').html()).toContain('data-maska="####-##-##"') 20 | expect(wrapper.find('.dp__input_icon').find('i').exists()).toBeTruthy() 21 | // expect(wrapper.find('transition-stub[name=dp-menu-appear-bottom]').exists()).toBeTruthy() 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/DaumPostCode.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | 5 | import DaumPostCode from '@/components/DaumPostcode/index.vue' 6 | 7 | describe('DaumPostCode Component Test', () => { 8 | it('Daum post code layer test', () => { 9 | const wrapper = mount(DaumPostCode, { 10 | global: { 11 | plugins: [createTestingPinia()], 12 | }, 13 | }) 14 | 15 | expect(wrapper.find('#layer').exists()).toBeTruthy() 16 | expect(wrapper.find('img[id=btnCloseLayer]').exists()).toBeTruthy() 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/Documents.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | import CoreuiVue from '@coreui/vue' 6 | 7 | import CategoryTabs from '../Documents/CategoryTabs.vue' 8 | 9 | const vuetify = createVuetify() 10 | 11 | describe('CategoryTabs Component Test', () => { 12 | it('should ', () => { 13 | const wrapper = mount(CategoryTabs, { 14 | global: { 15 | plugins: [createTestingPinia(), vuetify, CoreuiVue], 16 | mocks: {}, 17 | provide: {}, 18 | components: {}, 19 | directives: {}, 20 | stubs: [], 21 | }, 22 | attrs: {}, 23 | props: {}, 24 | slots: {}, 25 | shallow: true, 26 | }) 27 | 28 | console.log(wrapper.html()) 29 | }) 30 | }) 31 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/FileUpload.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | 4 | import FileUpload from '../FileUpload.vue' 5 | 6 | describe('FileUpload Component Test', () => { 7 | it('file input check', () => { 8 | const wrapper = mount(FileUpload) 9 | 10 | expect(wrapper.find('input[type=file]').exists()).toBeTruthy() 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/QuillEditor.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | 4 | import QuillEditor from '../QuillEditor/index.vue' 5 | 6 | describe('QuillEditor Component Test', () => { 7 | it('Quild editor test', () => { 8 | const wrapper = mount(QuillEditor) 9 | 10 | expect(wrapper.find('.ql-container').exists()).toBeTruthy() 11 | expect(wrapper.find('.ql-editor').exists()).toBeTruthy() 12 | expect(wrapper.find('.ql-clipboard').exists()).toBeTruthy() 13 | expect(wrapper.find('.ql-tooltip').exists()).toBeTruthy() 14 | expect(wrapper.find('a.ql-preview').exists()).toBeTruthy() 15 | expect(wrapper.find('input[type=text]').exists()).toBeTruthy() 16 | expect(wrapper.find('a.ql-remove').exists()).toBeTruthy() 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /app/vue/src/components/__tests__/Spinner.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | 4 | import Spinner from '../Spinner/index.vue' 5 | 6 | describe('Spinner Component Test', () => { 7 | it('spinner comp test', async () => { 8 | const wrapper = mount(Spinner, { 9 | props: { 10 | loading: true, 11 | }, 12 | }) 13 | 14 | expect(wrapper.find('.modal').exists()).toBeTruthy() 15 | expect(wrapper.find('.lds-facebook').exists()).toBeTruthy() 16 | expect(wrapper.find('.lds-facebook').findAll('div')).toHaveLength(3) 17 | 18 | await wrapper.setProps({ loading: false }) 19 | 20 | expect(wrapper.find('.modal').exists()).toBeFalsy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /app/vue/src/layouts/ContentBody/Index.vue: -------------------------------------------------------------------------------- 1 | 6 | 24 | -------------------------------------------------------------------------------- /app/vue/src/layouts/ContentHeader/components/HeaderNav.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | -------------------------------------------------------------------------------- /app/vue/src/layouts/DefaultLayout.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /app/vue/src/layouts/__tests__/App.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { shallowMount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | import CoreuiVue from '@coreui/vue' 6 | 7 | import App from '@/App.vue' 8 | 9 | const vuetify = createVuetify() 10 | 11 | describe('App Component Test', () => { 12 | it('fullheight attributes check', () => { 13 | const wrapper = shallowMount(App, { 14 | global: { 15 | plugins: [createTestingPinia(), vuetify, CoreuiVue], 16 | stubs: ['router-view'], 17 | }, 18 | }) 19 | 20 | expect(wrapper.attributes('fullheight')).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /app/vue/src/layouts/__tests__/ContentBody.spec.ts: -------------------------------------------------------------------------------- 1 | import { beforeEach, describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createVuetify } from 'vuetify' 4 | 5 | import CoreuiVue from '@coreui/vue' 6 | import ContentBody from '../ContentBody/Index.vue' 7 | 8 | const vuetify = createVuetify() 9 | 10 | const mockRoute = { 11 | name: 'some-title', 12 | meta: { 13 | title: null as string | null, 14 | }, 15 | } 16 | 17 | describe('Content Body Testing', () => { 18 | let wrapper: any 19 | beforeEach(() => { 20 | wrapper = mount(ContentBody, { 21 | global: { 22 | plugins: [vuetify, CoreuiVue], 23 | mocks: { 24 | route: mockRoute, 25 | }, 26 | }, 27 | slots: { 28 | default: `Hello default slot`, 29 | }, 30 | }) 31 | }) 32 | 33 | it('header title check', () => { 34 | expect(wrapper.html()).toContain('some-title') 35 | }) 36 | 37 | it('default slot Test', () => { 38 | expect(wrapper.html()).toContain('Hello default slot') 39 | }) 40 | }) 41 | -------------------------------------------------------------------------------- /app/vue/src/layouts/containers/AppFooter.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /app/vue/src/layouts/containers/AppSidebar.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | -------------------------------------------------------------------------------- /app/vue/src/layouts/containers/__tests__/AppAside.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { shallowMount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | import CoreuiVue from '@coreui/vue' 6 | 7 | import AppAside from '@/layouts/containers/AppAside.vue' 8 | 9 | const vuetify = createVuetify() 10 | 11 | describe('AppAside Component Test', () => { 12 | it('sidebar exsists check', () => { 13 | const wrapper = shallowMount(AppAside, { 14 | global: { 15 | plugins: [createTestingPinia(), vuetify, CoreuiVue], 16 | stubs: ['CIcon'], 17 | }, 18 | props: { 19 | position: 'fixed', 20 | }, 21 | }) 22 | 23 | expect(wrapper.html()).toContain('c-sidebar-stub') 24 | }) 25 | }) 26 | -------------------------------------------------------------------------------- /app/vue/src/layouts/containers/__tests__/AppFooter.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import CoreuiVue from '@coreui/vue' 4 | 5 | import AppFooter from '@/layouts/containers/AppFooter.vue' 6 | 7 | describe('AppFooter Component Test', () => { 8 | it('footer exists & 2 divs check', () => { 9 | const wrapper = mount(AppFooter, { 10 | global: { 11 | plugins: [CoreuiVue], 12 | }, 13 | }) 14 | 15 | expect(wrapper.find('.footer').exists()).toBeTruthy() 16 | expect(wrapper.find('.footer').findAll('div')).toHaveLength(2) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /app/vue/src/layouts/containers/__tests__/AppSidebar.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | import { mount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | import CoreuiVue from '@coreui/vue' 6 | 7 | import AppSidebar from '@/layouts/containers/AppSidebar.vue' 8 | 9 | const vuetify = createVuetify() 10 | 11 | describe('AppSidebar Component Test', () => { 12 | it('sidebar brand, nav & toggler check', () => { 13 | const wrapper = mount(AppSidebar, { 14 | global: { 15 | plugins: [createTestingPinia(), vuetify, CoreuiVue], 16 | stubs: ['CIcon', 'app-sidebar-nav'], 17 | }, 18 | }) 19 | 20 | const brand = wrapper.find('.sidebar-brand') 21 | 22 | expect(brand.html()).toContain('sidebar-brand-full') 23 | expect(brand.html()).toContain('sidebar-brand-narrow') 24 | expect(wrapper.html()).toContain('app-sidebar-nav') 25 | expect(wrapper.find('button').classes()).toContain('sidebar-toggler') 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /app/vue/src/plugins/vuetify.ts: -------------------------------------------------------------------------------- 1 | // Styles 2 | import '@mdi/font/css/materialdesignicons.css' 3 | import 'vuetify/styles' 4 | 5 | // Vuetify 6 | import { createVuetify } from 'vuetify' 7 | 8 | const myCustomLightTheme = { 9 | // dark: false, 10 | colors: { 11 | // background: '#FFFFFF', 12 | // surface: '#FFFFFF', 13 | // primary: '#6200EE', 14 | // 'primary-darken-1': '#3700B3', 15 | secondary: '#CCCDCE', 16 | // 'secondary-darken-1': '#018786', 17 | // error: '#B00020', 18 | // info: '#2196F3', 19 | // success: '#4CAF50', 20 | // warning: '#FB8C00', 21 | }, 22 | } 23 | 24 | export default createVuetify({ 25 | theme: { 26 | defaultTheme: 'myCustomLightTheme', 27 | themes: { 28 | myCustomLightTheme, 29 | }, 30 | }, 31 | }) 32 | // https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides 33 | -------------------------------------------------------------------------------- /app/vue/src/plugins/webfontloader.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * plugins/webfontloader.js 3 | * 4 | * webfontloader documentation: https://github.com/typekit/webfontloader 5 | */ 6 | 7 | export async function loadFonts() { 8 | const webFontLoader = await import(/* webpackChunkName: "webfontloader" */ 'webfontloader') 9 | 10 | webFontLoader.load({ 11 | google: { 12 | families: ['Roboto:100,300,400,500,700,900&display=swap'], 13 | }, 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /app/vue/src/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/public/favicon.ico -------------------------------------------------------------------------------- /app/vue/src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router' 2 | import Cookies from 'js-cookie' 3 | import routes from '@/router/routes' 4 | 5 | const router = createRouter({ 6 | history: createWebHashHistory(), 7 | routes, 8 | }) 9 | 10 | router.beforeEach((to, from, next) => { 11 | if (!!to.meta.auth) Cookies.set('redirectPath', to.path) 12 | next() 13 | }) 14 | 15 | export default router 16 | -------------------------------------------------------------------------------- /app/vue/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import type { DefineComponent } from 'vue' 3 | const component: DefineComponent<{}, {}, any> 4 | export default component 5 | } 6 | -------------------------------------------------------------------------------- /app/vue/src/shims-vuetify.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'vuetify' 2 | declare module 'vuetify/lib/components' 3 | declare module 'vuetify/lib/directives' 4 | -------------------------------------------------------------------------------- /app/vue/src/store/pinia/work_issue.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/store/pinia/work_issue.ts -------------------------------------------------------------------------------- /app/vue/src/store/types/notice.ts: -------------------------------------------------------------------------------- 1 | export declare interface SalesBillIssue { 2 | pk: number | null 3 | project: number | null 4 | now_payment_order: number | null 5 | host_name: string 6 | host_tel: string 7 | agency: string 8 | agency_tel: string 9 | bank_account1: string 10 | bank_number1: string 11 | bank_host1: string 12 | bank_account2: string 13 | bank_number2: string 14 | bank_host2: string 15 | zipcode: string 16 | address1: string 17 | address2: string 18 | address3: string 19 | title: string 20 | content: string 21 | } 22 | -------------------------------------------------------------------------------- /app/vue/src/store/types/schedule.ts: -------------------------------------------------------------------------------- 1 | export interface Schedule { 2 | pk: number 3 | title: string 4 | all_day: boolean 5 | start_date: string | null 6 | end_date: string | null 7 | start_time: string | null 8 | end_time: string | null 9 | } 10 | 11 | export interface Event { 12 | id?: number 13 | title: string 14 | allDay?: boolean 15 | start?: string 16 | end?: string 17 | } 18 | -------------------------------------------------------------------------------- /app/vue/src/store/types/settings.ts: -------------------------------------------------------------------------------- 1 | export interface Company { 2 | pk: number | null 3 | name: string 4 | ceo: string 5 | tax_number: string 6 | org_number: string 7 | business_cond: string 8 | business_even: string 9 | es_date: string 10 | op_date: string 11 | zipcode: string 12 | address1: string 13 | address2: string 14 | address3: string 15 | departments?: Department[] 16 | positions?: Positions[] 17 | com_issue_project?: number | null 18 | } 19 | 20 | export interface Logo { 21 | pk: number 22 | company: number 23 | generic_logo: string 24 | dark_logo: string 25 | simple_logo: string 26 | } 27 | 28 | interface Department { 29 | name: string 30 | task: string 31 | } 32 | 33 | interface Positions { 34 | pk: number 35 | rank: string 36 | title: string 37 | description: string 38 | } 39 | -------------------------------------------------------------------------------- /app/vue/src/store/types/tagsView.ts: -------------------------------------------------------------------------------- 1 | export interface VisitedView { 2 | name: string 3 | path: string 4 | fullPath: string 5 | meta: Meta 6 | } 7 | 8 | export interface Meta { 9 | title?: string 10 | auth?: boolean 11 | affix?: boolean 12 | noCache?: boolean 13 | } 14 | 15 | export type CachedViews = { 16 | [key: number]: string 17 | } 18 | -------------------------------------------------------------------------------- /app/vue/src/store/types/work_inform.ts: -------------------------------------------------------------------------------- 1 | import type { SimpleProject, SimpleUser } from '@/store/types/work_project.ts' 2 | 3 | export interface News { 4 | pk?: number 5 | project?: SimpleProject 6 | title: string 7 | summary: string 8 | description: string 9 | author?: SimpleUser 10 | created: string 11 | } 12 | -------------------------------------------------------------------------------- /app/vue/src/store/types/work_issue.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nc2U/ibs/781a065972806f719a9fa531b90d93e5d75cd9a9/app/vue/src/store/types/work_issue.ts -------------------------------------------------------------------------------- /app/vue/src/styles/_transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* fade-transform */ 15 | .fade-transform-leave-active, 16 | .fade-transform-enter-active { 17 | transition: all 0.5s; 18 | } 19 | 20 | .fade-transform-enter { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-transform-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | /* breadcrumb transition */ 31 | .breadcrumb-move, 32 | .breadcrumb-enter-active, 33 | .breadcrumb-leave-active { 34 | transition: all 0.5s ease; 35 | } 36 | 37 | .breadcrumb-enter, 38 | .breadcrumb-leave-active { 39 | opacity: 0; 40 | transform: translateX(20px); 41 | } 42 | 43 | .breadcrumb-leave-active { 44 | position: absolute; 45 | } 46 | -------------------------------------------------------------------------------- /app/vue/src/styles/style.scss: -------------------------------------------------------------------------------- 1 | // If you want to override variables do it here 2 | @import 'variables'; 3 | 4 | // Import styles Chart.js Tooltips 5 | @import 'ui/scss/themes/dark'; 6 | @import '@coreui/coreui/scss/coreui'; 7 | @import '@coreui/chartjs/scss/tooltips'; 8 | 9 | // Layout 10 | @import 'layout'; 11 | 12 | // If you want to add something do it here 13 | @import 'custom'; 14 | 15 | // Transition 16 | @import 'transition'; 17 | 18 | // Plugins 19 | @import 'mosha-vue-toastify/dist/style'; 20 | @import '@vueform/multiselect/themes/default.scss'; 21 | @import "@vuepic/vue-datepicker/dist/main.css"; 22 | 23 | // Plugins css override 24 | @import 'customize/datepicker'; 25 | @import 'customize/multi_select'; 26 | @import 'customize/calendar'; 27 | -------------------------------------------------------------------------------- /app/vue/src/styles/ui/scss/themes/dark/_root.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable scss/selector-no-redundant-nesting-selector 2 | & { 3 | @each $color, $value in $theme-colors-dt { 4 | --#{$prefix}#{$color}: #{$value}; 5 | } 6 | 7 | @each $color, $value in $theme-colors-rgb-dt { 8 | --#{$prefix}#{$color}-rgb: #{$value}; 9 | } 10 | 11 | --#{$prefix}body-color-rgb: #{to-rgb($body-color-dt)}; 12 | --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dt)}; 13 | 14 | // Gradients 15 | @each $color, $map in $theme-gradients-dt { 16 | --#{$prefix}#{$color}-start: #{map-get($map, 'start')}; 17 | --#{$prefix}#{$color}-stop: #{map-get($map, 'stop')}; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/vue/src/types/images.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.jpg' 2 | declare module '*.jpeg' 3 | declare module '*.png' 4 | -------------------------------------------------------------------------------- /app/vue/src/utils/areaMixins.ts: -------------------------------------------------------------------------------- 1 | import { numFormat } from '@/utils/baseMixins' 2 | 3 | // export const areaM2Format = (value: number, n = 2) => { 4 | // return !value || value === 0 ? '-' : `${numFormat(value, n)} ㎡` 5 | // } 6 | // 7 | // export const areaPyFormat = (value: number, n = 2) => { 8 | // return !value || value === 0 ? '-' : `${numFormat(value * 0.3025, n)} 평` 9 | // } 10 | 11 | export const areaM2PyFormat = (value: number, n = 2) => { 12 | return !value || value === 0 13 | ? '-' 14 | : `${numFormat(value, n)} ㎡ (${numFormat(value * 0.3025, n)} 평)` 15 | } 16 | 17 | export const ratioFormat = (value: number, n = 2) => { 18 | return !value || value === 0 ? '-' : `${numFormat(value, n)} %` 19 | } 20 | -------------------------------------------------------------------------------- /app/vue/src/utils/nprogress.ts: -------------------------------------------------------------------------------- 1 | import NProgress from 'nprogress' 2 | import 'nprogress/nprogress.css' 3 | 4 | // Configuration of global progress bar 5 | NProgress.configure({ 6 | easing: 'ease', // Animation mode 7 | speed: 1000, // Increase the speed of the progress bar 8 | showSpinner: false, // Show load ico 9 | trickleSpeed: 200, // Auto increment interval 10 | minimum: 0.3, // Change the minimum percentage used at startup 11 | parent: 'body', // Specify the parent container of the progress bar 12 | }) 13 | 14 | // Open the progress bar 15 | export const start = () => { 16 | NProgress.start() 17 | } 18 | // Close progress bar 19 | export const close = () => { 20 | NProgress.done() 21 | } 22 | -------------------------------------------------------------------------------- /app/vue/src/views/_Accounts/NoAuth.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | 16 | 28 | -------------------------------------------------------------------------------- /app/vue/src/views/_Accounts/components/SocialLogin.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/Charts/CChartBarExample.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 39 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/Charts/CChartDoughnutExample.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 25 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/Charts/CChartLineExample.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 31 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/Charts/CChartPieExample.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 25 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/Charts/index.js: -------------------------------------------------------------------------------- 1 | import CChartLineExample from './CChartLineExample' 2 | import CChartBarExample from './CChartBarExample' 3 | import CChartDoughnutExample from './CChartDoughnutExample' 4 | import CChartRadarExample from './CChartRadarExample' 5 | import CChartPieExample from './CChartPieExample' 6 | import CChartPolarAreaExample from './CChartPolarAreaExample' 7 | 8 | export { 9 | CChartLineExample, 10 | CChartBarExample, 11 | CChartDoughnutExample, 12 | CChartRadarExample, 13 | CChartPieExample, 14 | CChartPolarAreaExample, 15 | } 16 | -------------------------------------------------------------------------------- /app/vue/src/views/_Dashboard/components/MainCarousel.vue: -------------------------------------------------------------------------------- 1 | 13 | 22 | -------------------------------------------------------------------------------- /app/vue/src/views/_MyPage/MyTodoList/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | -------------------------------------------------------------------------------- /app/vue/src/views/_MyPage/OwnInfo/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /app/vue/src/views/_MyPage/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | import { computed } from 'vue' 2 | import { useAccount } from '@/store/pinia/account' 3 | 4 | const accStore = useAccount() 5 | const superAuth = computed(() => accStore.superAuth) 6 | 7 | export const pageTitle = '마이 페이지' 8 | export const navMenu = superAuth.value 9 | ? [ 10 | '내 정보', 11 | '할일 관리', 12 | '내 등록 문서', 13 | '내 작성글', 14 | '스크랩', 15 | '휴지통', 16 | '정보 수정', 17 | '탈퇴 하기', 18 | ] 19 | : ['내 정보', '할일 관리', '내 등록 문서', '내 작성글', '스크랩', '정보 수정', '탈퇴 하기'] 20 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Issues/components/IssueReport.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/News/components/NewsList.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/Documents/components/AddNewDoc.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/Documents/components/Docs.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 26 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/Forums/Index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 33 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/Overview/components/SubProjects.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/ProjectCreate.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/Projects/components/Settings/components/Forum.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 24 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/SpentTime/components/HeaderTab.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/Manages/SpentTime/components/TimeEntryReport.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/_menu/headermixin1.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '업 무 관 리' 2 | export const navMenu1 = ['프로젝트', '작업내역'] 3 | export const navMenu2 = ['프로젝트', '작업내역', '업무', '소요시간', '간트차트', '달력', '공지'] 4 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/_menu/headermixin3.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '설 정 관 리' 2 | 3 | export const navMenu = [ 4 | '(프로젝트)', 5 | '사용자', 6 | // '그룹', 7 | '역할 및 권한', 8 | '업무 유형', 9 | '업무 상태', 10 | '업무 흐름', 11 | '코드값', 12 | '제반 설정', 13 | ] 14 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/components/IProjectSelect.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /app/vue/src/views/_Work/components/NoData.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /app/vue/src/views/comCash/Status/components/DateChoicer.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /app/vue/src/views/comCash/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '본사 자금 관리' 2 | export const navMenu = ['본사 자금 현황', '본사 출납 내역'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/comDocs/OfficialLetter/Index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | -------------------------------------------------------------------------------- /app/vue/src/views/comDocs/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '본사 문서 관리' 2 | export const navMenu = ['본사 일반 문서', '본사 소송 문서', '본사 소송 사건', '본사 공문 발송'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/contracts/Release/components/ReleasetButton.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 30 | -------------------------------------------------------------------------------- /app/vue/src/views/contracts/Succession/components/SuccessionButton.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/vue/src/views/contracts/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '공급 계약 관리' 2 | export const navMenu = [ 3 | '계약 내역 조회', 4 | '계약 등록 수정', 5 | '권리 의무 승계', 6 | '계약 해지 관리', 7 | '동호 배치 현황', 8 | ] 9 | -------------------------------------------------------------------------------- /app/vue/src/views/hrManage/_menu/headermixin1.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '본사 인사 관리' 2 | export const navMenu = ['직원 정보 관리', '부서 정보 관리'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/hrManage/_menu/headermixin2.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '기타 설정 관리' 2 | export const navMenu = ['직위 정보 관리', '직책 정보 관리', '직급 정보 관리'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/notices/Label/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /app/vue/src/views/notices/Log/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /app/vue/src/views/notices/Mailing/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /app/vue/src/views/notices/Sms/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /app/vue/src/views/notices/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '고객 고지 관리' 2 | export const navMenu = [ 3 | '수납 고지서 출력', 4 | // 'SMS 발송 관리', 5 | // 'MAIL 발송 관리', 6 | // '우편 라벨 관리', 7 | // '발송 기록 관리', 8 | ] 9 | -------------------------------------------------------------------------------- /app/vue/src/views/payments/Status/components/DateChoicer.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /app/vue/src/views/payments/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '분양 수납 관리' 2 | export const navMenu = ['전체 납부 내역', '건별 수납 관리', '수납 현황 집계'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/proCash/Status/components/DateChoicer.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /app/vue/src/views/proCash/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '현장 자금 관리' 2 | export const navMenu = ['현장 자금 현황', '현장 출납 내역', '운영 비용 내역'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/proDocs/_menu/headermixin1.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '현장 문서 관리' 2 | export const navMenu = ['현장 일반 문서', '현장 소송 문서', '현장 소송 사건'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/proDocs/_menu/headermixin2.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '현장 소송 관리' 2 | export const navMenu = ['현장 소송 문서', '현장 소송 사건'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/List/components/IssueProjectForm.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/Unit/components/Unit.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 30 | 31 | 41 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin1.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '현장 등록 관리' 2 | export const navMenu = ['신규 현장 등록'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin2.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '사업 부지 관리' 2 | export const navMenu = ['지번 목록 관리', '소유자 별 관리', '매입 계약 관리'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin3.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '예산 등록 관리' 2 | export const navMenu = ['수입 예산 등록', '지출 예산 등록'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin4.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '차수 타입 관리' 2 | export const navMenu = ['차수 분류 등록', '타입 정보 등록', '층별 조건 등록'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin5.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '유닛 등록 관리' 2 | export const navMenu = ['동(건물) 등록', '호(유닛) 등록'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/projects/_menu/headermixin6.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '분양 계약 조건' 2 | export const navMenu = ['납부 회차 등록', '공급 가격 등록', '계약 금액 등록', '옵션 품목 등록'] 3 | -------------------------------------------------------------------------------- /app/vue/src/views/settings/Authorization/__tests__/Authorization.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest' 2 | import { mount, shallowMount } from '@vue/test-utils' 3 | import { createTestingPinia } from '@pinia/testing' 4 | import { createVuetify } from 'vuetify' 5 | import CoreuiVue from '@coreui/vue' 6 | 7 | import Authorization from '../Index.vue' 8 | 9 | const vuetify = createVuetify() 10 | 11 | describe('Authorization Component Test', () => { 12 | it('should ', () => { 13 | const wrapper = mount(Authorization, { 14 | global: { 15 | plugins: [createTestingPinia(), vuetify, CoreuiVue], 16 | mocks: {}, 17 | provide: {}, 18 | components: {}, 19 | directives: {}, 20 | stubs: ['CIcon'], 21 | }, 22 | attrs: {}, 23 | props: {}, 24 | slots: {}, 25 | shallow: true, 26 | }) 27 | 28 | console.log(wrapper.html(), '---') 29 | }) 30 | }) 31 | -------------------------------------------------------------------------------- /app/vue/src/views/settings/_menu/headermixin.ts: -------------------------------------------------------------------------------- 1 | export const pageTitle = '환경 설정' 2 | export const navMenu = ['회사 정보 관리', '권한 설정 관리'] 3 | -------------------------------------------------------------------------------- /app/vue/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": [ 4 | "src", 5 | "src/**/*", 6 | "src/**/*.ts", 7 | "src/**/*.d.ts", 8 | "src/**/*.tsx", 9 | "src/**/*.vue", 10 | "src/**/*.json", 11 | "env.d.ts" 12 | ], 13 | "exclude": [ 14 | "src/**/__tests__/*" 15 | ], 16 | "compilerOptions": { 17 | "composite": true, 18 | "importHelpers": true, 19 | "baseUrl": ".", 20 | "allowJs": true, 21 | "paths": { 22 | "@/*": [ 23 | "./src/*" 24 | ] 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/vue/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | }, 10 | { 11 | "path": "./tsconfig.vitest.json" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /app/vue/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node22/tsconfig.json", 3 | "include": [ 4 | "vite.config.*", 5 | "vitest.config.*", 6 | "cypress.config.*", 7 | "nightwatch.conf.*", 8 | "playwright.config.*", 9 | ".eslintrc.cjs" 10 | // ".prettierrc.json" 11 | ], 12 | "compilerOptions": { 13 | "composite": true, 14 | "target": "ES2022", 15 | "module": "ESNext", 16 | "moduleResolution": "node", 17 | "allowImportingTsExtensions": true, 18 | "types": [ 19 | "node", 20 | "vitest", 21 | "cypress", 22 | "playwright" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/vue/tsconfig.vitest.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | "exclude": [ 4 | "node_modules" 5 | ], 6 | "compilerOptions": { 7 | "composite": true, 8 | "noImplicitAny": false, 9 | "lib": [], 10 | "types": [ 11 | "node", 12 | "jsdom" 13 | ] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/vue/vitest.config.mts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url' 2 | import { mergeConfig, defineConfig } from 'vite' 3 | import { configDefaults } from 'vitest/config' 4 | import viteConfig from './vite.config.mts' 5 | 6 | export default mergeConfig( 7 | viteConfig, 8 | // @ts-ignore 9 | defineConfig({ 10 | test: { 11 | environment: 'jsdom', 12 | exclude: [...configDefaults.exclude, 'e2e/*'], 13 | root: fileURLToPath(new URL('./', import.meta.url)), 14 | // @ts-ignore 15 | transformMode: { 16 | web: [/\.[jt]sx$/], 17 | }, 18 | }, 19 | }), 20 | ) 21 | -------------------------------------------------------------------------------- /deploy/docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | # 기본 nginx 이미지 사용 2 | FROM nginx:1.27.1 3 | 4 | # 패키지 목록 업데이트 및 netcat 설치 (하나의 RUN 명령으로 병합) 5 | RUN apt-get update && apt-get install -y --no-install-recommends \ 6 | netcat-openbsd && \ 7 | rm -rf /var/lib/apt/lists/* 8 | -------------------------------------------------------------------------------- /deploy/docker/nginx/conf.d/log.conf: -------------------------------------------------------------------------------- 1 | log_format json '{' 2 | '"time":"$time_iso8601",' 3 | '"remote_addr":"$remote_addr",' 4 | '"request":"$request",' 5 | '"request_method":"$request_method",' 6 | '"request_length":"$request_length",' 7 | '"request_uri":"$request_uri",' 8 | '"uri":"$uri",' 9 | '"query_string":"$query_string",' 10 | '"status":"$status",' 11 | '"bytes_sent":"$bytes_sent",' 12 | '"body_bytes_sent":"$body_bytes_sent",' 13 | '"referer":"$http_referer",' 14 | '"useragent":"$http_user_agent",' 15 | '"forwardedfor":"$http_x_forwarded_for",' 16 | '"request_time":"$request_time",' 17 | '"upstream_response_time":"$upstream_response_time"' 18 | '}'; 19 | 20 | -------------------------------------------------------------------------------- /deploy/docker/nginx/conf.d/public.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | server_name $host www.$host; 4 | charset utf-8; 5 | 6 | location / { 7 | uwsgi_pass django_uwsgi; 8 | include /etc/nginx/uwsgi_params; 9 | proxy_hide_header Access-Control-Allow-Origin; 10 | add_header 'Access-Control-Allow-Origin' '*'; 11 | } 12 | 13 | location /static/ { 14 | alias /django/static/; 15 | } 16 | 17 | location /media/ { 18 | alias /django/media/; 19 | } 20 | } 21 | 22 | server_tokens off; 23 | -------------------------------------------------------------------------------- /deploy/docker/nginx/conf.d/upstream.conf: -------------------------------------------------------------------------------- 1 | upstream django_uwsgi { 2 | ip_hash; 3 | server web:8000 max_fails=3 fail_timeout=10s; 4 | } 5 | -------------------------------------------------------------------------------- /deploy/docker/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 1; 3 | 4 | error_log /var/log/nginx/error.log notice; 5 | pid /var/run/nginx.pid; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | include /etc/nginx/mime.types; 13 | default_type application/octet-stream; 14 | 15 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 16 | '$status $body_bytes_sent "$http_referer" ' 17 | '"$http_user_agent" "$http_x_forwarded_for"'; 18 | 19 | access_log /var/log/nginx/access.log main; 20 | 21 | sendfile on; 22 | #tcp_nopush on; 23 | 24 | keepalive_timeout 65; 25 | client_max_body_size 100M; 26 | 27 | gzip on; 28 | 29 | include /etc/nginx/conf.d/*.conf; 30 | } 31 | -------------------------------------------------------------------------------- /deploy/docker/python/Dockerfile: -------------------------------------------------------------------------------- 1 | # base image 2 | FROM python:3.12 3 | ENV PYTHONUNBUFFERED=1 4 | 5 | # set working directory 6 | RUN mkdir -pv /app/django 7 | WORKDIR /app/django 8 | 9 | # copy required files 10 | COPY requirements.txt . 11 | 12 | # install dependencies 13 | RUN apt update && apt upgrade -y && apt autoremove -y \ 14 | && apt install python3-dev default-libmysqlclient-dev build-essential libpq-dev gcc -y \ 15 | && apt install -y locales && locale-gen ko_KR.UTF-8 \ 16 | && apt install fonts-nanum fonts-nanum-coding fonts-nanum-extra \ 17 | && pip install --upgrade pip && pip install --upgrade setuptools \ 18 | && pip install --trusted-host pypi.python.org -r requirements.txt 19 | 20 | EXPOSE 8000 21 | 22 | # startup commands 23 | ENTRYPOINT ["uwsgi", "--socket", ":8000", "--module", "_config.wsgi", "--py-autoreload", "1", "--logto", "/tmp/mylog.log"] 24 | -------------------------------------------------------------------------------- /deploy/docker/python/requirements.txt: -------------------------------------------------------------------------------- 1 | Django==5.2.2 2 | uWSGI==2.0.29 3 | mysqlclient==2.2.7 4 | psycopg2-binary==2.9.10 5 | psycopg2==2.9.10 6 | python-magic==0.4.27 7 | requests==2.32.4 8 | django-widget-tweaks==1.5.0 9 | django-markdown2==0.3.1 10 | Pillow==11.2.1 11 | django-mdeditor==0.1.20 12 | django-import-export==4.3.7 13 | openpyxl==3.1.5 14 | django-admin-rangefilter==0.13.2 15 | boto3==1.34.95 16 | django-storages==1.14.6 17 | django-mathfilters==1.0.0 18 | XlsxWriter==3.2.2 19 | xlwt==1.3.0 20 | WeasyPrint==65.0 21 | GitPython==3.1.44 22 | djangorestframework==3.16.0 23 | djangorestframework-simplejwt==5.5.0 24 | django-allauth==65.7.0 25 | django-filter==25.1 26 | django-crispy-forms==2.4 27 | crispy-bootstrap4==2024.1 28 | -------------------------------------------------------------------------------- /deploy/helm/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/templates/NOTES.txt: -------------------------------------------------------------------------------- 1 | 1. Mariadb Access Information. 2 | - Database: {{ .Release.Name }} 3 | - User: {{ .Release.Name }} 4 | - Password: echo $(kubectl get secrets -n {{ .Release.Namespace }} master-db-auth -o jsonpath="{.data.MYSQL_PASSWORD}" | base64 -d) 5 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/templates/secrets.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.enabled }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ include "mariadb.fullname" . }}-db-auth 6 | namespace: {{ .Release.Namespace | quote }} 7 | type: Opaque 8 | data: 9 | PASSWORD: {{ tpl .Values.global.dbPassword . | b64enc }} 10 | mariadb-root-password: {{ tpl .Values.global.dbPassword . | b64enc }} 11 | {{- end }} 12 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/templates/service.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.enabled }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ include "mariadb.fullname" . }} 6 | labels: 7 | {{- include "mariadb.labels" . | nindent 4 }} 8 | spec: 9 | ports: 10 | - port: {{ .Values.service.port }} 11 | name: mariadb-port 12 | protocol: TCP 13 | clusterIP: None 14 | selector: 15 | {{- include "mariadb.selectorLabels" . | nindent 4 }} 16 | {{- end }} 17 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/templates/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceAccount.create -}} 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: {{ include "mariadb.serviceAccountName" . }} 6 | labels: 7 | {{- include "mariadb.labels" . | nindent 4 }} 8 | {{- with .Values.serviceAccount.annotations }} 9 | annotations: 10 | {{- toYaml . | nindent 4 }} 11 | {{- end }} 12 | {{- end }} 13 | -------------------------------------------------------------------------------- /deploy/helm/charts/mariadb/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "mariadb.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "mariadb.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "mariadb.fullname" . }}:{{ .Values.service.port }}'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /deploy/helm/charts/nginx/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/helm/charts/nginx/templates/hpa.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.autoscaling.enabled }} 2 | apiVersion: autoscaling/v2beta1 3 | kind: HorizontalPodAutoscaler 4 | metadata: 5 | name: {{ include "nginx.fullname" . }} 6 | labels: 7 | {{- include "nginx.labels" . | nindent 4 }} 8 | spec: 9 | scaleTargetRef: 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | name: {{ include "nginx.fullname" . }} 13 | minReplicas: {{ .Values.autoscaling.minReplicas }} 14 | maxReplicas: {{ .Values.autoscaling.maxReplicas }} 15 | metrics: 16 | {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} 17 | - type: Resource 18 | resource: 19 | name: cpu 20 | targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} 21 | {{- end }} 22 | {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} 23 | - type: Resource 24 | resource: 25 | name: memory 26 | targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} 27 | {{- end }} 28 | {{- end }} 29 | -------------------------------------------------------------------------------- /deploy/helm/charts/nginx/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "nginx.fullname" . }} 5 | labels: 6 | {{- include "nginx.labels" . | nindent 4 }} 7 | spec: 8 | type: {{ .Values.service.type }} 9 | ports: 10 | - port: {{ .Values.service.port }} 11 | name: http 12 | selector: 13 | {{- include "nginx.selectorLabels" . | nindent 4 }} 14 | -------------------------------------------------------------------------------- /deploy/helm/charts/nginx/templates/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceAccount.create -}} 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: {{ include "nginx.serviceAccountName" . }} 6 | labels: 7 | {{- include "nginx.labels" . | nindent 4 }} 8 | {{- with .Values.serviceAccount.annotations }} 9 | annotations: 10 | {{- toYaml . | nindent 4 }} 11 | {{- end }} 12 | {{- end }} 13 | -------------------------------------------------------------------------------- /deploy/helm/charts/nginx/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "nginx.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "nginx.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "nginx.fullname" . }}:{{ .Values.service.port }}'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /deploy/helm/charts/postgres/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/helm/charts/postgres/templates/secrets.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.enabled }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ include "postgres.fullname" . }}-db-auth 6 | namespace: {{ .Release.Namespace | quote }} 7 | type: Opaque 8 | data: 9 | POSTGRES_PASSWORD: {{ tpl .Values.global.dbPassword . | b64enc }} 10 | {{- end }} 11 | -------------------------------------------------------------------------------- /deploy/helm/charts/postgres/templates/service.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.enabled }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ include "postgres.fullname" . }} 6 | labels: 7 | {{- include "postgres.labels" . | nindent 4 }} 8 | spec: 9 | type: {{ .Values.service.type }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: postgres-port 13 | protocol: TCP 14 | clusterIP: None 15 | selector: 16 | {{- include "postgres.selectorLabels" . | nindent 4 }} 17 | {{- end }} 18 | -------------------------------------------------------------------------------- /deploy/helm/charts/postgres/templates/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceAccount.create -}} 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: {{ include "postgres.serviceAccountName" . }} 6 | labels: 7 | {{- include "postgres.labels" . | nindent 4 }} 8 | {{- with .Values.serviceAccount.annotations }} 9 | annotations: 10 | {{- toYaml . | nindent 4 }} 11 | {{- end }} 12 | {{- end }} 13 | -------------------------------------------------------------------------------- /deploy/helm/charts/postgres/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "postgres.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "postgres.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "postgres.fullname" . }}:{{ .Values.service.port }}'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | data: 3 | DATABASE_TYPE: "{{ .Values.global.dbType }}" 4 | DATABASE_PORT: "{{ .Values.global.dbPort }}" 5 | DATABASE_NAME: "{{ .Release.Name }}" 6 | DATABASE_USER: "{{ .Release.Name }}" 7 | DOMAIN_HOST: "{{ .Values.global.domainHost }}" 8 | EMAIL_HOST: "{{ .Values.global.emailHost }}" 9 | EMAIL_HOST_USER: "{{ .Values.global.emailHostUser }}" 10 | DEFAULT_FROM_EMAIL: "{{ .Values.global.defaultFromEmail }}" 11 | DB_SERVICE_NAME: "{{ .Values.global.dbType }}" 12 | NAMESPACE: "{{ .Release.Namespace }}" 13 | 14 | 15 | {{- with .Values.imageConfigMaps }} 16 | {{/* AWS_STORAGE_BUCKET_NAME: "{{ .awsStorageBucketName }}"*/}} 17 | DJANGO_SETTINGS_MODULE: "{{ .djangoSettingsModule }}" 18 | {{- end }} 19 | kind: ConfigMap 20 | metadata: 21 | name: {{ include "web.fullname" . }}-config 22 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/hpa.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.autoscaling.enabled }} 2 | apiVersion: autoscaling/v2beta1 3 | kind: HorizontalPodAutoscaler 4 | metadata: 5 | name: {{ include "web.fullname" . }} 6 | labels: 7 | {{- include "web.labels" . | nindent 4 }} 8 | spec: 9 | scaleTargetRef: 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | name: {{ include "web.fullname" . }} 13 | minReplicas: {{ .Values.autoscaling.minReplicas }} 14 | maxReplicas: {{ .Values.autoscaling.maxReplicas }} 15 | metrics: 16 | {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} 17 | - type: Resource 18 | resource: 19 | name: cpu 20 | targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} 21 | {{- end }} 22 | {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} 23 | - type: Resource 24 | resource: 25 | name: memory 26 | targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} 27 | {{- end }} 28 | {{- end }} 29 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/secrets.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: {{ include "web.fullname" . }}-db-auth 5 | namespace: {{ .Release.Namespace | quote }} 6 | type: Opaque 7 | data: 8 | DATABASE_PASSWORD: {{ tpl .Values.global.dbPassword . | b64enc }} 9 | EMAIL_HOST_PASSWORD: {{ tpl .Values.global.emailHostPassword . | b64enc }} 10 | {{/* {{- with .Values.imageSecrets }}*/}} 11 | {{/* AWS_ACCESS_KEY_ID: {{ .awsAccessKeyId }}*/}} 12 | {{/* AWS_SECRET_ACCESS_KEY: {{ .awsSecretAccessKey }}*/}} 13 | {{/* {{- end }}*/}} 14 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "web.fullname" . }} 5 | labels: 6 | {{- include "web.labels" . | nindent 4 }} 7 | spec: 8 | type: {{ .Values.service.type }} 9 | ports: 10 | - port: {{ .Values.service.port }} 11 | targetPort: web 12 | protocol: TCP 13 | name: web 14 | selector: 15 | {{- include "web.selectorLabels" . | nindent 4 }} 16 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceAccount.create -}} 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: {{ include "web.serviceAccountName" . }} 6 | labels: 7 | {{- include "web.labels" . | nindent 4 }} 8 | {{- with .Values.serviceAccount.annotations }} 9 | annotations: 10 | {{- toYaml . | nindent 4 }} 11 | {{- end }} 12 | {{- end }} 13 | -------------------------------------------------------------------------------- /deploy/helm/charts/web/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "web.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "web.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "web.fullname" . }}:{{ .Values.service.port }}'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /deploy/helm/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "hibs.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "hibs.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: [ 'wget' ] 14 | args: [ '{{ include "hibs.fullname" . }}:{{ .Values.nginx.service.port }}' ] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /deploy/helm/values-dev.yaml: -------------------------------------------------------------------------------- 1 | # Default values for IBS. 2 | # This is a YAML-formatted file. 3 | # Declare variables to be passed into your templates. 4 | 5 | global: 6 | appMode: dev 7 | dbType: "postgres" 8 | dbPort: "5432" 9 | 10 | mariadb: 11 | enabled: false 12 | replicaCount: 1 13 | volumes: 14 | dataPvStorage: 500Mi 15 | dataPvcStorage: 500Mi 16 | 17 | backupPvStorage: 200Mi 18 | backupPvcStorage: 200Mi 19 | 20 | postgres: 21 | enabled: true 22 | replicaCount: 1 23 | volumes: 24 | dataPvStorage: 500Mi 25 | dataPvcStorage: 500Mi 26 | 27 | backupPvStorage: 200Mi 28 | backupPvcStorage: 200Mi 29 | 30 | nginx: 31 | image: 32 | repository: dokube/nginx 33 | pullPolicy: IfNotPresent 34 | tag: "latest" 35 | replicaCount: 1 36 | 37 | service: 38 | port: 8881 39 | 40 | web: 41 | imageConfigMaps: 42 | djangoSettingsModule: _config.settings.local 43 | -------------------------------------------------------------------------------- /deploy/kubectl/.certificate.yml: -------------------------------------------------------------------------------- 1 | apiVersion: cert-manager.io/v1 2 | kind: Certificate 3 | metadata: 4 | name: my-certificate 5 | namespace: default # You can change it to any namespace you want. 6 | spec: 7 | secretName: my-certificate-tls # Secret name where the certificate will be stored 8 | issuerRef: 9 | name: letsencrypt-ub 10 | kind: ClusterIssuer 11 | commonName: yourdomain.com 12 | dnsNames: 13 | - yourdomain.com 14 | - www.yourdomain.com 15 | 16 | -------------------------------------------------------------------------------- /deploy/kubectl/.cluster-issuer.yml: -------------------------------------------------------------------------------- 1 | apiVersion: cert-manager.io/v1 2 | kind: ClusterIssuer 3 | metadata: 4 | name: letsencrypt-ub # name of clusterissuer 5 | spec: 6 | acme: 7 | server: https://acme-v02.api.letsencrypt.org/directory 8 | email: your-email@example.com # Let's Encrypt account email 9 | privateKeySecretRef: 10 | name: letsencrypt-ub # name of clusterissuer 11 | solvers: 12 | - http01: 13 | ingress: 14 | class: nginx # Ingress class in use 15 | -------------------------------------------------------------------------------- /deploy/kubectl/class-roles/cluster-role.yaml: -------------------------------------------------------------------------------- 1 | kind: ClusterRole 2 | apiVersion: rbac.authorization.k8s.io/v1 3 | metadata: 4 | name: nfs-client-provisioner-runner 5 | rules: 6 | - apiGroups: [ "" ] 7 | resources: [ "nodes" ] 8 | verbs: [ "get", "list", "watch" ] 9 | - apiGroups: [ "" ] 10 | resources: [ "persistentvolumes" ] 11 | verbs: [ "get", "list", "watch", "create", "delete" ] 12 | - apiGroups: [ "" ] 13 | resources: [ "persistentvolumeclaims" ] 14 | verbs: [ "get", "list", "watch", "update" ] 15 | - apiGroups: [ "storage.k8s.io" ] 16 | resources: [ "storageclasses" ] 17 | verbs: [ "get", "list", "watch" ] 18 | - apiGroups: [ "" ] 19 | resources: [ "events" ] 20 | verbs: [ "create", "update", "patch" ] 21 | -------------------------------------------------------------------------------- /volume/backups/copy_script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 스크립트 파일이 위치한 디렉터리 경로 3 | SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) 4 | DATE=$(date +"%Y-%m-%d") 5 | # 디렉토리 존재 여부 확인 및 없으면 생성 6 | DEST_DIR=/volume1/mnt/ibs/dev/volume/backups/ 7 | if [ ! -d "${DEST_DIR}" ]; then 8 | mkdir -p "${DEST_DIR}" 9 | fi 10 | 11 | MARIADB_BACKUP_FILE="${SCRIPT_DIR}/backup-mariadb-${DATE}.sql" # 스크립트 디렉터리를 기준으로 파일 경로 설정 12 | # 파일 존재 여부 확인 13 | if [ -f "${MARIADB_BACKUP_FILE}" ]; then 14 | # 파일 복사 15 | cp "${MARIADB_BACKUP_FILE}" "${DEST_DIR}" 16 | echo "File ${MARIADB_BACKUP_FILE} copied to ${DEST_DIR}" 17 | else 18 | echo "File ${MARIADB_BACKUP_FILE} does not exist." 19 | fi 20 | 21 | POSTGRES_BACKUP_FILE="${SCRIPT_DIR}/backup-postgres-${DATE}.dump" # 스크립트 디렉터리를 기준으로 파일 경로 설정 22 | # 파일 존재 여부 확인 23 | if [ -f "${POSTGRES_BACKUP_FILE}" ]; then 24 | # 파일 복사 25 | cp "${POSTGRES_BACKUP_FILE}" "${DEST_DIR}" 26 | echo "File ${POSTGRES_BACKUP_FILE} copied to ${DEST_DIR}" 27 | else 28 | echo "File ${POSTGRES_BACKUP_FILE} does not exist." 29 | fi -------------------------------------------------------------------------------- /volume/backups/dump_mariadb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DATE=$(date +"%Y-%m-%d") 3 | SQL_FILE=/var/backups/backup-mariadb-${DATE}.sql 4 | 5 | # (2) in case you run this more than once a day, 6 | # remove the previous version of the file 7 | # shellcheck disable=SC2046 8 | find /var/backups \( -name "*.sql" -o -name "*.log" \) -type f -ctime +2 -delete 9 | 10 | # (3) do the mysql database backup (dump) 11 | mariadb-dump -u"${USER}" -p"${PASSWORD}" "${DATABASE}" --ignore-table="${DATABASE}".django_migrations > "${SQL_FILE}" 12 | 13 | # 백업이 성공했는지 확인 14 | if [ $? -eq 0 ]; then 15 | echo "MARIADB Backup completed successfully: ${SQL_FILE}" 16 | else 17 | echo "MARIADB Backup failed" 18 | fi 19 | -------------------------------------------------------------------------------- /volume/backups/dump_postgres.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 환경 변수 설정 4 | DATE=$(date +"%Y-%m-%d") 5 | DUMP_FILE=/var/backups/backup-postgres-${DATE}.dump 6 | 7 | # 이전 백업 삭제 (예: 2일 이상된 파일) 8 | find /var/backups \( -name "*.dump" -o -name "*.log" \) -type f -ctime +2 -delete 9 | 10 | # pg_dump로 ibs 스키마의 데이터만 추출 (django_migrations 제외) 11 | pg_dump -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -n "${POSTGRES_USER}" \ 12 | --data-only --exclude-table="${POSTGRES_USER}".django_migrations \ 13 | --column-inserts -Fc -f "${DUMP_FILE}" 14 | 15 | # 백업이 성공했는지 확인 16 | if [ $? -eq 0 ]; then 17 | echo "PostgreSQL Backup completed successfully: ${DUMP_FILE}" 18 | else 19 | echo "PostgreSQL Backup failed." >&2 20 | exit 1 21 | fi 22 | -------------------------------------------------------------------------------- /volume/backups/mariadb_restore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DATE=$(date +"%Y-%m-%d") 3 | SQL_FILE="/var/backups/backup-mariadb-${DATE}.sql" 4 | 5 | mariadb -u"${USER}" -p"${PASSWORD}" "${DATABASE}" < "${SQL_FILE}" 6 | 7 | # 복원 성공 여부 확인 8 | if [ $? -eq 0 ]; then 9 | echo "MARIADB Database restoration completed successfully: ${SQL_FILE}" 10 | else 11 | echo "MARIADB Database restoration failed" 12 | fi 13 | -------------------------------------------------------------------------------- /volume/initdb/mariadb/init.sql: -------------------------------------------------------------------------------- 1 | GRANT ALL PRIVILEGES ON root.* TO 'root'@'%'; 2 | 3 | FLUSH PRIVILEGES; 4 | -------------------------------------------------------------------------------- /volume/initdb/postgres/init-schema.sql: -------------------------------------------------------------------------------- 1 | CREATE SCHEMA IF NOT EXISTS ibs; 2 | GRANT ALL ON SCHEMA ibs TO ibs; --------------------------------------------------------------------------------