From 63cf724aaf274d10d7fae368d9bb48f14c648b78 Mon Sep 17 00:00:00 2001 From: Weverton Date: Sat, 1 Nov 2025 18:10:39 -0300 Subject: [PATCH] first commit --- .gitignore | 7 +- Base/Forms/FormsBankAccounts.py | 15 ++ Base/Forms/FormsChartOfAccount.py | 24 ++++ Base/Forms/FormsPayMethod.py | 24 ++++ Base/Forms/FormsProductList.py | 17 +++ Base/Forms/FormsProfessional.py | 24 ++++ Base/Forms/FormsServiceList.py | 17 +++ .../FormsBankAccounts.cpython-312.pyc | Bin 0 -> 994 bytes .../FormsChartOfAccount.cpython-312.pyc | Bin 0 -> 1150 bytes .../FormsPayMethod.cpython-312.pyc | Bin 0 -> 1192 bytes .../FormsProductList.cpython-312.pyc | Bin 0 -> 1090 bytes .../FormsProfessional.cpython-312.pyc | Bin 0 -> 1149 bytes .../FormsServiceList.cpython-312.pyc | Bin 0 -> 1090 bytes .../get_sum_of_product.cpython-312.pyc | Bin 0 -> 1662 bytes .../get_sum_of_professional.cpython-312.pyc | Bin 0 -> 1165 bytes ...sum_of_professional_detail.cpython-312.pyc | Bin 0 -> 2095 bytes .../get_sum_of_service.cpython-312.pyc | Bin 0 -> 1098 bytes .../get_sum_of_stone.cpython-312.pyc | Bin 0 -> 1312 bytes ...sum_payment_method_service.cpython-312.pyc | Bin 0 -> 1582 bytes Base/Metrics/Dashboard/get_sum_of_product.py | 24 ++++ .../Dashboard/get_sum_of_professional.py | 19 +++ .../get_sum_of_professional_detail.py | 31 +++++ Base/Metrics/Dashboard/get_sum_of_service.py | 19 +++ Base/Metrics/Dashboard/get_sum_of_stone.py | 24 ++++ .../get_sum_payment_method_service.py | 24 ++++ .../get_total_bank.cpython-312.pyc | Bin 0 -> 3168 bytes .../get_total_prof.cpython-312.pyc | Bin 0 -> 1725 bytes Base/Metrics/DashboardAdmin/get_total_bank.py | 82 +++++++++++ Base/Metrics/DashboardAdmin/get_total_prof.py | 39 ++++++ .../urlsBankAccount.cpython-312.pyc | Bin 0 -> 999 bytes .../Urls/__pycache__/urlsBase.cpython-312.pyc | Bin 0 -> 860 bytes .../urlsChartOfAccount.cpython-312.pyc | Bin 0 -> 1014 bytes .../urlsPaymentMethod.cpython-312.pyc | Bin 0 -> 978 bytes .../urlsProductList.cpython-312.pyc | Bin 0 -> 993 bytes .../urlsProfessional.cpython-312.pyc | Bin 0 -> 1000 bytes .../urlsServiceList.cpython-312.pyc | Bin 0 -> 993 bytes Base/Urls/urlsBankAccount.py | 15 ++ Base/{urls.py => Urls/urlsBase.py} | 9 +- Base/Urls/urlsChartOfAccount.py | 13 ++ Base/Urls/urlsPaymentMethod.py | 14 ++ Base/Urls/urlsProductList.py | 14 ++ Base/Urls/urlsProfessional.py | 14 ++ Base/Urls/urlsServiceList.py | 14 ++ .../viewsBankAccounts.cpython-312.pyc | Bin 0 -> 3980 bytes .../viewsChartOfAccount.cpython-312.pyc | Bin 0 -> 2807 bytes .../viewsPayMethod.cpython-312.pyc | Bin 0 -> 2737 bytes .../viewsProductList.cpython-312.pyc | Bin 0 -> 2765 bytes .../viewsProfessional.cpython-312.pyc | Bin 0 -> 2837 bytes .../viewsServiceList.cpython-312.pyc | Bin 0 -> 2765 bytes Base/Views/views.py | 42 ++++++ Base/Views/viewsBankAccounts.py | 57 ++++++++ Base/Views/viewsChartOfAccount.py | 43 ++++++ Base/Views/viewsPayMethod.py | 43 ++++++ Base/Views/viewsProductList.py | 43 ++++++ Base/Views/viewsProfessional.py | 43 ++++++ Base/Views/viewsServiceList.py | 43 ++++++ Base/__pycache__/__init__.cpython-312.pyc | Bin 151 -> 149 bytes Base/__pycache__/__init__.cpython-313.pyc | Bin 130 -> 0 bytes Base/__pycache__/admin.cpython-312.pyc | Bin 195 -> 193 bytes Base/__pycache__/admin.cpython-313.pyc | Bin 174 -> 0 bytes Base/__pycache__/apps.cpython-312.pyc | Bin 453 -> 451 bytes Base/__pycache__/apps.cpython-313.pyc | Bin 490 -> 0 bytes Base/__pycache__/models.cpython-312.pyc | Bin 192 -> 6104 bytes Base/__pycache__/models.cpython-313.pyc | Bin 171 -> 0 bytes Base/__pycache__/urls.cpython-312.pyc | Bin 758 -> 0 bytes Base/__pycache__/urls.cpython-313.pyc | Bin 713 -> 0 bytes Base/__pycache__/views.cpython-312.pyc | Bin 556 -> 0 bytes Base/migrations/0001_initial.py | 91 ++++++++++++ .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 3888 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 162 -> 160 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 141 -> 0 bytes Base/models.py | 83 ++++++++++- Base/templates/BankAccounts/Create.html | 19 +++ Base/templates/BankAccounts/Delete.html | 18 +++ Base/templates/BankAccounts/Detail.html | 15 ++ Base/templates/BankAccounts/List.html | 62 +++++++++ Base/templates/BankAccounts/Update.html | 17 +++ Base/templates/ChartOfAccount/Create.html | 19 +++ Base/templates/ChartOfAccount/Delete.html | 18 +++ Base/templates/ChartOfAccount/Detail.html | 16 +++ Base/templates/ChartOfAccount/List.html | 68 +++++++++ Base/templates/ChartOfAccount/Update.html | 17 +++ Base/templates/Login/Dashboard.html | 11 -- .../Login/Dashboard/Professional.html | 24 ++++ Base/templates/Login/Dashboard/Service.html | 24 ++++ Base/templates/Login/Dashboard/Stone.html | 23 ++++ .../Login/Dashboard/Sum_of_product.html | 22 +++ .../Dashboard/Sum_of_professional_detail.html | 27 ++++ .../Dashboard/Sum_payment_method_service.html | 20 +++ Base/templates/Login/Dashboard/index.html | 28 ++++ .../templates/Login/DashboardAdmin/index.html | 25 ++++ .../Login/DashboardAdmin/total_banck.html | 21 +++ .../DashboardAdmin/total_prof_month.html | 21 +++ .../templates/Login/Login.html | 2 +- Base/templates/PayMethod/Create.html | 19 +++ Base/templates/PayMethod/Delete.html | 18 +++ Base/templates/PayMethod/Detail.html | 16 +++ Base/templates/PayMethod/List.html | 66 +++++++++ Base/templates/PayMethod/Update.html | 17 +++ Base/templates/ProductList/Create.html | 19 +++ Base/templates/ProductList/Delete.html | 18 +++ Base/templates/ProductList/Detail.html | 16 +++ Base/templates/ProductList/List.html | 64 +++++++++ Base/templates/ProductList/Update.html | 17 +++ Base/templates/Professional/Create.html | 19 +++ Base/templates/Professional/Delete.html | 18 +++ Base/templates/Professional/Detail.html | 15 ++ Base/templates/Professional/List.html | 62 +++++++++ Base/templates/Professional/Update.html | 17 +++ Base/templates/ServiceList/Create.html | 19 +++ Base/templates/ServiceList/Delete.html | 18 +++ Base/templates/ServiceList/Detail.html | 16 +++ Base/templates/ServiceList/List.html | 64 +++++++++ Base/templates/ServiceList/Update.html | 17 +++ Base/views/__pycache__/views.cpython-312.pyc | Bin 1386 -> 2969 bytes Base/views/views.py | 21 --- Client/FormsClient.py | 42 ++++++ Client/__init__.py | 0 Client/admin.py | 3 + Client/apps.py | 6 + Client/migrations/0001_initial.py | 42 ++++++ Client/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 2983 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 162 bytes Client/models.py | 23 ++++ Client/templates/Client/Create.html | 24 ++++ Client/templates/Client/Delete.html | 18 +++ Client/templates/Client/Detail.html | 45 ++++++ Client/templates/Client/List.html | 115 ++++++++++++++++ Client/templates/Client/Update.html | 17 +++ Client/tests.py | 3 + Client/urlsClient.py | 12 ++ Client/viewsClient.py | 61 +++++++++ Movement/Forms/FormsCalendar.py | 42 ++++++ Movement/Forms/FormsExpense.py | 34 +++++ Movement/Forms/FormsProduct.py | 39 ++++++ Movement/Forms/FormsStock.py | 33 +++++ .../__pycache__/FormsCalendar.cpython-312.pyc | Bin 0 -> 1833 bytes .../__pycache__/FormsExpense.cpython-312.pyc | Bin 0 -> 1626 bytes .../__pycache__/FormsProduct.cpython-312.pyc | Bin 0 -> 1613 bytes .../__pycache__/FormsStock.cpython-312.pyc | Bin 0 -> 1595 bytes .../__pycache__/urlsCalendar.cpython-312.pyc | Bin 0 -> 1114 bytes .../__pycache__/urlsExpense.cpython-312.pyc | Bin 0 -> 1367 bytes .../__pycache__/urlsProduct.cpython-312.pyc | Bin 0 -> 1101 bytes .../__pycache__/urlsStock.cpython-312.pyc | Bin 0 -> 1027 bytes Movement/Urls/urlsCalendar.py | 16 +++ Movement/Urls/urlsExpense.py | 16 +++ Movement/Urls/urlsProduct.py | 16 +++ Movement/Urls/urlsStock.py | 15 ++ .../__pycache__/viewsCalendar.cpython-312.pyc | Bin 0 -> 2600 bytes .../viewsCalendarCreateCustom.cpython-312.pyc | Bin 0 -> 3885 bytes .../__pycache__/viewsExpense.cpython-312.pyc | Bin 0 -> 6220 bytes .../__pycache__/viewsProduct.cpython-312.pyc | Bin 0 -> 2664 bytes .../viewsProductCreateCustom.cpython-312.pyc | Bin 0 -> 3604 bytes .../__pycache__/viewsStock.cpython-312.pyc | Bin 0 -> 4155 bytes Movement/Views/viewsCalendar.py | 39 ++++++ Movement/Views/viewsCalendarCreateCustom.py | 54 ++++++++ Movement/Views/viewsExpense.py | 102 ++++++++++++++ Movement/Views/viewsProduct.py | 47 +++++++ Movement/Views/viewsProductCreateCustom.py | 50 +++++++ Movement/Views/viewsStock.py | 60 ++++++++ Movement/__init__.py | 0 Movement/admin.py | 3 + Movement/apps.py | 6 + Movement/migrations/0001_initial.py | 102 ++++++++++++++ Movement/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 8114 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes Movement/models.py | 129 ++++++++++++++++++ .../templates/Calendar/Create/client.html | 8 ++ Movement/templates/Calendar/Create/date.html | 7 + .../templates/Calendar/Create/first_time.html | 18 +++ Movement/templates/Calendar/Create/index.html | 32 +++++ .../templates/Calendar/Create/pay_method.html | 13 ++ .../Calendar/Create/professional.html | 13 ++ .../templates/Calendar/Create/service.html | 13 ++ Movement/templates/Calendar/Create/time.html | 17 +++ Movement/templates/Calendar/Delete.html | 18 +++ Movement/templates/Calendar/Detail.html | 16 +++ Movement/templates/Calendar/List.html | 62 +++++++++ Movement/templates/Calendar/Update.html | 17 +++ Movement/templates/Expense/Create.html | 19 +++ Movement/templates/Expense/CreateFirm.html | 22 +++ Movement/templates/Expense/CreateProf.html | 23 ++++ Movement/templates/Expense/Delete.html | 18 +++ Movement/templates/Expense/Detail.html | 15 ++ Movement/templates/Expense/List.html | 78 +++++++++++ Movement/templates/Expense/Update.html | 17 +++ Movement/templates/Product/Create/client.html | 4 + Movement/templates/Product/Create/date.html | 6 + Movement/templates/Product/Create/index.html | 33 +++++ .../templates/Product/Create/pay_method.html | 13 ++ .../templates/Product/Create/product.html | 13 ++ .../Product/Create/professional.html | 13 ++ .../templates/Product/Create/quantity.html | 8 ++ Movement/templates/Product/Delete.html | 18 +++ Movement/templates/Product/Detail.html | 15 ++ Movement/templates/Product/List.html | 75 ++++++++++ Movement/templates/Product/Update.html | 17 +++ Movement/templates/Stock/Create.html | 19 +++ Movement/templates/Stock/Delete.html | 18 +++ Movement/templates/Stock/Detail.html | 15 ++ Movement/templates/Stock/List.html | 72 ++++++++++ Movement/templates/Stock/Update.html | 17 +++ Movement/tests.py | 3 + Setup/__pycache__/__init__.cpython-312.pyc | Bin 152 -> 150 bytes Setup/__pycache__/__init__.cpython-313.pyc | Bin 131 -> 0 bytes Setup/__pycache__/settings.cpython-312.pyc | Bin 2781 -> 2807 bytes Setup/__pycache__/settings.cpython-313.pyc | Bin 2770 -> 0 bytes Setup/__pycache__/urls.cpython-312.pyc | Bin 1091 -> 1360 bytes Setup/__pycache__/urls.cpython-313.pyc | Bin 1070 -> 0 bytes Setup/__pycache__/wsgi.cpython-312.pyc | Bin 636 -> 634 bytes Setup/__pycache__/wsgi.cpython-313.pyc | Bin 615 -> 0 bytes Setup/settings.py | 2 + Setup/urls.py | 30 ++-- {Base/templates/Login => Templates}/Home.html | 1 + Templates/components/_footer.html | 2 +- Templates/components/_header.html | 6 +- Templates/components/_sidebar.html | 18 ++- db.sqlite3 | Bin 131072 -> 0 bytes 220 files changed, 4040 insertions(+), 62 deletions(-) create mode 100644 Base/Forms/FormsBankAccounts.py create mode 100644 Base/Forms/FormsChartOfAccount.py create mode 100644 Base/Forms/FormsPayMethod.py create mode 100644 Base/Forms/FormsProductList.py create mode 100644 Base/Forms/FormsProfessional.py create mode 100644 Base/Forms/FormsServiceList.py create mode 100644 Base/Forms/__pycache__/FormsBankAccounts.cpython-312.pyc create mode 100644 Base/Forms/__pycache__/FormsChartOfAccount.cpython-312.pyc create mode 100644 Base/Forms/__pycache__/FormsPayMethod.cpython-312.pyc create mode 100644 Base/Forms/__pycache__/FormsProductList.cpython-312.pyc create mode 100644 Base/Forms/__pycache__/FormsProfessional.cpython-312.pyc create mode 100644 Base/Forms/__pycache__/FormsServiceList.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_of_product.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_of_professional.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_of_professional_detail.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_of_service.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_of_stone.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/__pycache__/get_sum_payment_method_service.cpython-312.pyc create mode 100644 Base/Metrics/Dashboard/get_sum_of_product.py create mode 100644 Base/Metrics/Dashboard/get_sum_of_professional.py create mode 100644 Base/Metrics/Dashboard/get_sum_of_professional_detail.py create mode 100644 Base/Metrics/Dashboard/get_sum_of_service.py create mode 100644 Base/Metrics/Dashboard/get_sum_of_stone.py create mode 100644 Base/Metrics/Dashboard/get_sum_payment_method_service.py create mode 100644 Base/Metrics/DashboardAdmin/__pycache__/get_total_bank.cpython-312.pyc create mode 100644 Base/Metrics/DashboardAdmin/__pycache__/get_total_prof.cpython-312.pyc create mode 100644 Base/Metrics/DashboardAdmin/get_total_bank.py create mode 100644 Base/Metrics/DashboardAdmin/get_total_prof.py create mode 100644 Base/Urls/__pycache__/urlsBankAccount.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsBase.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsChartOfAccount.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsPaymentMethod.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsProductList.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsProfessional.cpython-312.pyc create mode 100644 Base/Urls/__pycache__/urlsServiceList.cpython-312.pyc create mode 100644 Base/Urls/urlsBankAccount.py rename Base/{urls.py => Urls/urlsBase.py} (50%) create mode 100644 Base/Urls/urlsChartOfAccount.py create mode 100644 Base/Urls/urlsPaymentMethod.py create mode 100644 Base/Urls/urlsProductList.py create mode 100644 Base/Urls/urlsProfessional.py create mode 100644 Base/Urls/urlsServiceList.py create mode 100644 Base/Views/__pycache__/viewsBankAccounts.cpython-312.pyc create mode 100644 Base/Views/__pycache__/viewsChartOfAccount.cpython-312.pyc create mode 100644 Base/Views/__pycache__/viewsPayMethod.cpython-312.pyc create mode 100644 Base/Views/__pycache__/viewsProductList.cpython-312.pyc create mode 100644 Base/Views/__pycache__/viewsProfessional.cpython-312.pyc create mode 100644 Base/Views/__pycache__/viewsServiceList.cpython-312.pyc create mode 100644 Base/Views/views.py create mode 100644 Base/Views/viewsBankAccounts.py create mode 100644 Base/Views/viewsChartOfAccount.py create mode 100644 Base/Views/viewsPayMethod.py create mode 100644 Base/Views/viewsProductList.py create mode 100644 Base/Views/viewsProfessional.py create mode 100644 Base/Views/viewsServiceList.py delete mode 100644 Base/__pycache__/__init__.cpython-313.pyc delete mode 100644 Base/__pycache__/admin.cpython-313.pyc delete mode 100644 Base/__pycache__/apps.cpython-313.pyc delete mode 100644 Base/__pycache__/models.cpython-313.pyc delete mode 100644 Base/__pycache__/urls.cpython-312.pyc delete mode 100644 Base/__pycache__/urls.cpython-313.pyc delete mode 100644 Base/__pycache__/views.cpython-312.pyc create mode 100644 Base/migrations/0001_initial.py create mode 100644 Base/migrations/__pycache__/0001_initial.cpython-312.pyc delete mode 100644 Base/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 Base/templates/BankAccounts/Create.html create mode 100644 Base/templates/BankAccounts/Delete.html create mode 100644 Base/templates/BankAccounts/Detail.html create mode 100644 Base/templates/BankAccounts/List.html create mode 100644 Base/templates/BankAccounts/Update.html create mode 100644 Base/templates/ChartOfAccount/Create.html create mode 100644 Base/templates/ChartOfAccount/Delete.html create mode 100644 Base/templates/ChartOfAccount/Detail.html create mode 100644 Base/templates/ChartOfAccount/List.html create mode 100644 Base/templates/ChartOfAccount/Update.html delete mode 100644 Base/templates/Login/Dashboard.html create mode 100644 Base/templates/Login/Dashboard/Professional.html create mode 100644 Base/templates/Login/Dashboard/Service.html create mode 100644 Base/templates/Login/Dashboard/Stone.html create mode 100644 Base/templates/Login/Dashboard/Sum_of_product.html create mode 100644 Base/templates/Login/Dashboard/Sum_of_professional_detail.html create mode 100644 Base/templates/Login/Dashboard/Sum_payment_method_service.html create mode 100644 Base/templates/Login/Dashboard/index.html create mode 100644 Base/templates/Login/DashboardAdmin/index.html create mode 100644 Base/templates/Login/DashboardAdmin/total_banck.html create mode 100644 Base/templates/Login/DashboardAdmin/total_prof_month.html rename Templates/registration/login.html => Base/templates/Login/Login.html (95%) create mode 100644 Base/templates/PayMethod/Create.html create mode 100644 Base/templates/PayMethod/Delete.html create mode 100644 Base/templates/PayMethod/Detail.html create mode 100644 Base/templates/PayMethod/List.html create mode 100644 Base/templates/PayMethod/Update.html create mode 100644 Base/templates/ProductList/Create.html create mode 100644 Base/templates/ProductList/Delete.html create mode 100644 Base/templates/ProductList/Detail.html create mode 100644 Base/templates/ProductList/List.html create mode 100644 Base/templates/ProductList/Update.html create mode 100644 Base/templates/Professional/Create.html create mode 100644 Base/templates/Professional/Delete.html create mode 100644 Base/templates/Professional/Detail.html create mode 100644 Base/templates/Professional/List.html create mode 100644 Base/templates/Professional/Update.html create mode 100644 Base/templates/ServiceList/Create.html create mode 100644 Base/templates/ServiceList/Delete.html create mode 100644 Base/templates/ServiceList/Detail.html create mode 100644 Base/templates/ServiceList/List.html create mode 100644 Base/templates/ServiceList/Update.html delete mode 100644 Base/views/views.py create mode 100644 Client/FormsClient.py create mode 100644 Client/__init__.py create mode 100644 Client/admin.py create mode 100644 Client/apps.py create mode 100644 Client/migrations/0001_initial.py create mode 100644 Client/migrations/__init__.py create mode 100644 Client/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 Client/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 Client/models.py create mode 100644 Client/templates/Client/Create.html create mode 100644 Client/templates/Client/Delete.html create mode 100644 Client/templates/Client/Detail.html create mode 100644 Client/templates/Client/List.html create mode 100644 Client/templates/Client/Update.html create mode 100644 Client/tests.py create mode 100644 Client/urlsClient.py create mode 100644 Client/viewsClient.py create mode 100644 Movement/Forms/FormsCalendar.py create mode 100644 Movement/Forms/FormsExpense.py create mode 100644 Movement/Forms/FormsProduct.py create mode 100644 Movement/Forms/FormsStock.py create mode 100644 Movement/Forms/__pycache__/FormsCalendar.cpython-312.pyc create mode 100644 Movement/Forms/__pycache__/FormsExpense.cpython-312.pyc create mode 100644 Movement/Forms/__pycache__/FormsProduct.cpython-312.pyc create mode 100644 Movement/Forms/__pycache__/FormsStock.cpython-312.pyc create mode 100644 Movement/Urls/__pycache__/urlsCalendar.cpython-312.pyc create mode 100644 Movement/Urls/__pycache__/urlsExpense.cpython-312.pyc create mode 100644 Movement/Urls/__pycache__/urlsProduct.cpython-312.pyc create mode 100644 Movement/Urls/__pycache__/urlsStock.cpython-312.pyc create mode 100644 Movement/Urls/urlsCalendar.py create mode 100644 Movement/Urls/urlsExpense.py create mode 100644 Movement/Urls/urlsProduct.py create mode 100644 Movement/Urls/urlsStock.py create mode 100644 Movement/Views/__pycache__/viewsCalendar.cpython-312.pyc create mode 100644 Movement/Views/__pycache__/viewsCalendarCreateCustom.cpython-312.pyc create mode 100644 Movement/Views/__pycache__/viewsExpense.cpython-312.pyc create mode 100644 Movement/Views/__pycache__/viewsProduct.cpython-312.pyc create mode 100644 Movement/Views/__pycache__/viewsProductCreateCustom.cpython-312.pyc create mode 100644 Movement/Views/__pycache__/viewsStock.cpython-312.pyc create mode 100644 Movement/Views/viewsCalendar.py create mode 100644 Movement/Views/viewsCalendarCreateCustom.py create mode 100644 Movement/Views/viewsExpense.py create mode 100644 Movement/Views/viewsProduct.py create mode 100644 Movement/Views/viewsProductCreateCustom.py create mode 100644 Movement/Views/viewsStock.py create mode 100644 Movement/__init__.py create mode 100644 Movement/admin.py create mode 100644 Movement/apps.py create mode 100644 Movement/migrations/0001_initial.py create mode 100644 Movement/migrations/__init__.py create mode 100644 Movement/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 Movement/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 Movement/models.py create mode 100644 Movement/templates/Calendar/Create/client.html create mode 100644 Movement/templates/Calendar/Create/date.html create mode 100644 Movement/templates/Calendar/Create/first_time.html create mode 100644 Movement/templates/Calendar/Create/index.html create mode 100644 Movement/templates/Calendar/Create/pay_method.html create mode 100644 Movement/templates/Calendar/Create/professional.html create mode 100644 Movement/templates/Calendar/Create/service.html create mode 100644 Movement/templates/Calendar/Create/time.html create mode 100644 Movement/templates/Calendar/Delete.html create mode 100644 Movement/templates/Calendar/Detail.html create mode 100644 Movement/templates/Calendar/List.html create mode 100644 Movement/templates/Calendar/Update.html create mode 100644 Movement/templates/Expense/Create.html create mode 100644 Movement/templates/Expense/CreateFirm.html create mode 100644 Movement/templates/Expense/CreateProf.html create mode 100644 Movement/templates/Expense/Delete.html create mode 100644 Movement/templates/Expense/Detail.html create mode 100644 Movement/templates/Expense/List.html create mode 100644 Movement/templates/Expense/Update.html create mode 100644 Movement/templates/Product/Create/client.html create mode 100644 Movement/templates/Product/Create/date.html create mode 100644 Movement/templates/Product/Create/index.html create mode 100644 Movement/templates/Product/Create/pay_method.html create mode 100644 Movement/templates/Product/Create/product.html create mode 100644 Movement/templates/Product/Create/professional.html create mode 100644 Movement/templates/Product/Create/quantity.html create mode 100644 Movement/templates/Product/Delete.html create mode 100644 Movement/templates/Product/Detail.html create mode 100644 Movement/templates/Product/List.html create mode 100644 Movement/templates/Product/Update.html create mode 100644 Movement/templates/Stock/Create.html create mode 100644 Movement/templates/Stock/Delete.html create mode 100644 Movement/templates/Stock/Detail.html create mode 100644 Movement/templates/Stock/List.html create mode 100644 Movement/templates/Stock/Update.html create mode 100644 Movement/tests.py delete mode 100644 Setup/__pycache__/__init__.cpython-313.pyc delete mode 100644 Setup/__pycache__/settings.cpython-313.pyc delete mode 100644 Setup/__pycache__/urls.cpython-313.pyc delete mode 100644 Setup/__pycache__/wsgi.cpython-313.pyc rename {Base/templates/Login => Templates}/Home.html (76%) delete mode 100644 db.sqlite3 diff --git a/.gitignore b/.gitignore index 6b02e10..0d0c0f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ # created by virtualenv automatically +# created by virtualenv automatically .venv venv -.idea \ No newline at end of file +db.sqlite3 +media +.idea +*/__pycache__ +static \ No newline at end of file diff --git a/Base/Forms/FormsBankAccounts.py b/Base/Forms/FormsBankAccounts.py new file mode 100644 index 0000000..6bca387 --- /dev/null +++ b/Base/Forms/FormsBankAccounts.py @@ -0,0 +1,15 @@ +from django import forms +from Base import models + +class FormsBankAccount(forms.ModelForm): + class Meta: + model = models.BankAccount + fields = ['name','description'] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'description': forms.Textarea({'class':'form-control','rows':3 , }), + } + labels={ + 'name':'Nome', + 'description':'Descrição', + } \ No newline at end of file diff --git a/Base/Forms/FormsChartOfAccount.py b/Base/Forms/FormsChartOfAccount.py new file mode 100644 index 0000000..6af4c7c --- /dev/null +++ b/Base/Forms/FormsChartOfAccount.py @@ -0,0 +1,24 @@ +from django import forms +from Base import models + +class FormsChartOfAccount(forms.ModelForm): + class Meta: + model = models.ChartOfAccount + fields = [ + 'name', + 'debit', + 'firm', + 'notes', + ] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'debit': forms.CheckboxInput({'class':''}), + 'firm': forms.CheckboxInput({'class':''}), + 'notes': forms.Textarea({'class':'form-control','rows':3 , }), + } + labels={ + 'name':'Nome', + 'debit':'Debito', + 'firm':'Firma', + 'notes':'Notas', + } \ No newline at end of file diff --git a/Base/Forms/FormsPayMethod.py b/Base/Forms/FormsPayMethod.py new file mode 100644 index 0000000..aa63078 --- /dev/null +++ b/Base/Forms/FormsPayMethod.py @@ -0,0 +1,24 @@ +from django import forms +from Base import models + +class FormsPayMethod(forms.ModelForm): + class Meta: + model = models.PayMethod + fields = [ + 'name', + 'bank', + 'percentage', + 'description', + ] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'bank': forms.Select({'class': 'form-select'}), + 'percentage': forms.NumberInput(attrs={'step': 1}), + 'description': forms.Textarea({'class': 'form-control', 'rows': 3, }), + } + labels={ + 'name':'Nome', + 'bank':'Banco', + 'percentage':'Percentual', + 'description':'Descrição', + } \ No newline at end of file diff --git a/Base/Forms/FormsProductList.py b/Base/Forms/FormsProductList.py new file mode 100644 index 0000000..54a4962 --- /dev/null +++ b/Base/Forms/FormsProductList.py @@ -0,0 +1,17 @@ +from django import forms +from Base import models + +class FormsProductList(forms.ModelForm): + class Meta: + model = models.ProductList + fields = ['name','value','description'] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'value': forms.NumberInput(attrs={'step': 1}), + 'description': forms.Textarea({'class':'form-control','rows':3 , }), + } + labels={ + 'name':'Nome', + 'value':'Valor', + 'description':'Descrição', + } \ No newline at end of file diff --git a/Base/Forms/FormsProfessional.py b/Base/Forms/FormsProfessional.py new file mode 100644 index 0000000..adcff0a --- /dev/null +++ b/Base/Forms/FormsProfessional.py @@ -0,0 +1,24 @@ +from django import forms +from Base import models + +class FormsProfessional(forms.ModelForm): + class Meta: + model = models.Professional + fields = [ + 'name', + 'percentage', + 'symbol', + 'user', + ] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'percentage': forms.NumberInput(attrs={'step': 1 }), + 'symbol': forms.TextInput({'class': 'form-control'}), + 'user': forms.Select({'class':'form-control'}), + } + labels={ + 'name':'Nome', + 'percentage':'Porcentagem', + 'symbol':'Simbolo', + 'user':'User', + } \ No newline at end of file diff --git a/Base/Forms/FormsServiceList.py b/Base/Forms/FormsServiceList.py new file mode 100644 index 0000000..86af125 --- /dev/null +++ b/Base/Forms/FormsServiceList.py @@ -0,0 +1,17 @@ +from django import forms +from Base import models + +class FormsServiceList(forms.ModelForm): + class Meta: + model = models.ServiceList + fields = ['name','value','description'] + widgets = { + 'name': forms.TextInput({'class':'form-control'}), + 'value': forms.NumberInput(attrs={'step': 1}), + 'description': forms.Textarea({'class':'form-control','rows':3 , }), + } + labels={ + 'name':'Nome', + 'value':'Valor', + 'description':'Descrição', + } \ No newline at end of file diff --git a/Base/Forms/__pycache__/FormsBankAccounts.cpython-312.pyc b/Base/Forms/__pycache__/FormsBankAccounts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e19dd4c56db40b89b744e93396d061ee4467002d GIT binary patch literal 994 zcmZuw&ubGw6rR~%Nj51awQ6k@N)^fq_U1)uz*Z|BnhGj~CAh4aX-K-+jWZi-y!6sT z_0*nHp`hTwN-zEoy$HRu^k5h$2%dVYRuOvYyxoST;vC+5Z|BYT-hA)vR!@(KWW*|~hWZ>TZ0^`>qa z``}nu=(7Q0VXIBm(nNL=$i`iN z?ry0RH2m-ko6%u=dxnjw|Et#42_{Neu?+>$L^XSIw`(IR(JFXDss$^G>Wy)?B^uF* zv8Ht5NMcQ~O_C(32&J2*l|H)gZ{4F)G<1dLyEQ7(gz^%r)Wb^P3%%sIoWIV1YBx)P zAF{yP2VpIRrR63x7R+<$q@=^3r$Q?PHQIo~dlAv*r_GN+!ODoF<3Iw(5vJov^&1}G zjN`m$xL$n1paUY^rKr%OJ_%#CLOsG6a>{sdhQ6dM4E&-jY%UDy#R=+%ls%%nIPP*@v{;8|y&85VFiTVcG10&MSnr{p?AbHspX$qFc&Vd7iz;d0> z>@uJzY7h{NSY$vqo{?q|{Z&le{Dq{610kkh8Nwh{*DnXLf*L$HRy#EXKLWfxraPNL pB*)@b<=K!Vg6ZRs`as1P@1g!Zbm_O2#^!RPwXm}A2T2&EJqCs%>>U6A literal 0 HcmV?d00001 diff --git a/Base/Forms/__pycache__/FormsChartOfAccount.cpython-312.pyc b/Base/Forms/__pycache__/FormsChartOfAccount.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8386dfabcfa4818bc7bbc4305d114f262017bbb2 GIT binary patch literal 1150 zcmbVL%}*0S6rb6ze$bkRZh;5~Sz zcq^xBLZb0h!-apq#Jd-p9%v@vq!(^TH71;#*`;ZkaB>d6{k@s@e(&vjGvC7DAmD57 zXM5v|1i%krbe4Ke+6$c200IbFpa=~J1(z(TC>t^a5_krXybq9q;ikV6-2EQQ9yipA zn$XULk$_Ci+oVW2(TX<07R_}708p-t_9!PcfPn!KFeEn<GpoZN`JTf>^$(U_)K!zxoLpngp3a3| zIJgG)QvSfgw50i zu3<7YWjiKKCBn>~&59h^EDL6{e6VFp@K84Us%%=`2@%6(w|a-gRQDDzEnmPEqC_NS zftPsKSuAar9TrY*;M~@lz3Z8Nabgl|GT%-Ctz(BW%`(^cHTn$NJQQ5bCm*I)C?+($ zieF>m*roIwrdy7^olfGCgUJg_(@#x`({8^!?5$~fyTTOFIU;V4cntInhkekB44g(L z8oBE?xY^u6)8k=gwrt0yNvHD0e_MoN5 ztMjLNyrIYIgD3se=_9Qu$6>x1 z3BJ|H9bN<(=a5P$Bqodj0fU`wGAfwsH71zW0nvCG;;;|?N>Md<2{?F;!Y7r`n1(jZ z(z@;SUlINB#uZo+k5shElN;s!-4x6}>&^NxiSq;TEa)(Y3mHOq28PbS;BQ5T!FQ7% NX5P>I0i3$Q{{SH?6GH$1 literal 0 HcmV?d00001 diff --git a/Base/Forms/__pycache__/FormsPayMethod.cpython-312.pyc b/Base/Forms/__pycache__/FormsPayMethod.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bf2bab512b42350503a1a341fea76e4ba319e0d GIT binary patch literal 1192 zcmZuwJxmlq6rR~Xj=ej)$O(8fs1ULeNh~yx08vnk2^<(DB%6zydE$<=h(CqOA0F)!=u!VyqfPo1SFr}apGsDuW~>=ioXFg8}Pw6(Mjq zOZktLJb|SmEeGG#RAp;8fhVH~s$G#PJOo!1Glp~&MKKf)ym+b3IQ6H#T8B<9ht1_t zTsx1MGH$!mOfO)P#jbBpU=~G~W=XE#=RB9GS;wYyHYVnBDeJjD@toOc;8E=0tj`qc z|tyvb+EsO6#(GfUiS&#UI@C^~Wz-s@^mZ`zMFzsOuJBSj|0IR)^pZIs&LeXd1 zy|CG6x|kowBn(Exdz)aJ)y(A31okP@9DAIv-CJif$Z9iLLY@?r~UaQvY^EEtcGF7fmmCv@7Q|&yM(4T4K z0`Gyeag#O_BKC?j3e!{xlk)-vtX6@viV>RA7&mj^w^Xm{2Y{Q9C^%_DV;Y*W-3c$$ zUlGb2O=?K|&O)RxU3Cc-=?=%-OAMY!>=JF}W?zO7?t-RW(D*}1LVaO$$y&620uF<+ Fe*se=Bn$um literal 0 HcmV?d00001 diff --git a/Base/Forms/__pycache__/FormsProductList.cpython-312.pyc b/Base/Forms/__pycache__/FormsProductList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e813837293d6462c242878017d0c69ba46fad3f GIT binary patch literal 1090 zcmZuwO=uHA6rS0?q?-g%O{z2pYn8|fRuDWWHHTI!f=zp{7S`ah%}mSIO*YQ#w#G{@ zJ=9x!ib6rrgOz&d!IRfs1TU5f4Fd(iQ$1Cq2t7HIO=v2e!#Cf&ee>R%_r3j`Na%pC zk3UrBiUh!SacD2KMH(ZV)Bpkqx}XG22nCm1sU({+1QNInkh}dM z_}rpML8=4aYe)Q2$N0%8f}*QZ+YiB2*^Hqsq@!4q$E$H8aghH1g#)A5w+)#oWxIr# zI%m59W-)|mkvJ9K@ybjsx;CXxU1(tYKB0R;A44K>zA=S( z^OPxhPXxVhyB-N*+iAGhp4dI1lue!@1Pm%Q>MB06d#m#pusPK zgQ4N;g$arYEllD$Onk3g;8i~Iy-HyimwimeF)a+)6c?JU3$de|fl8GrqKQPzteAC* zIV^&DvS%mRzm@D?Qd#%qCGA`4-14p3*vil$`UIR6ptV7Cl?tU6!Cxt^>c0So&{6p04UK7N)-KO@VSg3Tfl!OC zQSqaRW`yC6reM**P{d+X1PTcnl1*c?bcUw5?beyCST9~U z;0;d2#6;o=g9ncM4_-kW=Ab_9+ve1A~V9AoQvLQntfkyzzs{kn&E_)lv&F_xvVnZ#e zG3{75G04;FcNNQ!i*ih1m!<^S z9I=-$r5QVCTIc9IZZN1a4w`gWzUaD!n&v$03v{ahntQ=j;Yi zmU-qgg2`seQ%)6+wJ~opDe5JYOiw0xgA10xfn@SU!L-~HBAUzstxaQUZ5Eiel))CF zL<|n|J;AS>$GLpLVg7g_yNHSFX!F>@DTjGhGANB5$~4Pd|Ejjrq3NapP1wdU^0hk;=W07qNbT^TW>R(FET}_N5oKz$3Wk3vkEG~@L{lj zKiI#fo=R$`zNVeDgYJR#ho#w#*{y}`XXSzMgV3EyWMp&jFfy_q8QHzHcXRjp*T_UA zJh+Za_J+N+vfExBnm7pGtAwIFb9!TXYj}IK+;{sRH1^Y{cIj&#&KinTdWS0AS1Vn; zd^4!O)kq(|1L@}`9#crSaKgg$G`2}ppjy;5fwYDZdeZd&s2;mX9d<1%aDIutD PsvkPub^Hb#){_4Mf?O8$ literal 0 HcmV?d00001 diff --git a/Base/Forms/__pycache__/FormsServiceList.cpython-312.pyc b/Base/Forms/__pycache__/FormsServiceList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84f018da24d1e28a8e43a400641be0fbced2b3c1 GIT binary patch literal 1090 zcmZuw&ubGw6rR~%N%I3zO{z2pYb%iztRQ$$YYwee1e*$43u|!MW~O!PCL3pVTjQmd z9^$P%MWLYR!Ad>!;D6AI;Kfp*VW1#*>OrVR5qfeao6uA`hi|@l`{unj?|b_>9*+RN zt`7WobWsA}yEwF$+9HinPHF%F1RYR>284o3j#QKl83GC11V~;4NWpM6+`fFUugL*7 z)QYNWyW*fjrcS%0NIB7pF2W8i99#fEX&oAUoYVjY21LM+nwcQaB(3pU#WLiItSc-r zDuUg`WX>+&+cxzMMGFPKpz)EDgJ@Vjs#-&x;qQC{4NU?#G@EGM?bwinWE-x*z|{0Q z*73PTk%Ckke$Wp2C6DlvQ3!=sq_!V|E3y$qT_}R0O&+Vn^!R@2{}&F9Vb9WKrj)EA zX6l^f_?SfzrUhb`J=-lYwcuEkK8uM)pD(y2kGKv~sE5nDqIRKy<#~ke3Vn2m#Q4S( z;?7g1Yk8=C*YatG7=utjmc*}4Eb${8$Im?D};#LS9W zrjgx?E4|FD|{xzRa#?KXq@O%Wb8{e}T&7I0TNuC#P#nL$g+C#tr(bhz11cCq~}+Ui*E& z@3sCu7K@V zs+ONV{$6UTrwSh#JsAED6DM1u!%K%G87-a)R=`KKIY5-5O{ z)u)6md#_8kuq$Hu=S1J0zbzH=>zUCwp2n}vWMr0-5no0_cH!+i-$Lf~)zo2RXT0qUvF;vY{JW~7YmPz9 zT#>kc-%UTWzR7!LiljnruG86fQ?~DunX#OLVX@iFp=l7%SrV>a&>uClmt3xA zFMl(!JGfiR`k|NBJihgn#;^|>7&l{UO+{I!%8lc+F1|9MNx*ETqv=3Bt z7%mouYqWc)SUavA6i&xL5Q(rTeAPAdD1N#bAFId5n(@hce6kTw*Is{=NbQ`zbH15K z*AwY43ww!lBk@8rFxL??x&K`J&(b;tC%+wQAPDgI{eRN~TyW>3wPqgD`@a*ryXgF0*E`OV8W*6(( z#UHYl8_DIy(DH+!mAyAtY76_Rsa8t(_G)b;t6B$of)?};?>EavrRZeLwT$hU#9{{% ziHeO2H2!eomz)h^!$t;L(N@2|v|n)J;_`bRo`FbJi_Fp~(20LjCiHC?WBeG6K1Sp4 L>nHg&;4L+RARe6AX4_Qy*xmR2esA8J{S*!d0Hv3I#o|XE zfNxCki0Ur&law6*0~nkMEN+|Qn9Q5JC2R|>ESRDtZA(-ZpMh<8Pg3O{ELG)*uvxVz z3vD2K7h+tr%eqN*e?~W9+0ap*b1}|7GGzjN`}e8!066EalGn?*1%Q$?qzuHP0dH_c z(BSJ_7Cd?gKtpg?WtXn3G~#(LcwH#Dlew@ksSe(8M}uBU;mbazIisG<;Ex6;^SB{Q zQRh<*^K4EHu`bs6t5MQ4?$sj^IOATmI$w%<@&)%!>mi)imS|o0fmR{13yf8n2w8oPgokl3Q7)-D1S>Xj zP|$_L5Y>u#NEFtLz3cYkT`-K3ku5hGO;aR>hTqfAJ~&Yl9c7`VEOeBm zma^1VlKX4j*lbgr{5*O6dFUiE-HFV#B6FRH+KQ;%_+lr%+=?%E$CaK0qBr|Mhz5Sk zAgH`hUuO=(ZDqb4xY1llo%)1m`X}|?<9af<%TeY7BV#>3SV=YgGlyDdHrbj@9{X?g zf?#U?R|w3+oAH%SJk^S)+VONdcKbNC`eB?l@^xadJF$2w2_d-$1WE4G#=*MkBV$HM zFBj~jv6HlH1Dg13Q9(8w&*JWSbj_|oiw@7TvUR(YcneUB$?U2Vf0~x5n(z)vP?h}- YnBC%@z;WDnkoW?w(WftlIoVD62ldSu8~^|S literal 0 HcmV?d00001 diff --git a/Base/Metrics/Dashboard/__pycache__/get_sum_of_professional_detail.cpython-312.pyc b/Base/Metrics/Dashboard/__pycache__/get_sum_of_professional_detail.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd5798287b56b39db8a3b05e005797343d0ed1a5 GIT binary patch literal 2095 zcmb7EO>7%Q6rR~#ukF~W)7Hs4PJf)HP2)7$(j*lKg(M|GElL^{DyS5>vbNc&YqR!7 zGn>#9TZ&K*k*EY*C`gs)u~l19PTaY2@zzCawnY>nB)FwY4}duEX5)<$NGmbgoq02F z=Dqj5_sx9Q+S-Dkee}1K|5ifi7e4Wu&=A%JLAZ`|q+_Tx4H{9|e2)_vb+B5`n9a((MYXv_ze*wlqVAG@_-f4^#Y{|a%f1ees&&8{)!*S+cg! znNx5G{y^+Fz9+tq)4~?N z+?MCJ7laMJVeYq#b;Oh3un=ilpq#cdw>d09eQ6yUTwBJWrc!@pCSJ|F11MSM99bmP zGE13B!rrsY`OE|^al8>o{{WQ8jc*3evXso5)N&)6GLw!{ zUOP8vUMP?`i@Bm^7?fk7{IPT8i+KZ5P5HfWC6BjZEtjJt2gIhFZf;=CTqs$z1LSnX z6(_YNw{?qO%2Bv&KHZDvA}K-vDbJ}J-Mp3Z2La-1TnvcQ;|S%i6-`3N_?wh!HZO^; zyq-VG$;U%thk)zL=y5#d#QW@cpA#Rj;{&z0x_tU^Ea}7!*s%jntk;h9)?$6jryeW& z9p$jC9Cj4dR@D0wRYk2SuQt&G)_6ICf*@7i0H5|0vxR-*O6;c95l=NV_OYQq;g z`bgQoa-%Ni!{UCbcX$&P&;H0znSrYB;c*-gABr)J5hU~=9!^H8m04#w2-SYC( zY70sY*E_nwU{nS&1wa99CLMAk{35AEQzr)V7~yfijh${3%U5}%XwwT?DQBws1%H`m y-Ag~^&pbWMJI-%6Gy*mk3^GcOz?45hjMsQo#2EjC27g2ce?_S^sT0fIp??67W!0Sk literal 0 HcmV?d00001 diff --git a/Base/Metrics/Dashboard/__pycache__/get_sum_of_service.cpython-312.pyc b/Base/Metrics/Dashboard/__pycache__/get_sum_of_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62799a40e8ffedd05a66f7833502311f693025cf GIT binary patch literal 1098 zcmZuv&1(}u6rb6zq}hBm3D_2_{j{!!`~jtinoud)QYa$C$g<5&W8!YM%xr?i1ak0D z(Sw3e1;MLQ{Y$)<=8!P9AczNVsSyP6;LJALR_KG7_ulW#yx*Jm=2IjR0!*I%l}d{O z0N=Rd3-dkcr<^r5yP`#yvOYW2Ue>c$u$Fag+rg zLL%@sHKe*!7tUr`VCSCQlYl$yXR8b4q;H>S|Fu5Dac-GqmQDGMum&_`MH6U*9CcsU zD~64zWEw7_Y7skx=rzNtA{syC=sKy|m_L(U4GacHMFwgiEHRh{ob@s)xP*#^Wnn%D zs%(@j7hx)S3`0h-h*6QzU_MYB_KtW|L{q4kHMX$IG4EgK7;QS(r4r|&fkClUVvIWB zqnq&L&uV5qf15=~{tl`k>^hZv7Lf<8vzgDJ3gcQuB!Ar?D8GzcTq=-!)*$!S9Rr*B zB69h&bZ0{!9c*U5CeC-Gi9=ZoD?K2}N}m-BRP@MCh~TOA&@!}Gs33ZZ=H|(nO}6pSi(Y)N^Seh(vMZYafy5Ch$&DR1jfO+z)?r345lRDo*Dr6j=-XRZv39>Sb%SuSOR%hR|x zZ(1I7F&|Wn>7|kjOFD^AN~lrH<@7q{DJyZbOGbo6!p;grSng=eg;mG(Fi$sNo}56# z0$mpoB}b+!zosU}3ilCoQQ-kxgf6L3$U(H=In}}htdO455EX9e2o@%x=bA-S$m!_e zoTIx&p#(j8HO-mV5N$qMtz*#+wz}vwL!SM^5j`nda^N{=w$taiV{j-&Y3K8Y_+c;q)u@ zrP|^^;zAp+iTKxeYDIl9u@!%QZ#SNOt^E+##I>I!bK~gxSW5sgxfKP;p-p8&>0y%@ zf=!-=O;T(!#GWD8?B%zY-i$BH>&B+JVSb8cS}BkmXq^MG#Jb$#*gmlZSV3%)dx9x4 z9f`iysO=cgLY+A)lg=Wv$!msDI^|&AIAN6aO34{D=E5AEaqxQYfP0?W^w+@AaZ<2m g!JBS|xb!zeDYCRUhG7oD#n0f%A;`4(6e9+p-|Dj%SpWb4 literal 0 HcmV?d00001 diff --git a/Base/Metrics/Dashboard/__pycache__/get_sum_payment_method_service.cpython-312.pyc b/Base/Metrics/Dashboard/__pycache__/get_sum_payment_method_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dbcecac305412cf24b21a38bf9d3da0ba2b5b34 GIT binary patch literal 1582 zcmc&!&ube;6rTMl$+9zc>{S~R+i?;rQE;3zrEwcf+f+W}&^U&)1dA=pN;^>`?`qBL zN>oM0I`j}jp$!zALZQbxB!~VVy?DC^nW;kyEtDP#N_FcgZ?;-10n5JsUSsIvSmjpD2`fC z!IwWpg+x=yslW3AIe|&H>kgRIs@c3r{ClpI6In8E+N5TglqFWFYt>7BN$Bs#jS4^D zgL*o!*g-yzMWY(CiUVM)$_q{(KJMF1!RNK2apc-moE_K}dLlgTv#F*B@faP}7X9Hk z_Mg|5Dri$~3CrlCZxPy5T4MDmrb_i#%wS-jh==UQ2GJP#<1wbGPzZP$!Tw(>J zDO;vbz>aR1O~Z*aY8W-sAuL^{uICvI)2LZdB3p~C&QV%Hh@>?2u$#}piaf( zFFk)v{}5_<`W@0B)OTz8GV#`ZcSFy^c7(1HPk+z!hz?CmD&(ftKxP7Xs}%!0PyxUb!>UdX0+SI>VerA5R5}aPVKm5f9J8KWtg5=CW=ETGK&g8{l@?to7 zDa>5{A@jy}*SFK%F*G*Qoj|Xi-OtQEQ>0KS&&jgobar4Z`&iN4eG_ZAEwg2+?UCI0=6&xdgT9HhG(#0hfRAJpOU$N`fFf SMW>#k*`LrtPdzTE(W2-4{Z)bh literal 0 HcmV?d00001 diff --git a/Base/Metrics/Dashboard/get_sum_of_product.py b/Base/Metrics/Dashboard/get_sum_of_product.py new file mode 100644 index 0000000..cc202b3 --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_of_product.py @@ -0,0 +1,24 @@ +from django.db.models import Sum +from Base.models import ProductList +from Movement.models import Product + +def metric(Day): + products = ProductList.objects.all() + product_mov = Product.objects.filter(date=Day).values() + product_report = {} + for product in products: + product_item = product_mov.filter( + product__name=product.name, + ).aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + product_cont = product_mov.filter( + product__name=product.name, + ).aggregate(Sum('quantity'))['quantity__sum'] or 0 + product_report[product.name] = { + 'product_item':product_item, + 'product_cont':product_cont, + } + sum_of_product = sum(item['product_item'] for item in product_report.values()) or 0 + return { + 'product_report':product_report, + 'sum_of_product':sum_of_product, + } \ No newline at end of file diff --git a/Base/Metrics/Dashboard/get_sum_of_professional.py b/Base/Metrics/Dashboard/get_sum_of_professional.py new file mode 100644 index 0000000..7eca0d2 --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_of_professional.py @@ -0,0 +1,19 @@ +# from django.utils import timezone +from django.db.models import Sum +from Base.models import Professional +from Movement.models import Calendar + +def metric(Day): + professionals = Professional.objects.all() + professionals_report = {} + for professional in professionals: + service = Calendar.objects.filter( + professional__name=professional.name, + date=Day + ).aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + professionals_report[professional.name] = service + sum_of_professionals = sum(professionals_report.values()) or 0 + return { + 'professional':professionals_report, + 'sum_all_prof':sum_of_professionals, + } \ No newline at end of file diff --git a/Base/Metrics/Dashboard/get_sum_of_professional_detail.py b/Base/Metrics/Dashboard/get_sum_of_professional_detail.py new file mode 100644 index 0000000..41c320e --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_of_professional_detail.py @@ -0,0 +1,31 @@ +from Base.models import Professional , ServiceList +from Movement.models import Calendar +# from django.utils import timezone +from django.db.models import Sum + +def metric(Day): + professionals = Professional.objects.all() + services = ServiceList.objects.all() + service_movement = Calendar.objects.filter(date=Day).values() + professionals_report = {} + for professional in professionals: + professionals_report[professional.name] = {} + for service in services: + service_sum = service_movement.filter( + professional__name=professional.name, + service__name=service.name, + ) + servSum =service_sum.aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + servCont = service_sum.count() + professionals_report[professional.name][service.name] = { + 'servSum':servSum, + 'servCont':servCont, + } + sum_of_prof = sum( + sum(service['servSum'] for service in services.values()) + for services in professionals_report.values() + ) + return { + 'professionals_report':professionals_report, + 'sum_of_prof':sum_of_prof, + } \ No newline at end of file diff --git a/Base/Metrics/Dashboard/get_sum_of_service.py b/Base/Metrics/Dashboard/get_sum_of_service.py new file mode 100644 index 0000000..96bf84d --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_of_service.py @@ -0,0 +1,19 @@ +# from django.utils import timezone +from django.db.models import Sum +from Base.models import ServiceList +from Movement.models import Calendar + +def metric(Day): + Service = ServiceList.objects.all() + Serv_report = {} + for Serv in Service: + service = Calendar.objects.filter( + service__name=Serv.name, + date=Day + ).aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + Serv_report[Serv.name] = service + sum_ = sum(Serv_report.values()) or 0 + return { + 'Service':Serv_report, + 'sum':sum_, + } \ No newline at end of file diff --git a/Base/Metrics/Dashboard/get_sum_of_stone.py b/Base/Metrics/Dashboard/get_sum_of_stone.py new file mode 100644 index 0000000..2dcb0c1 --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_of_stone.py @@ -0,0 +1,24 @@ +from Base.models import ProductList +from Movement.models import Stock , Product +from django.db.models import Sum + +def metric(Day): + List = ProductList.objects.all() + Products = Product.objects.all() + Stones = Stock.objects.all() + Stones_report = {} + + for Prod in List: + sum_ = Stones.filter( + product__name=Prod.name, + ).aggregate(Sum('quantity'))['quantity__sum'] or 0 + + sum_v = Products.filter( + product__name=Prod.name, + ).aggregate(Sum('quantity'))['quantity__sum'] or 0 + + Stones_report[Prod.name] = sum_ - sum_v + + return { + 'Stone':Stones_report, + } diff --git a/Base/Metrics/Dashboard/get_sum_payment_method_service.py b/Base/Metrics/Dashboard/get_sum_payment_method_service.py new file mode 100644 index 0000000..11de4d3 --- /dev/null +++ b/Base/Metrics/Dashboard/get_sum_payment_method_service.py @@ -0,0 +1,24 @@ +from django.db.models import Sum +from Base.models import PayMethod +from Movement.models import Calendar , Product + + +def metric(Day): + # Total de despesas do dia + payment_method = PayMethod.objects.all() + serv_mov = Calendar.objects.filter(date=Day).values() + prod_mov = Product.objects.filter(date=Day).values() + bank_balance = {} + for PayM in payment_method: + sum_bank1 = serv_mov.filter( + pay_method__name=PayM.name, + ).aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + sum_bank2 = prod_mov.filter( + pay_method__name=PayM.name, + ).aggregate(Sum('gross_value'))['gross_value__sum'] or 0 + bank_balance[PayM.name] = sum_bank1 + sum_bank2 + sum_of_bank = sum(bank_balance.values()) or 0 + return { + 'bank_balance':bank_balance, + 'sum_of_bank':sum_of_bank, + } \ No newline at end of file diff --git a/Base/Metrics/DashboardAdmin/__pycache__/get_total_bank.cpython-312.pyc b/Base/Metrics/DashboardAdmin/__pycache__/get_total_bank.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c56721a2a580684a6ee31ab5dc37788fdf2b118d GIT binary patch literal 3168 zcmd5;PiWg#7=N;4S+b?XuAMYZN}SA16D5!g%EsCy>sqISbZf|H$B5@56iZF*T2_$c z&=du7*dc=*8W^}em9jxw66nST+fLiPmpDE+Xe$J^%Wh6{DD1TFy;!N6xs=i{_CW8? z_dR{T@ArLA@6#hu3?gU~=h^Hd9-%+*!fU?zWam6gN=QX2l}9?2q9{D~<$XGxqRE`j zGrB+J*VzeQ@kEb1@%xW1akl9C?zbgQs6IaSfX6|Vo`^Iv$MK(!zgHy z&*i6-g$tT})ll8gS*398OeSL#3%10#TvEwv1ywQKz?5mI#fxN z24TvWkJ?SaggO1C=Rk*P;|}Z3z{v@EBT`4w(L!1*(&NL{ z4a=&(7H(LO7eA0F6W@}OXyWVM4Hz>yEn{0Qt>p7&0E^fw*}ScpF0<={GCON(vkFLX z)iF8T;aXtgtKX$(HQS{v+mu>dKlZ|M1@KSSjd|J9%z2l=LYKobGTYP6L9KH`SgzHJ zUASQ(gZhfgV~K@J;O^8mY$flKeI9^}9oUm#qeRl$XbW$NH43nCvP~oa9*ETflzN_P ze}9}jmHq^nSm{r-dCjzqLV8@YuGz+1I;j;PDpQ)3KC4(-8mhaQ%~h!hd*f!DS)Uu+x+P4I^4Rkj*9Zr*OC`#LGgwDkRE6q9XJyovX1Z*1q)7 zZ{fCO=J#kQoIXbx2C*7OAJ6-dm*w7B5W5K5^3dO#VzDnK-Rbs~~!M^q5 zZ*K?a*gH=^I|i0U$7%t@M`|2O3@r;cFO{ZOrZ>2FErcTNwQwU)XX*6H>1tFeN2RSq z|GkrUPhyzC1A&RQEqz$$(+Cr3+dSM=T3A^CA2AXGggB3oScx641pC(qPHpo{Z1f3e z&rrbQeF_F1a|)t22A4xO$4e6{6B}H2O~jlIp^naVCe{qC{Wa10N7lKHTd_MwZXem; z5*}P6x-?No>nM$_j8&uk$XsyTt0r>KRz(Zyqa2E7Asc z)JxVL(q>nGwQH!{HMExemidwYj$fUubiE7Cy;#xNcW31G$XepQ`Y`(-yE)en|er{KEgte?M7?C)c^7n;pG(#M|OGnfu2cN)M#33zd$ymPPO}(z_Y% z*`}#T?^Zaz?e|4`u&@t~T%-?j6X}LrMY?M=;txG@zZK`D8wqWYmmN6!Xi^g0u$of} zv&OJGGprk`mbb`N;|g_g(awU1fz9~W+0wjC_}_N-7Hhp=%xgM)j-Co%Wc#iv^0_@g z<{(xLU}M}UpcV7ld*++4#Q&^T4|Fw}qNvBH=P~Mi>Z2*&Q_fHMb`b7b#wn_eSojBM CrGCZ$ literal 0 HcmV?d00001 diff --git a/Base/Metrics/DashboardAdmin/__pycache__/get_total_prof.cpython-312.pyc b/Base/Metrics/DashboardAdmin/__pycache__/get_total_prof.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c674e5e0abb6d6dc81db721ad146c507d933942f GIT binary patch literal 1725 zcmb_c&u<$=6rT0|^e@&NoInJs3MotQPd-e_kX z)s?O0z`>Oev=S)osZ^~*t5o6-;S$FON7F`B>Zv!kJ|J;oX6$VOq=Ew@dEcAwy_xTQ zGjIHBJRSjL{P?A0ofH9hMkm1t4W0f1aW;VoOwI-lSL8VAhwPBU7kTFMw%~|Gk@kuB^c-f-A#Hn32erC%^u8q`*z!zlv3Yf?pv3REVg*kF6ol1Quv=4X_94W8H9}{;8ek^B#SQ$xn!*GDu5c(s53k8L z_{M8E=1JbSmj$XpU>b@{Ln7GwziN1m0x78IUlhneUSLh-9}0xSIhX>SDG-?gohXnR zLS;12uy6gbz;8&0op`_=*rwdz{+E4}hTKrDk~?mQhch!3UkD_A5#+6qy1e9&CsN1izRwc#QIGaD zmfhtFT=5a+4cqo)3Q4P$?L!X>j4y1I%N{Hn1ffsHqaBXNeu*qa`e$$* zdcIrL7a{uEch~d+tdjCBK%{?YAgC`v-?LVbzG$GYmR-X$&zg=^)k)0*F2+5(R>zXV zGQBh*qPoyI@|HHh6D{4-|DLAwwk^_`qQPKi+79nQXTblOW386m*AP) zgQ>gkx5783H&5I=v7;O#CoqyCjIl9tRDE)y;Cw!U6K2Jzmfcx%dDd}FXd~81I5vc9 zzC|E`B;zQ(zaWYAr@G{>Lx5 zFg7z+9@jF;1x5uJT3(xFYZ=u7qXvxatTK;l8ES#C35*+gZI-QN)N{shX;3@W8e3mQ zVFRa1=Q{NU&)nEIThxRvUw!lNPMhu{)bzB3_bRd?k0$3b&SJx0Yu zq_qQwk*2t3Q~`l*2(|367cJ|mRb z&&Z5W9{9FJ*q8^Q-61|$pAu$^R(2m++oJ!<8#Tkzv|>&Icj}Qg-31{02Z+6c?NY`V ze@1tHDiW4{XsA>@-;K1piMAJOdx>VonmO0nQTO>mu|Fx5^IMUAFVW3dHxu28b!)Ca ujCy3DyoAfBdOI?jiP4RXZesLeqc=C6M2G%D3I6ByvR>YjUaNEmKKD1Z((jJ| literal 0 HcmV?d00001 diff --git a/Base/Urls/__pycache__/urlsBase.cpython-312.pyc b/Base/Urls/__pycache__/urlsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..694eacb05370182dd97146b991083d2baa8d6193 GIT binary patch literal 860 zcmaJ<&ubGw7@gUjO|qM$Vpd{gJ$MN=lqN-KON)rMJ$MkQhbV*v**ar>G`kySH(mz3|2ao;_Ub-Z(IM9WY7MV)b->!HqgXxt+o_eN;0hZcL( zm0IR7UCR6vjU~uX$MPGzDhEyS+GBvBN3Kl-;aE0dO53eB9hTt5?fOi`me<&GEsB}C za|stN;X`aUohPL%OXHU1)ZKEIwmmAYg6Y$fm#*W}=3d$A`VEQ%qY3z8GGE)WJW_rp zve1MemB-@%Ny{56n8x=!iBQlq7f^BkEY0WeAMpuwypQ05AAx@x+nZ+9Bh)jWlLJD1 z*D-g9x9__hbDKC^x=TD$j5Dh|q$!e)hj$KH>YnZ5Zkybv1@6S(B=Fwz&$$dCJOek+ zz}-KR1f|~@ps2lEulla`ws!n#go@u#s&~C#94s9zg}GvoD-LtFKh#HPO%R3tW~eU) z`eLZB1p3NQzw@OqLR*3|`efi9xnX`e$S)7`mCySV;#9qHyc!ynz^H`AdSI*%jg8X> SyCd}UJe#^Ay-8E?6#fH|z{N}e literal 0 HcmV?d00001 diff --git a/Base/Urls/__pycache__/urlsChartOfAccount.cpython-312.pyc b/Base/Urls/__pycache__/urlsChartOfAccount.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39f576e85b7d46b1c6802143596ebd1352640391 GIT binary patch literal 1014 zcmbu8J#W)M7{~8yr+IPWmc~Lw;DHHcNf@iDszRNisZb$80V%SCOno#jj&0ptg4(TH zzX6{C%BMhL>S8OAEG#iGu@yxuow&obtQeGq8~i-?zyI@lPN&CLl}ZV)b@OG>|11FT zoo|v=yiFDq0`MMKz=Ady!ybe@7i?iH_CyE-fS@HJaac$S(>RpVJjpI^6HEG(yAPhXuXL)^ z)_?HA8jK{*qUg?-)be3=E7?~7B zTg%2+<<_%}#_qtOJKkuo(L&T5*jaC^X1!g{`Uf{wv)&f6(cgE7Rqj2i$&qXgP3Od| zPq0lepN^=sZxU4J=LAbkz-wI1o8ZO)}PU!}suJzsqks?9)c zhU!6}9?aB3zcZRkHaql-_kHbgsI>#F9crCG>&&zlevi(j$^V>QSMuw^xs30y>;47~ C0ro8b literal 0 HcmV?d00001 diff --git a/Base/Urls/__pycache__/urlsPaymentMethod.cpython-312.pyc b/Base/Urls/__pycache__/urlsPaymentMethod.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..078cbcddd79ef8b091a0be967a4184dcb50f5b38 GIT binary patch literal 978 zcmbV~J#W)c6o&7$o#w-d`w=e)`~$K$TZF1AshUU;5>yc=AVmgb$(JUnzjUt~lx}R1 zy0F0?V5rIuL1KxONEViunAnOc7??O0*EP+M0S`XszUMv9v98bON~MJ0`E>SccrGCH zjUUpdc%57Y7@>E_LKe1>g9jM%T(AX49EcbRh+s=3;<%7DW^pWMd752ZCzkXvcOfQ+ zzl;rFlv7t0*D~@ei~=x}tT)ZpGKwpV5-_&X&MdBF$SaI8Fm|%uG+WE4WQ?QSpfpu# zo8Nh34absi21AI-WJF%Go;iI)f}v-{xE^ocoF0x?@D%FY@0t!d&DYzMm;s5aH=ab` zuG6jh-pCDh{o`i6LjrST|6@ypRa@V;ZqpKB)z%?4xivHqxb3he$Femx-6Kywp*ExZ z|Hq{RlM$WQ8I?ew8(hts?BxVB%J+)$Wu$ypDPO5rhHki%fKZp6qbrcm?}PTP(PxA* z;~AL{8hEbJA?!Hte4|ZVu=WTu_$Z?fqYXYE?!|#pa+|t8jSG8@XPwxjNvnW_y+`Z= zye>tI@mF;3rzBwEM;Yacv+B%^6g^b*NNI#hW1-xiw;nI0Ctsw(?9SW6NNt2_BT}28 y+FYpn^RBU!on^kh^B!4Bul~PyS;=n-Z)Ca+U-}17Bj<4d literal 0 HcmV?d00001 diff --git a/Base/Urls/__pycache__/urlsProductList.cpython-312.pyc b/Base/Urls/__pycache__/urlsProductList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..987d62860844ab2c60068946a7695b7a05b8e32e GIT binary patch literal 993 zcmbu8y^hmB5XX0I=knpi7l+W9{w*-F0;L z20Q~CPrw@>8e55EVTpqg-HAfT88JS+3-|btKbSC{;BL~|I1B9wctnlw%*koFYf<8GlHAyErIPTS zHoLuv&&^=A-yIO{OuT=LsZ=zM0=Gy^rJ`{_JW^<#O2YW4ttP5Fb^N16=a_noidjf% zeTR{bxMx%Wf$j*k?64P0(5RR(Dh88^xus&f5*4c9eK?^$dxtJTLci}@rafYWGW#i6 z63Q38Js@nx7lCaNAFKz2*`k#_g4VX^zwthu;3TQ^=J3iM*{3Z4!XJRxd)O{yjPX}= z`1Q34s%NcGyAx}Bk+v6WW~7-btruF)*2?oQO6BZksNaosGt$ji??-xnr4Pd4 t%e8U{mtpl*XxxhpD>AIu7)Hi$WjqWY&(@0fKerc+@~-qorPttd{{Xz{?K=Pf literal 0 HcmV?d00001 diff --git a/Base/Urls/__pycache__/urlsProfessional.cpython-312.pyc b/Base/Urls/__pycache__/urlsProfessional.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40751840397fdb137bd2ae5cd57b7d3237e7bff2 GIT binary patch literal 1000 zcmbu8zi-n(6vyvur}^Q;ZK+iWfyKm-C0ROERwRhS)U;hvq+khI@@wnVv8_8dsNLB5 zA29G2K>1HtY$cLaOH53NrKnG^Z3)j({$Prsku2nc=U zhkVuVle-Wj^bXm`#x9!TF~&R>TwyAXMT`Ul*cL&Y)bhe2PUIrbv+MiBmOfRk#q98h zvBnt9+*QPtjB1HdV+^IJ&9jw^dWq3sjE%gqh$|U#iP2Z-7yLMde+}HM-&J( zU&0JX=zFFC^eprPvkxA#9s)IaD|5tJo4o(>8+C$d*28lL|wc%Vlh>pC4sxP zY*lZPs{kYP0olmLE}G#n#yl5XVJ416j06PO7D1d;vcf!0mB)>Ya)D7{3?;A4vW<*tfl*_OW>%TUjSRWKs58dxyf(`=G8#GKur#inDDCZ^ zys(WE$+vJB?yR{|iTh5Q z-JatGx_6^$d`E)r9zXdHkGh1RLWjZfQhBHI(oJDhipiAxEeg{0QE zD0KKeB@z?J7FWv_eY0R1;WI|~U=lvJgpXGuvugG}0T7RVL|05g*N+U{98nt4`O9EQg&lSj}(2W^g?5QCB6P8RnG2)>Q1cck*ddPKT`Wkbr25U suA~EY8CLIw+QV2gBF%`kVWbV0+LQ3bbS1g}b9>n+Zwv2ba*KWLA3_rC9{>OV literal 0 HcmV?d00001 diff --git a/Base/Urls/urlsBankAccount.py b/Base/Urls/urlsBankAccount.py new file mode 100644 index 0000000..2f397fa --- /dev/null +++ b/Base/Urls/urlsBankAccount.py @@ -0,0 +1,15 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Base.Views import ( + viewsBankAccounts , +) + + +urlpatterns = [ + # URLs de Bancos + path('/', viewsBankAccounts.BankAccountsListView.as_view(), name='BankAccountsListView'), + path('/Create', viewsBankAccounts.BankAccountsCreateView.as_view(), name='BankAccountsCreateView'), + path('//Detail', viewsBankAccounts.BankAccountsDetailView.as_view(), name='BankAccountsDetailView'), + path('//Update', viewsBankAccounts.BankAccountsUpdateView.as_view(), name='BankAccountsUpdateView'), + path('//Delete', viewsBankAccounts.BankAccountsDeleteView.as_view(), name='BankAccountsDeleteView'), +] \ No newline at end of file diff --git a/Base/urls.py b/Base/Urls/urlsBase.py similarity index 50% rename from Base/urls.py rename to Base/Urls/urlsBase.py index e43ef49..1a5433f 100644 --- a/Base/urls.py +++ b/Base/Urls/urlsBase.py @@ -1,14 +1,15 @@ from django.urls import path from django.contrib.auth import views as auth_views -from Base.views import ( +from Base.Views import ( views, ) - urlpatterns = [ # base das URLs path('', views.Home, name='Home'), - path('login/', auth_views.LoginView.as_view(), name='login'), - path('logout/', auth_views.LogoutView.as_view(), name='logout'), + path('login', views.Login.as_view(), name='login'), + path('logout', auth_views.LogoutView.as_view(), name='logout'), path('dashboard', views.Dashboard.as_view(), name='Dashboard'), + path('DashboardAdmin', views.DashboardAdmin.as_view(), name='DashboardAdmin'), + ] \ No newline at end of file diff --git a/Base/Urls/urlsChartOfAccount.py b/Base/Urls/urlsChartOfAccount.py new file mode 100644 index 0000000..66c9d04 --- /dev/null +++ b/Base/Urls/urlsChartOfAccount.py @@ -0,0 +1,13 @@ +from django.urls import path +from Base.Views import ( + viewsChartOfAccount , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsChartOfAccount.ChartOfAccountListView.as_view(), name='ChartOfAccountListView'), + path('/Create', viewsChartOfAccount.ChartOfAccountCreateView.as_view(), name='ChartOfAccountCreateView'), + path('//Detail', viewsChartOfAccount.ChartOfAccountDetailView.as_view(), name='ChartOfAccountDetailView'), + path('//Update', viewsChartOfAccount.ChartOfAccountUpdateView.as_view(), name='ChartOfAccountUpdateView'), + path('//Delete', viewsChartOfAccount.ChartOfAccountDeleteView.as_view(), name='ChartOfAccountDeleteView'), +] \ No newline at end of file diff --git a/Base/Urls/urlsPaymentMethod.py b/Base/Urls/urlsPaymentMethod.py new file mode 100644 index 0000000..885a92b --- /dev/null +++ b/Base/Urls/urlsPaymentMethod.py @@ -0,0 +1,14 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Base.Views import ( + viewsPayMethod , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsPayMethod.PayMethodListView.as_view(), name='PayMethodListView'), + path('/Create', viewsPayMethod.PayMethodCreateView.as_view(), name='PayMethodCreateView'), + path('//Detail', viewsPayMethod.PayMethodDetailView.as_view(), name='PayMethodDetailView'), + path('//Update', viewsPayMethod.PayMethodUpdateView.as_view(), name='PayMethodUpdateView'), + path('//Delete', viewsPayMethod.PayMethodDeleteView.as_view(), name='PayMethodDeleteView'), +] \ No newline at end of file diff --git a/Base/Urls/urlsProductList.py b/Base/Urls/urlsProductList.py new file mode 100644 index 0000000..fbc1307 --- /dev/null +++ b/Base/Urls/urlsProductList.py @@ -0,0 +1,14 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Base.Views import ( + viewsProductList , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsProductList.ProductListListView.as_view(), name='ProductListListView'), + path('/Create', viewsProductList.ProductListCreateView.as_view(), name='ProductListCreateView'), + path('//Detail', viewsProductList.ProductListDetailView.as_view(), name='ProductListDetailView'), + path('//Update', viewsProductList.ProductListUpdateView.as_view(), name='ProductListUpdateView'), + path('//Delete', viewsProductList.ProductListDeleteView.as_view(), name='ProductListDeleteView'), +] \ No newline at end of file diff --git a/Base/Urls/urlsProfessional.py b/Base/Urls/urlsProfessional.py new file mode 100644 index 0000000..e118cf1 --- /dev/null +++ b/Base/Urls/urlsProfessional.py @@ -0,0 +1,14 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Base.Views import ( + viewsProfessional , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsProfessional.ProfessionalListView.as_view(), name='ProfessionalListView'), + path('/Create', viewsProfessional.ProfessionalCreateView.as_view(), name='ProfessionalCreateView'), + path('//Detail', viewsProfessional.ProfessionalDetailView.as_view(), name='ProfessionalDetailView'), + path('//Update', viewsProfessional.ProfessionalUpdateView.as_view(), name='ProfessionalUpdateView'), + path('//Delete', viewsProfessional.ProfessionalDeleteView.as_view(), name='ProfessionalDeleteView'), +] \ No newline at end of file diff --git a/Base/Urls/urlsServiceList.py b/Base/Urls/urlsServiceList.py new file mode 100644 index 0000000..8c5606b --- /dev/null +++ b/Base/Urls/urlsServiceList.py @@ -0,0 +1,14 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Base.Views import ( + viewsServiceList , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsServiceList.ServiceListListView.as_view(), name='ServiceListListView'), + path('/Create', viewsServiceList.ServiceListCreateView.as_view(), name='ServiceListCreateView'), + path('//Detail', viewsServiceList.ServiceListDetailView.as_view(), name='ServiceListDetailView'), + path('//Update', viewsServiceList.ServiceListUpdateView.as_view(), name='ServiceListUpdateView'), + path('//Delete', viewsServiceList.ServiceListDeleteView.as_view(), name='ServiceListDeleteView'), +] \ No newline at end of file diff --git a/Base/Views/__pycache__/viewsBankAccounts.cpython-312.pyc b/Base/Views/__pycache__/viewsBankAccounts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..743438d9d76c9de4e9614968627c15a9241c439e GIT binary patch literal 3980 zcmb7H&2JmW6`x)1lFKhqq-ax>U5k#CNb4k095+qj7-?h4ikl`v;CvKV2v|_ukxXWn zRAyF=MKHAv1}Ytj#D`Wb+M>Q1?xDy02?2VcpcG;jHG;OM+zd!*f}Hx^EV*1#GN2B? z$2afI&g}f=z2BStdpeyU(EjE8_vWwSg!~6P-4^R82mc0ThgigtY~o0Uc7Bs)Rn-jyf?T=4gf{`Vl+sB#ea66+7vqjFiw-JM9b^Lqd<*8E4oSmWWJVCsyn( zu{0W^8kHWZ{@O-Xc;etm2#*|ia>A1YPfB>yz%wE|Y48jQPbBcv%=l?EA%5TF~?}hrM~{&nic5t)TUkgJatPI8^`FfmwU6mTB+TjAFfvz zwce`SuGGB3+mtyK&MWnPhc0>9g*tQi)l%()*UIJkdd=lvj5>9T+Nh-%y+s+Prd?`m zKwonx=cQH3%RWB7lslb+1yFtsM@5MtS;UZOq^gAn`nsW7k`c9JBW6Vm%~Fi`7Fm%j z^{!?lw#aSCNWMe#sFx4FRTq)Q>9BPc%`-P$$M#ZT`_~v$-=Df#;&kQ~;9@Sr221`1 z%Tnl#BB0~%;CCQ?EA0?BaBfGM+058XtYOi=&cQDJtTX=EPEZZf{O_Spui^byR z_j7ZXm)_%W{7b*YC~)hwrFqIfaO-PJbF>DNy-oQNV!VX0$CnW4zEGN3+h7Hlt#Lkl zINhV13BU3X4C7Zpe78ydIWl_h<=v5~y%Bv&YiCA2X>K?7Gvm9N@%_xiZf4^C!d~Xt zE#=E(rd=4{xpVK%-`r2{>=mwTU2kU!TbToxh3F|yGff{ZFJYPx(d#xq=cP=5sbu>e zh9}@9LvQD)BKEzsOPw_v(oM|ajUeLmwrkdxtF-L;#^hQFQVqu}Z+Ihc3Y{D?5q-=) zv3W1ufwoL-+cY0Y>>Mo0F&2Kt#zC@7S75I284%yyCGAvhKXq<5b#C)oJOA9~TkWyw zmQrZv@|(YCk6i@yTUk{{9}^I)*qxv+D>1II9W+6lG%IPWIxL>*6GmJnG+_miX(Sez6US_JLO&vuLi?%@UPoN-zz_FkWwknPpXaUR1 zZm0AUavZY*>c>@!do_hV$*7l3KM zQDilLsLAT|w^~HK@R)$`_lC2U;TN=S#vVKerjy@;HX=}$`#7?9ryJl%-{Es)4i;I| zwUc0rXgwhQTZ^LeDi|0F^l;4UftrJ$j9uJS3jRYlv~Q~sFkm})7sSc7`u`M{4FxX3 zeUS97zXOo?j!@Ysh_X?>S*ooD*k6pp82suoQ5RR{57X{XB zQM`}A@d?3oDL@w|I38VG_+;opiH?Ozv<4+QeiX&thrl=40)Vk31s*o z>5X-U<4ulLmS;-q?#&qozmGUWN@sB#l@OsLILPNC1r42hVrK?mAMO*)JR*~i$i$(N zltx=;o^Q=Ae6Af5=p2saqzkPd&bBUI|NO!sfzIJ{M0&AjfzDwt9a2@M4dt%0@@2%)Mae2GGeD74bb(#m)z#O|&gX4Vu( zM&y9haHv`ilxweu9{NvILgJDrYGX!49D3r0WLHI;`rfR)j*}eHQ&-xz@4esb%+Bw9 z%sxvdV+5|ZzjfvwMhN)}js69;ygGlt;}NlmtvJM0OvP1A)eV^;S2HzNH+2Ou)d{;1 zGvXSiA?=V8bz^2s>Y5XG6J|o{x|4KMW=bI{IY;d9Jz_^_gc?+NqWjC4X^9wsL?xmI z$PS6b0EtUP50DXwBmhZDBorVSiKGBYOGFEhY;#9`Hr8x=T_UrJt=}`u*b=#|nDH-3J}h<)e@mZpms~I^Lb1Ks;0)5ibDmhg#%&i2IYC=Z?}MRV{!6 zr5X;@K&eIpHBfBjNpIylYD;CAmQsxeV4$?rU({fn(o%qg(2US(C6@yGX?$8%rChH; zjB6YS(s^T^GLg7JJ?mzJvL>gVh%g8^<(>$gJ9AZp02ATaisMn1*M!EYGb@b#V3vi& zMbxs&PKk5N;<(4j$;rjHXQodSuW^WW@oNmaSFaUMQ~r%tpD#|+8ccSX@*)yj#AM?| zq<2H^6y}?3C(O4nH5`?G91H6|I|&2%DG+ZK$)DM=2gg>j`&YC1C8M3r{?NMLT1!u? zq$k$WQ!DAIpUbJ6^|99k1e@qjFjS0~(|C2Rg4kXu(nu9QX2WF~ zDxpz3$VoE>|Gl< zzA|!r@xt@W?&XPNtC{0S@_Q><&Yub=7^1e{K05CMvOQ|C%QZt#dK)Mkbm~o%`H)Z9 z2rM*{H@3qQlE5&F*70xzO%(6I&Bs7&!Nd5zV8=LgXvhCUG7ZkQP0aYvx@1boWGc^< zYB#7g!w$jcZ=~Qu^r4u9`#+|_fq)pCU~6Jd0xELon=82ZyTTd%Juo~`g@268e-ytZXc&9h zF+{vK1M~te+kIO(4ZpRg0K2-Y{h3F37~QIwa&{GFID$(0x6 z;0uy_LH2gFxH7i9>+tf?^G^?S2^igRUD>xhadi2k3r{a}2^if}NZCK|fYFWVN`Bx0 PqnpwOp1%ngvS$AUMNy-0 literal 0 HcmV?d00001 diff --git a/Base/Views/__pycache__/viewsPayMethod.cpython-312.pyc b/Base/Views/__pycache__/viewsPayMethod.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b9743be1e5746d79513b40b4d3ab820dc36084f GIT binary patch literal 2737 zcmcgu&2JM&6rcUF*WcJq>nH`1Hhk1TO+_nJLa0K7kE$gRqR>_=ODp4@5WBl}m|0UC z8Ic20gQ}|K&~oh+(L?_P?!6?6+L%!hhn~10#cdI%zBg;HoxmZzbfta!=KW@8_Wj<+ z?60X*oWNE1=I@0)Q9}O2!Qg_iyf%M_$35Z@M{$X#Sc<1ws;60+r(3#bScZa_>PEb% z74=NZlw-|}d2uT)b=^&PNh>LJ!%cZRfFoNx@j6_U8ViHk9 zWS2zZfFvYhgh*B*NkCE((Ly9Aku)F~iRdAcZ|^E*pW>!PLzw4l-2bdbzY_5oMk_uI z^vjD*sGp`T9oSD(zfyB?PEi%P^UbTZ#zlIqRb$kdt=*_KMBxHuUXAlwb1P6(MEY!# zdHh19Jxl$CrURCU*L0}MK}#}voia{sx3bi(280As?GHB3g7P)QgAz+|h^11kZjMe2 zbjxrQE8?hD)X^-{(XH4DnO7X+wrRyz$PL9xd`gNDkqtj%;QvxSG#y1-X~Fkg5etn^ zF=1ZBPgOWAT?hZ|sxq>>20GrGKZ5u{xkvmEyrXr%W8x@ZN-5Gq^cCFfMKs*~97%_Nj zkus6IN`3oUi?TMSzKAjiF6F+^&Yig=G{8h;zUKOr6?LI=>dp&uFq!3Ha}l%cs$1dQ zwmJGZH8r*T;^fTn@?{R;Eq{(t_M46JY0AI!n~UWc+JMC_P+mr2%a~ZajPwrkq_o&( zuftMHd&5`^Vpbac*c8m+r$9VkCV%9|?|!hBKe(PRu9)3S{=3ed&PHZ(Ei<{1nO@6G z|8#aeb9hC6l*n`ollN}jz4eR#{jK%FiItDKnZinD6ILO`q%dteAWFn-8*;Vf0%;;? z13?uxKp1k*G9ZK@vst8k>MgoZJ@Q?VM~>+Y-)>&1)2bgB6N?q79Gr8dE%Ly7zhrFW z8;ePLEK+?ktJHOEyQr`|un))RpJaP+-}FFW&*CKz&u^1%GPjZ3y_Vd)e5N~AT%PSt z>|fOj-Q3vnC*6qyp#Gy8#`rS=f=vz<*iv(t$#`vE0k1Z83qz2!bD~^dVrw(Cg$`h1B`)*KHt1?U*hQ|fN ze<6kkA&Y_#6aDGfLs{)gsnYTnN*?}baE6CJ!}C!DhqC;;2#Q|Eh|8WJ68#mR+PQ21 zvYE&dmzgf3E}hzz6T&w5ao7Yam|p|&Oj8u)39)`7))R8^G1>o^6dsd(Jw2g} zuZ|yDJu>s~iynbNZ^BRxtWF$REuDF|)FUwHr8VW?&;o;A+)#=`3k-T`eQ5cMz(CgL EzYi6LnE(I) literal 0 HcmV?d00001 diff --git a/Base/Views/__pycache__/viewsProductList.cpython-312.pyc b/Base/Views/__pycache__/viewsProductList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e1f48e9a31ddbfcec9ec00f114f13307ad96965 GIT binary patch literal 2765 zcmcguO>7%Q6rNr0+Uvi#u>+0_Bq=Ekrmb65MMzbJP=66LQB_)yR+d(-chauewbPk( zi6d9dp%Uo@qUwqFX6?0|_7ER8#dLX2jD>&C^X?K}>a{ zUd)VnhG|GU;>Nv%nUK2XCcTuIlDh7uy)ko4Au2gX?C5P`$7qZiRC%BW%b6L87=Xkj zqK3#Gi6j6?N<q&iTy^Rf>Gh_=s6Fp2J9Ux2K$+)o?leY$q9XR3 zZ7`2tU=6!j^>JD7MZJbiT@G4`(HoR;YPpq_RyCj`kZRA^J`2j15D`jD#U`doBQ;}q zV4$12t(Z|;HDh+fG;Ga`uaQN?)^8hTVvQ^-X7UqKjEdaQhx9pEd1c6X7`>%yzUPYM zkoyTH&hx~{3a6zTz=Ks)hQ1*JI^Nsgf%sOrNBj`H6KRvLAl46ho|{UW)U*%|m0C1Z zL!}lE)ljjO2fdYVs%@2J+e$4Nf}zq@e^A45N?U=wM;3%uuXq$l&*0OtoNA*EajkRU zMd!^W%0%ia^{wko%37TIBE}%dl=~ub?#v|-0Zc>}9oMIl$Vj%GA0-=BfZ1< zQd(-US7EZ1nW1>}V^D4*Njdk_jUVDdn+@&k(u7g z%x+|6zdyT~Ik2WZOlCUy>3g^C-ulu1=GJEZ#M+0QOnxo14YQD9N*IAq$A zD<2Cv$HJ0(7U>?LRqDEyRaDp;unxxz_<&8}x?_ET{fn1CJiARgsq9v2Y9lqZdZsgR zV0FGzm|NHKo$SQw$DP7{Q2$YNeex**!KV8Yj8q?HGhW-5KiZBvv7R`Mq zuy93U5t>ktnkrA54W4jF8%I8QTW|*&V6a&{`2Fw_&md?Rb=|z#ot`4ofT) zjomPW+h>?LLkt{26UA$A^GOgdVW6--+$#|?JwPQf-#9yeL!AU*3^}zqa*5TxZ zgWXyvCU%n?SS{=jikGFyF$7Q`$Y(*km?k6DF`x(ES}0D43A+ZNXvkBQLp!fi=2RJ` z55psb;eQgt!;!^6h(d2T_EhFvDOH;OwUUQFA)MiF0mCy>1P8VJ^9UM%hEbROK_q)K zK;?7U3}j=G}lU)D+ literal 0 HcmV?d00001 diff --git a/Base/Views/__pycache__/viewsProfessional.cpython-312.pyc b/Base/Views/__pycache__/viewsProfessional.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b26d31f26d754e4227c8c44c95eede738da60ad7 GIT binary patch literal 2837 zcmcgu&2JM&6rWwM?e$lT?G#5r;6SLrf;#1^m0DC)1VYt9gbK9M%F@bsC&BKnZD!UK zM@Hm;)NrU;4lT#_is+$#Myp;DMQzNeh(k}@km9O{Q{S7l*B@|5FCA%~-@M;=X6N@l zW`0W~q6Av^*OlcT!i4;VgMNdtY}c7BsuM5*j%H|1&09<&qAgfXEIm7FJ5=q|CsG)#4>JPLZ-8A*xgfJ7vs z`p7PcL;;COBdfJnSbd2~ykvth3XeiV?C@BWwi>-O`N68d*}T;9cE_u8~`c5xY$CAu&1pC4ClFb`M+U&|J9gI<`m* z+xat$o|n7NlsGNi1TxIV(5cGG&^HA@$G-hNi0_mK#Pz{@fj0RXod2k2xvjKGRr6tA zsfK*jSE>tLarChIp zqiY;^3i4)yG7(>vXES?x?W0aIyO!LBRY*QAbkp?c5>eBH zIBwcNors%2Q_1!ah8_^{;ja@x8S*0GQm0`bcJ3(bbEc>HNBu?W8AHKj};#2lXE{7@T@eK(JhYfsw?-z{a+H1;ozMl7_4JF=Nfp zRYD_{ADBiIQa9Gppg@fzCglus7R};s6SC z5SvAD5XGA)FuO%`3Cfihvn-B=7;l!#P`b<}v)N&=JR}}3lHw!yM--FLCB;c{rr$xbk8NmKZz)`0gyMcJ***%$&M3yp*9t%$j!-wK++);v zfJa>lHd)N;JK+ckU~?#BY)B4{;Sj|h=zI#qYdDxb?w=N?j-2*?52(RCH^zzw3j8ky}Z761-|Hp7R=@Wztyq=)bfb1+BAhW_lnWaN!MPALU!6iRN zga^Dr1YFwiC>SLoAKgjdU@kE%K{AKNc{_ywibK%(EQnV_Xe4(AWZ}OS^OIuIs)Cd1 z@?z$22h=F5lo^H=!<&cUdyCE3j#zpQetP-?o@3l2VJIK$Tk!>d+ArTgUz z#w!mR8ocrz>#YEFfy+`MOOPxEG8<$Z$U}{tR_Ld_YvTjkakc6I literal 0 HcmV?d00001 diff --git a/Base/Views/__pycache__/viewsServiceList.cpython-312.pyc b/Base/Views/__pycache__/viewsServiceList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ac5aef72d316f23ff8afb94a699c9878e4651ee GIT binary patch literal 2765 zcmcgu&2Jk;6rWx1+Uu{lu>+0_Bq=Ekrmb65MMzbJP(Km0QPmHSR+d(-chcDG+Ud-? z#F4A!P>J+_paf$QnMr;8V2g#3lZ-~wA-+ke30KCy|dIK)*<#Z^t!jhGQvGc{K?bpW=iV1lXl0n)9I>N!h#jLbYEb2Y?k{I%Bw_#( zmxvl5dnA$oBqlt^UdqE#wB{ARb$k?P+P7wME)XWZjJL=a}+2l zV$azobNOY;Zq}+4mjz$cZQ9h~prshSNg1b>Q(0+OeM)?(_KoecpnL@pp~O^dVyZM! zH^Kvb-PCQxjM}Ohvm>TqYi4|nEGV{q$1oFXWLYtjmq{@ya-k0yaIo@P$axsOrA5zm zL^9-lf{F7Yak9c`=_c@CRh7^;L_o)T`+E@IDffvNfOjJu@-@WzLEm#r>5#e>z=2Ya z25O+x9t&0_hoiT2`&vY(QKa z9C*=rYl$+Ex=uaoMvJmGr=Ey02r}iKh@3lfMMMA-(S@4hQC8H1#;LO)jKN@*gT+PM zvZ_vnbIanm$C;U#)fXpE9WP(y5ajab7;CTDD4(YM3$M9UK1CZa*+t6BNNgDsjF*w# zaK4n5+U#|hY-J`Ck3sB8;SWy3D1H*e^HuU^Zt~s-8@aj7Tyf3lW^&(j?sm2^(;J!T zt<3C3X7-1(o0$V^+QVd~o1eaa``+!Jy>D-C=1;7B+|A_IGTSfa|q?^iarKUDgQ>$mX z69-l=bPIFqTE3f|SpBqH*bnMIs;*ByBOuuHV1kkA!)(TD`wEEN)gF!2@nd#erlArV zw}Wgn6HuSYwgycoTz11Qw2}{n`LOSo^(eQx5|<@dv2APq#}u1^)!1GXZ=(nz!Di9i zhXM;%Bo?3v`KifL=t%NbwMrpTTg+i|;Q5jGOh{7S!xvFZz%5DL!RaC3bbRmD_|c8= zqpP1h%ucOOAKT2nkMzE?q2>LlaDow12Q6d!ARxOV6&qSR0_7GaYuJuQ$@2X^S>v$8 ze9_nqL%4m0nG<5*2%0F~fSXT(cm)H6{lQ*w=*V9G?*tkiU89`%{!jv?WCB$eD~;>a znr8>#!*_1}DEd&$!2KV?|877DPVj0_G($?YR zg@fIiFD7=A99S*v5QdikMX;Lr4G_;FilRIw=I_LOOfEelbB{>= z5!u(%lFH-1j*)soQw literal 0 HcmV?d00001 diff --git a/Base/Views/views.py b/Base/Views/views.py new file mode 100644 index 0000000..3091ba4 --- /dev/null +++ b/Base/Views/views.py @@ -0,0 +1,42 @@ +from django.shortcuts import render +from django.views.generic import TemplateView +from django.contrib.auth.mixins import LoginRequiredMixin #, PermissionRequiredMixin +from django.utils import timezone +from django.contrib.auth import views as auth_views +from Base.Metrics.Dashboard import ( + get_sum_of_professional, + get_sum_of_stone, + get_sum_of_service, + get_sum_of_professional_detail, + get_sum_payment_method_service, + get_sum_of_product +) +from Base.Metrics.DashboardAdmin import get_total_bank,get_total_prof + +def Home(request): + context = { 'ok':' Tudo ok', } + return render(request,'Home.html',context ) + +class Login(auth_views.LoginView): + template_name = 'Login/Login.html' + +class Dashboard(LoginRequiredMixin, TemplateView): + template_name = 'Login/Dashboard/index.html' + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + Day = timezone.localtime(timezone.now()) + context['Professional'] = get_sum_of_professional.metric(Day) + context['Stone'] = get_sum_of_stone.metric(Day) + context['Service'] = get_sum_of_service.metric(Day) + context['Sum_of_professional_detail'] = get_sum_of_professional_detail.metric(Day) + context['Sum_payment_method_service'] = get_sum_payment_method_service.metric(Day) + context['Sum_of_product'] = get_sum_of_product.metric(Day) + return context + +class DashboardAdmin(LoginRequiredMixin, TemplateView): + template_name = 'Login/DashboardAdmin/index.html' + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['total_bank'] = get_total_bank.metric() + context['total_prof'] = get_total_prof.metric() + return context \ No newline at end of file diff --git a/Base/Views/viewsBankAccounts.py b/Base/Views/viewsBankAccounts.py new file mode 100644 index 0000000..db506bd --- /dev/null +++ b/Base/Views/viewsBankAccounts.py @@ -0,0 +1,57 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Base.Forms import FormsBankAccounts +from Base import models +from django.urls import reverse_lazy +from django.contrib import messages + +class BankAccountsListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.BankAccount + template_name = 'BankAccounts/List.html' + context_object_name = 'BankAccounts' + paginate_by = 10 + permission_required = 'Base.view_bankaccount' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class BankAccountsCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.BankAccount + template_name = 'BankAccounts/Create.html' + form_class = FormsBankAccounts.FormsBankAccount + success_url = reverse_lazy('BankAccountsListView') + permission_required = 'Base.add_bankaccount' + + def get_form(self, form_class=None): + form = super().get_form(form_class) + return form + + def form_valid(self, form): + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) + +class BankAccountsDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.BankAccount + template_name = 'BankAccounts/Detail.html' + permission_required = 'Base.view_bankaccount' + +class BankAccountsUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.BankAccount + template_name = 'BankAccounts/Update.html' + form_class = FormsBankAccounts.FormsBankAccount + success_url = reverse_lazy('BankAccountsListView') + permission_required = 'Base.change_bankaccount' + +class BankAccountsDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.BankAccount + template_name = 'BankAccounts/Delete.html' + success_url = reverse_lazy('BankAccountsListView') + permission_required = 'Base.delete_bankaccount' \ No newline at end of file diff --git a/Base/Views/viewsChartOfAccount.py b/Base/Views/viewsChartOfAccount.py new file mode 100644 index 0000000..2f0e51c --- /dev/null +++ b/Base/Views/viewsChartOfAccount.py @@ -0,0 +1,43 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Base.Forms import FormsChartOfAccount +from Base import models +from django.urls import reverse_lazy + +class ChartOfAccountListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.ChartOfAccount + template_name = 'ChartOfAccount/List.html' + context_object_name = 'ChartOfAccount' + paginate_by = 10 + permission_required = 'Base.view_' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class ChartOfAccountCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.ChartOfAccount + template_name = 'ChartOfAccount/Create.html' + form_class = FormsChartOfAccount.FormsChartOfAccount + success_url = reverse_lazy('ChartOfAccountListView') + permission_required = 'Base.add_' + +class ChartOfAccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.ChartOfAccount + template_name = 'ChartOfAccount/Detail.html' + permission_required = 'Base.view_' + +class ChartOfAccountUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.ChartOfAccount + template_name = 'ChartOfAccount/Update.html' + form_class = FormsChartOfAccount.FormsChartOfAccount + success_url = reverse_lazy('ChartOfAccountListView') + permission_required = 'Base.change_' + +class ChartOfAccountDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.ChartOfAccount + template_name = 'ChartOfAccount/Delete.html' + success_url = reverse_lazy('ChartOfAccountListView') + permission_required = 'Base.delete_' \ No newline at end of file diff --git a/Base/Views/viewsPayMethod.py b/Base/Views/viewsPayMethod.py new file mode 100644 index 0000000..79956ad --- /dev/null +++ b/Base/Views/viewsPayMethod.py @@ -0,0 +1,43 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Base.Forms import FormsPayMethod +from Base import models +from django.urls import reverse_lazy + +class PayMethodListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.PayMethod + template_name = 'PayMethod/List.html' + context_object_name = 'PayMethod' + paginate_by = 10 + permission_required = 'Base.view_' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class PayMethodCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.PayMethod + template_name = 'PayMethod/Create.html' + form_class = FormsPayMethod.FormsPayMethod + success_url = reverse_lazy('PayMethodListView') + permission_required = 'Base.add_' + +class PayMethodDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.PayMethod + template_name = 'PayMethod/Detail.html' + permission_required = 'Base.view_' + +class PayMethodUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.PayMethod + template_name = 'PayMethod/Update.html' + form_class = FormsPayMethod.FormsPayMethod + success_url = reverse_lazy('PayMethodListView') + permission_required = 'Base.change_' + +class PayMethodDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.PayMethod + template_name = 'PayMethod/Delete.html' + success_url = reverse_lazy('PayMethodListView') + permission_required = 'Base.delete_' \ No newline at end of file diff --git a/Base/Views/viewsProductList.py b/Base/Views/viewsProductList.py new file mode 100644 index 0000000..e107676 --- /dev/null +++ b/Base/Views/viewsProductList.py @@ -0,0 +1,43 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Base.Forms import FormsProductList +from Base import models +from django.urls import reverse_lazy + +class ProductListListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.ProductList + template_name = 'ProductList/List.html' + context_object_name = 'ProductList' + paginate_by = 10 + permission_required = 'Base.view_' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class ProductListCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.ProductList + template_name = 'ProductList/Create.html' + form_class = FormsProductList.FormsProductList + success_url = reverse_lazy('ProductListListView') + permission_required = 'Base.add_' + +class ProductListDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.ProductList + template_name = 'ProductList/Detail.html' + permission_required = 'Base.view_' + +class ProductListUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.ProductList + template_name = 'ProductList/Update.html' + form_class = FormsProductList.FormsProductList + success_url = reverse_lazy('ProductListListView') + permission_required = 'Base.change_' + +class ProductListDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.ProductList + template_name = 'ProductList/Delete.html' + success_url = reverse_lazy('ProductListListView') + permission_required = 'Base.delete_' \ No newline at end of file diff --git a/Base/Views/viewsProfessional.py b/Base/Views/viewsProfessional.py new file mode 100644 index 0000000..15a4e44 --- /dev/null +++ b/Base/Views/viewsProfessional.py @@ -0,0 +1,43 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin +from Base.Forms import FormsProfessional +from Base import models +from django.urls import reverse_lazy + +class ProfessionalListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Professional + template_name = 'Professional/List.html' + context_object_name = 'Professionals' + paginate_by = 10 + permission_required = 'Base.view_professional' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class ProfessionalCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): + model = models.Professional + template_name = 'Professional/Create.html' + form_class = FormsProfessional.FormsProfessional + success_url = reverse_lazy('ProfessionalListView') + permission_required = 'Base.add_professional' + +class ProfessionalDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView): + model = models.Professional + template_name = 'Professional/Detail.html' + permission_required = 'Base.view_professional' + +class ProfessionalUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView): + model = models.Professional + template_name = 'Professional/Update.html' + form_class = FormsProfessional.FormsProfessional + success_url = reverse_lazy('ProfessionalListView') + permission_required = 'Base.change_professional' + +class ProfessionalDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView): + model = models.Professional + template_name = 'Professional/Delete.html' + success_url = reverse_lazy('ProfessionalListView') + permission_required = 'Base.delete_professional' \ No newline at end of file diff --git a/Base/Views/viewsServiceList.py b/Base/Views/viewsServiceList.py new file mode 100644 index 0000000..5a39dfe --- /dev/null +++ b/Base/Views/viewsServiceList.py @@ -0,0 +1,43 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Base.Forms import FormsServiceList +from Base import models +from django.urls import reverse_lazy + +class ServiceListListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.ServiceList + template_name = 'ServiceList/List.html' + context_object_name = 'ServiceList' + paginate_by = 10 + permission_required = 'Base.view_' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + if name: + queryset = queryset.filter(name__icontains=name) + return queryset + +class ServiceListCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.ServiceList + template_name = 'ServiceList/Create.html' + form_class = FormsServiceList.FormsServiceList + success_url = reverse_lazy('ServiceListListView') + permission_required = 'Base.add_' + +class ServiceListDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.ServiceList + template_name = 'ServiceList/Detail.html' + permission_required = 'Base.view_' + +class ServiceListUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.ServiceList + template_name = 'ServiceList/Update.html' + form_class = FormsServiceList.FormsServiceList + success_url = reverse_lazy('ServiceListListView') + permission_required = 'Base.change_' + +class ServiceListDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.ServiceList + template_name = 'ServiceList/Delete.html' + success_url = reverse_lazy('ServiceListListView') + permission_required = 'Base.delete_' \ No newline at end of file diff --git a/Base/__pycache__/__init__.cpython-312.pyc b/Base/__pycache__/__init__.cpython-312.pyc index 16f54111018c0d47b5a28ff32302fddfec81eaa2..bfac4a0f57563cf4635d3e2c79ca213dc9b69845 100644 GIT binary patch delta 37 rcmbQvIF*t6G%qg~0}vD(d_9rdn9*dSy%eW&YF3nu^o diff --git a/Base/__pycache__/__init__.cpython-313.pyc b/Base/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 702fb603418a724e521c903f8f78088a7331bc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmey&%ge<81U<&DGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iNepzCXetCJh zeoAUuVrfo^zEfgxs(yTYW?p7Ve7s&krvJvA%0N@1+cmMzZ diff --git a/Base/__pycache__/apps.cpython-313.pyc b/Base/__pycache__/apps.cpython-313.pyc deleted file mode 100644 index 566934300cf75f926d52ebed361d91003c4064d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmXv~ze~eF6u!%kT3d^@{=kX_br7;7g9r{Hw2Fg5ms<u zunUd=()Iw-d+=1xbyV{W%bcsif?~CuB$shC4E#Y(=NT47wlBdH^Z!K`CE3@GDa5P4B7>4xhKNg8rYq^0B*o=PmXF=m|bV1Nnd zH0Y7&-72YM6&J>LIc9B3c4DZOt2T`-D@|4_4x}_zH06z7-S^k%lh(eFCJf|L%%UDT44f{3s*7zL-<%A(sO~hsQ6edHB@vx*Iv>l`iguoeJC1G8#1wIHtp>|MoI6rk3zh`h zYOLidYr%4WR;S%^wWL1chMJSrWp*BV@oYCuVAK_7+W=ls%xvEcP>N18Zb4V@cR0L!)qY4G)Ot!hY8~FJy+x#ZG|; z1>0EwKX7ST7Yg)MOTC#&=~PQj#i>p#H&_yXMlJs&3_c7vwTpel8H{SCQVJEPAZrVGTLxZ_MCorCa0Q3C=D-ZYl z16lvT=82qtba`q&FuZzlFEE@948OjX3tV6Rw5nv&%muDt$sp8n}rx>9u zo?NKMBl-&)1#t$RycY!EvHQ&G^=gNTm281(0f&xH{yK}u}VCXNFCmIFPh(?#XYX(~^?FAL1 z2gEXR!20;w_-fxvZKM0!o>x6D|FGLWx+{-zY&W9>@2y7~*ufx1=5xA6a>tz(z7zQr}Si%o(%(hTNz)T z+z$+)Cl6%6?{D_=l6U)Szph-tnQz9Z@=@@ z`smu|zCZA?yWn*x?&ZlJRMFM@5Af;Uyd=7=*p7`h#Na6>90I1i38I3n=8oN31m-cg z6v^yukqe?*#nolv0cZ1OH%z}YZJa8E8Zj1M zG=aF9!|_A>6~zEN2HIE)N0w850$}VMTs^~BV<~qlh?_i*)fae|QFM+N^a zM`+18aJdxz+2`14W58CAp$J$+*?+|R*v7SQZ@jv((ZAb%WmmStUWk2$4c7(bFqWY} z#y@62UbUGKTW<`=@1W-Rn6bqJZ{=9rbO%kG5V|WYYu_pG8;vr1Dg@XxqGr57pVfxD zCiDJ$F?zEh7#1hcFvD&9e?yyHwN17J*jeZc8Tv55wivvRV$PFw<`uCxiM?0IGw45p zJWqqZWGngun-g<mFXiQaV$9CPQ@9N-nNxH=J2m>IuVC$4rgKoh_xpVR#bX{P z5kB6!uxQB>_O0D7SOR`S)--+(;(Mnkif@G8H^Rj?!n*~xM?AGM_SM9TiGl#xLbqSM zvO2atu?F9eEeyED)2rv#FRfiF2#_swdMe+LEp&UttEGC#7P@7qf4DxoHd_!NTR5pg Qd+v30P5qYuSsqUR4Nd=g)Bpeg literal 192 zcmX@j%ge<81maPzGHihKV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)ci7Wwu%WYPAw{q2~RCcEh@>+i*ZRU z&MwI>fD8B+rN=lW7N^EQ4AU#9yv1PyWS8co+7)pC4PgZ0Vi4m4Gb1D8JqDQ~HXsK8 DQKB$V diff --git a/Base/__pycache__/models.cpython-313.pyc b/Base/__pycache__/models.cpython-313.pyc deleted file mode 100644 index b9bbded460023a1eccf86aded9482693d631b479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmey&%ge<81U<&DGAx1gV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)ZCKSFH0=aFE20GPf1NnEX^s=cSII?Zy@) zB*Ih{{s2@4#{LgXRw7xP)QJhEqKbuyyEMj9hu+}#?!E8c_xW_+8Vv)8b?4o$?k5Pq z54kB;ZB9;Z2xlLJAcPT!p$DPlN~FZ9hvr-pT!laZ7=|iV`}HEE#1MVa4%E~AtgeDl zf1&gX*1uS=5)bAyte(lJiHyavu3+b8=w~tvF|S>mEb-h7v&`rq&)ls$ji2(U134N5 zX;+}O)5EVA2OK>hF_uOW#CWd~kxnmhxi-VSssJ)fT`qM&xE=GRV8jJ1H_){N7NH1$Vvf~R6SUJcl+ ziW@=`-K9uPS!9Yf;zv?U6ZRRL2nqbXy}s&iGEABO4DVo?lEmM@Y&#``|H2d6@nt_> zPT3ml^4i^)gu@8mqnAa5cu0V~7N27kLU;tOAAyxWiUO723qaFHi=)l=-dpeE%PG3~ z9o0rx#;dutlvzu;m axtukZCr$V3_7trho0SX785Z7C8@b~lk-goa=@~l=f5S)##zk3sm&`u7_oiFo~&3hUmouq?R?ow$-N(>GQKf+m|3f-wVGKpwdmAp zo|aScSXwtHt;}{(+sW)^YB#6$`sw|YJdxI|iT^n~3A6fIT3?&i>GyXj**Z5%SCo$? IzXrqq0fQc-l>h($ diff --git a/Base/__pycache__/views.cpython-312.pyc b/Base/__pycache__/views.cpython-312.pyc deleted file mode 100644 index 2801d2986b6b83aae468e167f617566353268ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmX|7F>4e-6rS1LySz^iYUk;ZUn0Yu~0z^jS!>4vdww>*c)$W=JIAXCLux! z3(Is`+6I4$jbIZ-ud>ogxGt4%HfJ8poA15%&71GNuf5&{Ms_;>Gx`xQ_R9zVjpD{; z>vVl&1uJ;PB+oeaIH&>{W?_TFDw3_N)!?XV%Q%Y(x8Ad?v)4}I-@eT;cWne!04CgZ zw?Iy+frXa>-co$|i7tiOgzZ`&6i>yjP?YUhAz@!D81hEQnQPG%(wSW+N3wXq1%Jow zIp=`H9q=!nL-w2{;f4$Jcz@xsmXMCDtkBnzz{N;Eg0U_hYGq;98b9;O%ITd4>-h@< zX!2LE18B9%AA%WMJvmQ2!!o}=Fp%%i2qvBExybj&9(C|LHOu4<*~wD>XzPPIeDrhi z($S4iH$Ru(7gxVUt23&yjbykQr)TtS1w8PpOjHu%J^YmHw5)_~qqMzL@&r4o2 zir49&wxd+~of&LQ0(*!B4h8g6^3TcJc z1X)rMo0S0+)#QN#ifXS4`w~k~K@(Ao0d&m9P|%(+H+VZ9ILn!y<1n^N9T3WWUE;h?0C)Rdx!Cg zdn^4fxs5d8_FVI`pm=_}dfHX_ey!uC*;q$mC>%!a#oFn#hFYe0>F#7QDd!~(F#?!F z%=MYD9eMe@CUZ#z@)`uFC8r2kUMX;QVF9^Ss0h3$Jb=i%36+GbLQdkd5ZTFdZyY1W z$Dt?7-{(XqrL{Y#1wb{a2sv^f;?vQQ5b>f|JuiyLB`W~?lhR?Ef)8&Bu_*zHKt)d3 z)K`&j`VOyXH&a!Vdw^&;089uPUdIVwiqDH0vZn+kiyV@yK^3(uD>BF@wWy$K$g#dP#QG*$AfyEi+pa=oQ%FM7*1gOZ7NK@W2FR0xN)k#M zpN5L*i`)Z{Jwaj#V6`lsvs4ME5ByWS3P;H-Z_yjJA-61X_%Z-BOq~Kn!mULeqshpN zF{hxaVv=|<%qRikp3O_by*xy$TF5435!v&YedMoKUB_R-4&^jfSICxCNX;n2=|@4tY2Z-$(Ky#A7eV-OKYL$r_fNf+T1-uL`*cpmz0BK9}PYSP{S+lmL{H z1;vcGb#i@efm>glUEvmQ&df%U_mze~sGl~AW|7=_6jG4LJ0+wiaXHPA#3DCIXLYy+ z?`zi3J0;5^W6?gZg`V`f{9*rN%#oxNtRDiqAmxt|sT=(>QlfS%zwyWG#Mh zeT$Ecja}rb)Qsi|iW7S>A1*vlU6`y#)C*tR!}$tJxre^=lwIcy*ZHqq<)LfF(6ygk zlNB4&&OVG*Je0eSO!peD-rYd&i@+JZGxB(|+!--CBTwzm2lW`IOG>Fz)&1ITpi>Wq zw>rwfun`RJtdxQu=>ALCOz$6i!j}8TjQ+75?b%?de_r=5RGjv9U&TuWy0V4x|o8`W7qi_7#fWCaI)VHGhR}Uk`OlgFqG-3oJ zI~(8K{`PixV%C_LEl(^N6HDcZ4P#)p1?P1C{BGdTXo7n8@Yeg~?qQ>Qc;_BA=(Y^-20Dlam*VrepRWIKy&R1j z(ReuujVLTfB_k?T!@;k0<`d>G^2#!QST7QzWX32r#8}&8W`Lj3H|RF@i;tA~T5AZq zP|)gAqaZPA{r?-SH7n&BR>Mc4*~dncvXrvgs{56N*@4a0X?2@9;@5P(Kuld%tq%U7 t62&6>P{wB#AY&>+I)f&o-%5reCLr%KNa~i3epzCXetCJh zeoAUuVrfo^zEfgxs(x-}dQoCYW`16=etdjpUS>&ryk0@&Ee@O9{FKt1RJ$Tppk|Qa Q#URE +

Cadastrar Banco

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/Base/templates/BankAccounts/Delete.html b/Base/templates/BankAccounts/Delete.html new file mode 100644 index 0000000..440c2d4 --- /dev/null +++ b/Base/templates/BankAccounts/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/BankAccounts/Detail.html b/Base/templates/BankAccounts/Detail.html new file mode 100644 index 0000000..d603d0b --- /dev/null +++ b/Base/templates/BankAccounts/Detail.html @@ -0,0 +1,15 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.name }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/BankAccounts/List.html b/Base/templates/BankAccounts/List.html new file mode 100644 index 0000000..f3e2da6 --- /dev/null +++ b/Base/templates/BankAccounts/List.html @@ -0,0 +1,62 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Bancos


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + +{# #} + + + + + + + {% for Bank in BankAccounts %} + +{# #} + + + + + {% endfor %} + +
ID Nome Descrição Ações
{{ Bank.id }} {{ Bank.name }} {{ Bank.description }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/BankAccounts/Update.html b/Base/templates/BankAccounts/Update.html new file mode 100644 index 0000000..f60a1ac --- /dev/null +++ b/Base/templates/BankAccounts/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ChartOfAccount/Create.html b/Base/templates/ChartOfAccount/Create.html new file mode 100644 index 0000000..bb12196 --- /dev/null +++ b/Base/templates/ChartOfAccount/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Cadastro {% endblock %} +{% block content %} + +
+

Cadastrar

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Base/templates/ChartOfAccount/Delete.html b/Base/templates/ChartOfAccount/Delete.html new file mode 100644 index 0000000..a51ba6d --- /dev/null +++ b/Base/templates/ChartOfAccount/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/ChartOfAccount/Detail.html b/Base/templates/ChartOfAccount/Detail.html new file mode 100644 index 0000000..b76b1b6 --- /dev/null +++ b/Base/templates/ChartOfAccount/Detail.html @@ -0,0 +1,16 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes

+
+
+

{{ object.name }}

+

{{ object.value }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ChartOfAccount/List.html b/Base/templates/ChartOfAccount/List.html new file mode 100644 index 0000000..3c5e45c --- /dev/null +++ b/Base/templates/ChartOfAccount/List.html @@ -0,0 +1,68 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Plano de Contas


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + +{# #} + + + + + + + + + {% for Chart in ChartOfAccount %} + +{# #} + + + + + + + {% endfor %} + +
ID Nome Notas Debito Firma Ações
{{ Chart.id }} {{ Chart.name }} {{ Chart.notes }} {% if Chart.debit %} + {% else %} {% endif %} {% if Chart.firm %} + {% else %} {% endif %} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/ChartOfAccount/Update.html b/Base/templates/ChartOfAccount/Update.html new file mode 100644 index 0000000..f60a1ac --- /dev/null +++ b/Base/templates/ChartOfAccount/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/Login/Dashboard.html b/Base/templates/Login/Dashboard.html deleted file mode 100644 index 12cf799..0000000 --- a/Base/templates/Login/Dashboard.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "BaseLogin.html" %} -{% block title %} Dashboard {% endblock %} -{% block content %} - -
-
-

{{ Day }}

-
-
-
-{% endblock %} diff --git a/Base/templates/Login/Dashboard/Professional.html b/Base/templates/Login/Dashboard/Professional.html new file mode 100644 index 0000000..5dfeb9d --- /dev/null +++ b/Base/templates/Login/Dashboard/Professional.html @@ -0,0 +1,24 @@ +

Professional

+
+ + + + + + + + + {% for Prof, sum in Professional.professional.items %} + {% if sum != 0 %} + + + + + {% endif %} + {% empty %} {% endfor %} + +
BancoTotal
{{ Prof }}R$ {{ sum|floatformat:2 }}
Vazio.
+

Total : R$: {{ Professional.sum_all_prof|floatformat:2 }}

+
+ +
diff --git a/Base/templates/Login/Dashboard/Service.html b/Base/templates/Login/Dashboard/Service.html new file mode 100644 index 0000000..80588f3 --- /dev/null +++ b/Base/templates/Login/Dashboard/Service.html @@ -0,0 +1,24 @@ +

Serviço

+
+ + + + + + + + + {% for Prod, sum in Service.Service.items %} + {% if sum != 0 %} + + + + + {% endif %} + {% empty %} {% endfor %} + +
ProdutosTotal
{{ Prod }}R$ {{ sum|floatformat:2 }}
Vazio.
+

Total R$: {{ Service.sum|floatformat:2 }}

+
+ +
\ No newline at end of file diff --git a/Base/templates/Login/Dashboard/Stone.html b/Base/templates/Login/Dashboard/Stone.html new file mode 100644 index 0000000..c867012 --- /dev/null +++ b/Base/templates/Login/Dashboard/Stone.html @@ -0,0 +1,23 @@ +

Estoque

+
+ + + + + + + + + {% for Prod, sum in Stone.Stone.items %} + {% if sum != 0 %} + + + + + {% endif %} + {% empty %} {% endfor %} + +
ProdutosTotal
{{ Prod }}{{ sum|floatformat:0 }}
Vazio.
+
+ +
\ No newline at end of file diff --git a/Base/templates/Login/Dashboard/Sum_of_product.html b/Base/templates/Login/Dashboard/Sum_of_product.html new file mode 100644 index 0000000..8cf8654 --- /dev/null +++ b/Base/templates/Login/Dashboard/Sum_of_product.html @@ -0,0 +1,22 @@ +

Produtos

+ + + + + + + + + + {% for name, value in Sum_of_product.product_report.items %} + {% if value.product_item != 0 %} + + + + + + {% endif %} + {% empty %} {% endfor %} + +
ProdutoTotalQuant.
{{ name }}R$ {{ value.product_item|floatformat:2 }}{{ value.product_cont }}
Vazio.
+

Total da Venda : R$: {{ Sum_of_product.sum_of_product|floatformat:2 }}

\ No newline at end of file diff --git a/Base/templates/Login/Dashboard/Sum_of_professional_detail.html b/Base/templates/Login/Dashboard/Sum_of_professional_detail.html new file mode 100644 index 0000000..f9a1d5a --- /dev/null +++ b/Base/templates/Login/Dashboard/Sum_of_professional_detail.html @@ -0,0 +1,27 @@ +

Relatório de Profissionais

+ + + + + + + + + + + {% for professional, services in Sum_of_professional_detail.professionals_report.items %} + {% for service, value in services.items %} + {% if value.servSum != 0 %} + + + + + + + {% endif %} + {% endfor %} + {% endfor %} + +
ProfissionalServiçoValor BrutoQuant.
{{ professional }}{{ service }}R$ {{ value.servSum|floatformat:2 }}{{ value.servCont }}
+

Total de Hoje : R$: {{ Sum_of_professional_detail.sum_of_prof|floatformat:2 }}

+
\ No newline at end of file diff --git a/Base/templates/Login/Dashboard/Sum_payment_method_service.html b/Base/templates/Login/Dashboard/Sum_payment_method_service.html new file mode 100644 index 0000000..afd3322 --- /dev/null +++ b/Base/templates/Login/Dashboard/Sum_payment_method_service.html @@ -0,0 +1,20 @@ +

Pagamentos

+ + + + + + + + + {% for name, value in Sum_payment_method_service.bank_balance.items %} + {% if value != 0 %} + + + + + {% endif %} + {% empty %} {% endfor %} + +
BancoTotal
{{ name }}R$ {{ value|floatformat:2 }}
Vazio
+

Total : R$: {{ Sum_payment_method_service.sum_of_bank|floatformat:2 }}

diff --git a/Base/templates/Login/Dashboard/index.html b/Base/templates/Login/Dashboard/index.html new file mode 100644 index 0000000..a4429cf --- /dev/null +++ b/Base/templates/Login/Dashboard/index.html @@ -0,0 +1,28 @@ +{% extends "BaseLogin.html" %} +{% block title %} Dashboard {% endblock %} +{% block content %} + +
+
{% include 'Login/Dashboard/Sum_of_professional_detail.html' %}
+
+
{% include 'Login/Dashboard/Stone.html' %}
+
+
+
+
+
{% include 'Login/Dashboard/Sum_payment_method_service.html' %}
+
+
+
{% include 'Login/Dashboard/Professional.html' %}
+
+
+
{% include 'Login/Dashboard/Sum_of_product.html' %}
+
+
+
{% include 'Login/Dashboard/Service.html' %}
+
+
+
+ + +{% endblock %} diff --git a/Base/templates/Login/DashboardAdmin/index.html b/Base/templates/Login/DashboardAdmin/index.html new file mode 100644 index 0000000..8505e14 --- /dev/null +++ b/Base/templates/Login/DashboardAdmin/index.html @@ -0,0 +1,25 @@ +{% extends "BaseLogin.html" %} +{% block title %} Dashboard Admin {% endblock %} +{% block content %} + + +
+
+
{% include 'Login/DashboardAdmin/total_banck.html' %}
+
{% include 'Login/DashboardAdmin/total_prof_month.html' %}
+{#
#} +{#
#} +
+{% endblock %} diff --git a/Base/templates/Login/DashboardAdmin/total_banck.html b/Base/templates/Login/DashboardAdmin/total_banck.html new file mode 100644 index 0000000..dea01ab --- /dev/null +++ b/Base/templates/Login/DashboardAdmin/total_banck.html @@ -0,0 +1,21 @@ +

Bancos

+ + + + + + + + + {% for name, value in total_bank.items %} + + + + + {% empty %} + + + + {% endfor %} + +
BancoTotal
{{ name }}R$ {{ value|floatformat:2 }}
Vazio.
\ No newline at end of file diff --git a/Base/templates/Login/DashboardAdmin/total_prof_month.html b/Base/templates/Login/DashboardAdmin/total_prof_month.html new file mode 100644 index 0000000..9e0eeb9 --- /dev/null +++ b/Base/templates/Login/DashboardAdmin/total_prof_month.html @@ -0,0 +1,21 @@ +

Prof.

+ + + + + + + + + {% for name, value in total_prof.items %} + + + + + {% empty %} + + + + {% endfor %} + +
Prof.Total
{{ name }}R$ {{ value|floatformat:2 }}
Vazio.
\ No newline at end of file diff --git a/Templates/registration/login.html b/Base/templates/Login/Login.html similarity index 95% rename from Templates/registration/login.html rename to Base/templates/Login/Login.html index 339d5b0..f7cde6c 100644 --- a/Templates/registration/login.html +++ b/Base/templates/Login/Login.html @@ -11,7 +11,7 @@
{% csrf_token %}
- +
diff --git a/Base/templates/PayMethod/Create.html b/Base/templates/PayMethod/Create.html new file mode 100644 index 0000000..bb12196 --- /dev/null +++ b/Base/templates/PayMethod/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Cadastro {% endblock %} +{% block content %} + +
+

Cadastrar

+
+
+ + {% csrf_token %} + {{ form.as_p }} + + + Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Base/templates/PayMethod/Delete.html b/Base/templates/PayMethod/Delete.html new file mode 100644 index 0000000..a51ba6d --- /dev/null +++ b/Base/templates/PayMethod/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/PayMethod/Detail.html b/Base/templates/PayMethod/Detail.html new file mode 100644 index 0000000..b76b1b6 --- /dev/null +++ b/Base/templates/PayMethod/Detail.html @@ -0,0 +1,16 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes

+
+
+

{{ object.name }}

+

{{ object.value }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/PayMethod/List.html b/Base/templates/PayMethod/List.html new file mode 100644 index 0000000..b0a92a3 --- /dev/null +++ b/Base/templates/PayMethod/List.html @@ -0,0 +1,66 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Serviços


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + +{# #} + + + + + + + + + {% for Payment in PayMethod %} + +{# #} + + + + + + + {% endfor %} + +
ID Nome Banco Percentual Descrição Ações
{{ Payment.id }} {{ Payment.name }} {{ Payment.bank }} {{ Payment.percentage }} {{ Payment.description }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/PayMethod/Update.html b/Base/templates/PayMethod/Update.html new file mode 100644 index 0000000..f60a1ac --- /dev/null +++ b/Base/templates/PayMethod/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ProductList/Create.html b/Base/templates/ProductList/Create.html new file mode 100644 index 0000000..b9f0fe0 --- /dev/null +++ b/Base/templates/ProductList/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Cadastro {% endblock %} +{% block content %} + +
+

Cadastrar

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Base/templates/ProductList/Delete.html b/Base/templates/ProductList/Delete.html new file mode 100644 index 0000000..3852938 --- /dev/null +++ b/Base/templates/ProductList/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Deletar {% endblock %} +{% block content %} +
+

Deletar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/ProductList/Detail.html b/Base/templates/ProductList/Detail.html new file mode 100644 index 0000000..d211d07 --- /dev/null +++ b/Base/templates/ProductList/Detail.html @@ -0,0 +1,16 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes

+
+
+

{{ object.name }}

+

{{ object.value }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ProductList/List.html b/Base/templates/ProductList/List.html new file mode 100644 index 0000000..fa132c6 --- /dev/null +++ b/Base/templates/ProductList/List.html @@ -0,0 +1,64 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Produtos


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + +{# #} + + + + + + + + {% for Serv in ProductList %} + +{# #} + + + + + + {% endfor %} + +
ID Nome Valor Descrição Ações
{{ Serv.id }} {{ Serv.name }} {{ Serv.value }} {{ Serv.description }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/ProductList/Update.html b/Base/templates/ProductList/Update.html new file mode 100644 index 0000000..6bdda5a --- /dev/null +++ b/Base/templates/ProductList/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Editar {% endblock %} +{% block content %} +
+

Editar

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/Professional/Create.html b/Base/templates/Professional/Create.html new file mode 100644 index 0000000..5ced28a --- /dev/null +++ b/Base/templates/Professional/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} + +
+

Cadastrar Banco

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Base/templates/Professional/Delete.html b/Base/templates/Professional/Delete.html new file mode 100644 index 0000000..83943d8 --- /dev/null +++ b/Base/templates/Professional/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/Professional/Detail.html b/Base/templates/Professional/Detail.html new file mode 100644 index 0000000..6b4aa78 --- /dev/null +++ b/Base/templates/Professional/Detail.html @@ -0,0 +1,15 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.name }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/Professional/List.html b/Base/templates/Professional/List.html new file mode 100644 index 0000000..a56bb86 --- /dev/null +++ b/Base/templates/Professional/List.html @@ -0,0 +1,62 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Profissinais


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + + + + + + + + + {% for Prof in Professionals %} + + + + + + + {% endfor %} + +
Simbolo Nome Porcentagem Ações
{{ Prof.symbol }} {{ Prof.name }} {{ Prof.percentage }} % + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/Professional/Update.html b/Base/templates/Professional/Update.html new file mode 100644 index 0000000..e14cab8 --- /dev/null +++ b/Base/templates/Professional/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ServiceList/Create.html b/Base/templates/ServiceList/Create.html new file mode 100644 index 0000000..bb12196 --- /dev/null +++ b/Base/templates/ServiceList/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Cadastro {% endblock %} +{% block content %} + +
+

Cadastrar

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Base/templates/ServiceList/Delete.html b/Base/templates/ServiceList/Delete.html new file mode 100644 index 0000000..a51ba6d --- /dev/null +++ b/Base/templates/ServiceList/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Base/templates/ServiceList/Detail.html b/Base/templates/ServiceList/Detail.html new file mode 100644 index 0000000..b76b1b6 --- /dev/null +++ b/Base/templates/ServiceList/Detail.html @@ -0,0 +1,16 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes

+
+
+

{{ object.name }}

+

{{ object.value }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Base/templates/ServiceList/List.html b/Base/templates/ServiceList/List.html new file mode 100644 index 0000000..ce20387 --- /dev/null +++ b/Base/templates/ServiceList/List.html @@ -0,0 +1,64 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Serviços


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + +{# #} + + + + + + + + {% for Serv in ServiceList %} + +{# #} + + + + + + {% endfor %} + +
ID Nome Valor Descrição Ações
{{ Serv.id }} {{ Serv.name }} {{ Serv.value }} {{ Serv.description }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Base/templates/ServiceList/Update.html b/Base/templates/ServiceList/Update.html new file mode 100644 index 0000000..f60a1ac --- /dev/null +++ b/Base/templates/ServiceList/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Base/views/__pycache__/views.cpython-312.pyc b/Base/views/__pycache__/views.cpython-312.pyc index a2ff4f7f8468a2fd3435b8c534867cfbdc1507a6..e2808d277f7d075dee3fb85a1594a0cf9dd5e137 100644 GIT binary patch literal 2969 zcmbtWT}%{L6uvXFzp%S3|H_Z9lt{PgLbYgYZDZBerV(O_+BhMZj5`+?nAyR5XB7x0 zv>_>dXk(K$_R*#$mGENHmp=BrFKqT<%>WLr@c!7EnC4y$3ohpdPl zRilCrTQNJX)(Jjh)!PX*VJFq3ol;YFgW6!H)wJEHHVS>zYO;SpUi&z8 zHD0teXH1)B&KTv~bPBrVrE3)2g;ictt%R~WW}bS7YGk#`HG{gkX>IGL^;w%1T+OEL zgkxwtSYNv*tT&2zH!FK7+|_kl-O_I9g{j&(9+H=QHwhXBitgO#1p>jA4B3?KN$!@- zJTa7csp|3(k_`=evNJUo%UmlOP6oL6Cyq^X6RvGB+zBoaW#Bu?T`!t<3ND>-xeSU- z=HD|H-yOXUm*=CO(>s)bUq&xcKIJ;oqZi?MlwGBK^n%XmD29TM3ODDbXT1=f!P;P# zH2iockOlHI-Ev=DP4z5XUaN1s-}mFOhvVh?{?$wOOCafLK zVXa6GR!Ivm9Ey!BlBX?4zZmjuQ2o+X(N#D$dVqYjrLB9z(J|mv8E9~`n$oJrxAEXClJK$f3=E*luNk-Hp^U@>fTj`$c zVw#9CSw)Ac0KPTaSdBPfSE}D22KN*fPZnb`QRTM3^U6wKIS=tU2MV{Ls(r1!EbJTi zZLbLX=6&0TggwSpjMv^LEbK8E_GceK`*|6{8XNW!S8EX^JR)EuIug`=$H;Ejsp5vv zy#g~*+v^Z7*daJEoAAQCI8B+4TS3)ohVJSNGuDe+PF}YV0X?PQ++}eTMgWbNnP=Ea z7{-)gI9U=&3P?8Wg*dgwyvWpDosDyb72qkC^jR;iX?aWMT+=wFRtCm`UoKgg&UI`h za1ODo_C8oI{8u0^7RXvt`*(e%rngE>?>xQ%WGT9qYOAC&rBvq8fnU0Q>iYRmIW@4P zto59&^qepCod3PK-1E^=^nR)oJG|C;tkQY1)OqsBsdDET5JpR}18d#=mG0A}?$b|r zx%)j3#!In|wSnQv!1dC=_0=0U%LD3CbTxgv6g%-MaqsC$@B5|R_kYWmdoQ4IrW8B! zw4rS&B`SV7!aCsk3^9y#A?Zef@Ai^`Tk_PhG;LX810dyC4(EOEWPoKzFr|1CkQaz1 z0}DgX<#@RL83E$s3L5=STuE(3;X}hV3v-8efQyj67Gb`Gi|jxcB|sQuzX(&skS#>O z{1am@JgTu4cp&Nt+E!gnPYihMhkgZw*_*JT2m?dBVfe>`VY|qN*a_rwNHB%{sNkQC z9cg>`Wryv`-J`ICp9ivc?q+h8%wQ=qSk7QNCQ7mHwcVoaL}G8lPV5x!S(71yC`5t{ zeLF)2F+)O_Awc{LL8IYphnF@c^}@K5;}Z^Z^F^04e45u1i2WWsP74%k9jn#r2vk^? z%)FJ;i|$0u#{Ws2VSn%vfkDwVE$$;o^B!v$whONgmuun}uML}jZb;w?&uzI=;LR&> z#_QaBmB>#&m>5U#_rZ&cB*woNerL|0MmPF?`)a!9 X;gwAS+-64vrmcOCyZ#}-iKG7m^R~oi delta 700 zcmYLGOHWfl6rQ=S-aaYV6uA%(jKNE5F%d8&L`0k50&09k15KK1JCr^znJJKx8oOvB ztZXwY5~D0NEd2$pT)2U-pt-S$YgWWZbfJkew?Sv|%{Ski^PO{Mc6(1;zE57S3$XS6 z<;m(tq3Jsh?>9%MhUGd~QUx#%(n=kq9Y{vvzQp4ISaMcW-P!y-NB_W~2+YD~unap_ z08~L*sKR}*bAAAHF>VQFeyeN2%w$XBG%k!ikKUe6JR%5_#ACF9aM>&+Vu<9+=Gs5u zF3u!w83ZLZvS^cZFtS#$q&sF2VJ~y%O_P2GHPG@08V|QiwfWEP?#AeW7J55>aI*m(LeN~XNpQe*cYtle4 z=R0%yzvsH?Yjxy8RjdkWVTS2dfz2(&Er}0li7}({4(LwWql`~;KTBHYy2`O+6p`gh z8Ee_HQOIr~UA82G3M-b9-!yQBU^h#^=NQnM5>!0=6r`_|A;r%qS*9P9$n};s_$Is? zKGs5qTIg7tIMgPNwb?^$_DGxCb~Kcou2$awBl3=~)fL?KVLpVe(6D&z2@W!Dd6UUh z!5}1s3Wa1+hj@^?^H05r?V7wA=D<@)4})KI&OD-o~-VP2|vHc3LM*TBTiVEt1ibrd8Uh+9eZAlXlvBc2a^GR;11c`+eW{`@Z-6 zea}C)w0J1|{P>51Z+B7D?}Vs5j_P9nHeP&90SeFpm7?*N5tzI!WupntCfM_ilq2s< zIcbWaW+`BQOaTXUthd$-9e#Ih);iU+O-G%t2(b{QkxPN9%8NNA${sIDrpKVm0dLDQoY1L%|uFboCl>t;mtDij5s4ZWc)RE|lxOwG2VT7&{N zV8=4g`k4kY8qmN2oW-VH>zx)|{|1htd$+nH#(7L!cRj*d1G?B;hx7gi zuB8swYT|ku*gIA9)#3cd;@Xbj-ZOE52KL&)>EfAP#**MjI!xr-BknvQuIq%j?i1pA zPKfI@aeWOU#&s^9t&2EdBEyZ4ux-8nP5yd&1KwZ*UhGXC2sZBCVqaa?g^u&+9sPN~ zfj?nzt{ACJGOqvmE!ISOl%2xT&#uSnbB z7+V3%V1EU+AaEI|Sn7b!@v4GO0cmqpfb4xq-Vh`XAa@pGA6B`{2J+^W96QS9B~e{d zEb2;)Y9X@Wks9d`B^8qM+p#Ke;s&ydn}To{?&|hK|M|fTc2$WgwKPWUGMN?RmP8hx z^H9YJl%Zhez)T>cO2}J~r7Tnwd?Db)j{Sb!pcVrE+=mmoSdxx93pUA{AOo1MQkJu`>AuMs>hQFFp< zwRv&@%H$?S-YGseiJLG<9K)0(36K*ls%07{ZHdoAi*zT}IJt_Own|?WEWrn=we%z< z8S**tChlM-Sm(r?gcz`jTxKP3wvp@3%o4k>JU54$7H{8Lnn^4nk5quw%lTVsAA3dp zGn4ory^JS7Nq-7)_p6eao`%YXDizWRJVQ`kgi6|~TKe#6PuI^|ys#}dVO!=4|AkNr z#NGRtdfD3cXtv^{+@U?!z*io_HK4l&zHu3Y6Z+u9FRsao!`AM6G*|Ib?jR8dbXQ={ z-}TaeTI+~C*)lp}dPl5ee-Y7AtR~9k4n^~+7@+mUcdi&calI%0Y_r@muKBL+`Oj*> z(VZ zDCz-ylfj=w<}>DR@>yg4v_1zE)yET&f1NRX8X=yJ=%JC)%J+A_yK9Wk>*Mpr_=-Nh zVvOI@$M0dRNKX-!Sti9`{qX0eej4lJD*TWBR6_pt)=EF+@7YOz^P$!|Ri|v^eff(8#Q>~4Aagh9>W*WeUZN?Oqe$Q E1^Z~-YybcN literal 0 HcmV?d00001 diff --git a/Client/migrations/__pycache__/__init__.cpython-312.pyc b/Client/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1a4d9bd5118edb1581bc0c6a6be79e8d34d5ba2 GIT binary patch literal 162 zcmX@j%ge<81UV}|Wq|0%AOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd<>+h`6Iz^FR2&nY zT9#T=lAjmjl3JWyl3x(xoSIjXS`?649OImm31r9QW~LV +

Cadastrar

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ + + +{% endblock %} + diff --git a/Client/templates/Client/Delete.html b/Client/templates/Client/Delete.html new file mode 100644 index 0000000..ca92a4a --- /dev/null +++ b/Client/templates/Client/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+

{{ object.first_name }} {{ object.last_name }}

+
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Client/templates/Client/Detail.html b/Client/templates/Client/Detail.html new file mode 100644 index 0000000..111a70f --- /dev/null +++ b/Client/templates/Client/Detail.html @@ -0,0 +1,45 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.first_name }} {{ object.last_name }}


+

Tel.: {{ object.phone }}

+

Prof. de Preferencia : {{ object.professional }}

+

Tempo Duplo : {{ object.double_workload }}

+

Nota: {{ object.notes }}

+
+ +

Ultimas visitas

+
+ + + + + + + + + + {% for client in clients %} + + + + + + {% empty %} + + + + {% endfor %} + +
Dia HorarioProfissinal
{{ client.date|date:"d/m/Y" }}{{ client.time }} {{ client.professional }}
Nada
+
+ Editar +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Client/templates/Client/List.html b/Client/templates/Client/List.html new file mode 100644 index 0000000..d5c1e9b --- /dev/null +++ b/Client/templates/Client/List.html @@ -0,0 +1,115 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Clientes


+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+{#
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + + + + + + + + + + + + + + + {% for Client in Clients %} + + + + + + + + + + + + + {% endfor %} + +
Marcar Nome Sobrenome Telefone Profissinal T. D. FeedBack Notas Produto Ações
+
+ + +
+
{{ Client.first_name }} {{ Client.last_name }} {{ Client.phone }} {{ Client.professional.symbol }} {{ Client.professional }} {% if Client.double_workload %} + {% else %} {% endif %} {% if Client.feed_back %} + {% else %} {% endif %} {{ Client.notes }} +
+ + +
+
+ + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Client/templates/Client/Update.html b/Client/templates/Client/Update.html new file mode 100644 index 0000000..9f4f270 --- /dev/null +++ b/Client/templates/Client/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Client/tests.py b/Client/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/Client/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Client/urlsClient.py b/Client/urlsClient.py new file mode 100644 index 0000000..d6814a4 --- /dev/null +++ b/Client/urlsClient.py @@ -0,0 +1,12 @@ +from django.urls import path +from Client import viewsClient + +urlpatterns = [ + # URLs de Client + path('/', viewsClient.ClientListView.as_view(), name='ClientListView'), + path('/Create', viewsClient.ClientCreateView.as_view(), name='ClientCreateView'), + path('//Detail', viewsClient.ClientDetailView.as_view(), name='ClientDetailView'), + path('//Update', viewsClient.ClientUpdateView.as_view(), name='ClientUpdateView'), + path('//Delete', viewsClient.ClientDeleteView.as_view(), name='ClientDeleteView'), + +] \ No newline at end of file diff --git a/Client/viewsClient.py b/Client/viewsClient.py new file mode 100644 index 0000000..1454967 --- /dev/null +++ b/Client/viewsClient.py @@ -0,0 +1,61 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin +from Client import models, FormsClient +from Movement.models import Calendar +from django.urls import reverse_lazy +# from django.core import serializers + +class ClientListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Client + template_name = 'Client/List.html' + context_object_name = 'Clients' + # paginate_by = 5 + permission_required = 'Client.view_client' + def get_queryset(self): + queryset = super().get_queryset() + name = self.request.GET.get('name') + number = self.request.GET.get('number') + # all = self.request.GET.get('all') + if name: + queryset = queryset.filter(first_name__icontains=name) | queryset.filter(last_name__icontains=name) + elif number: + queryset = queryset.filter(phone__icontains=number) + # elif all: + # queryset = queryset.all() + else: + queryset = queryset.none() + return queryset + + +class ClientCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.Client + template_name = 'Client/Create.html' + form_class = FormsClient.FormsClient + success_url = reverse_lazy('ClientListView') + permission_required = 'Client.add_client' + + +class ClientDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.Client + template_name = 'Client/Detail.html' + permission_required = 'Client.view_client' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['clients'] = Calendar.objects.filter( + client__id=self.object.id + ).order_by('-id').distinct()[:3] + return context + +class ClientUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.Client + template_name = 'Client/Update.html' + form_class = FormsClient.FormsClient + success_url = reverse_lazy('ClientListView') + permission_required = 'Client.change_client' + +class ClientDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.Client + template_name = 'Client/Delete.html' + success_url = reverse_lazy('ClientListView') + permission_required = 'Client.delete_client' diff --git a/Movement/Forms/FormsCalendar.py b/Movement/Forms/FormsCalendar.py new file mode 100644 index 0000000..1e4f8ca --- /dev/null +++ b/Movement/Forms/FormsCalendar.py @@ -0,0 +1,42 @@ +from django import forms +from Movement import models +from django.utils import timezone + +class FormsCalendar(forms.ModelForm): + class Meta: + model = models.Calendar + fields = [ + 'client', + 'date', + 'time', + 'service', + 'pay_method', + 'professional', + 'first_time', + # 'gross_value', + # 'net_value', + # 'value_cash', + # 'prof_money', + ] + widgets = { + 'client': forms.Select({'class': 'form-select'}), + 'time': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'time', 'class': '', + 'value': timezone.localtime(timezone.now()).time() + }), + 'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'', + 'value':timezone.localtime(timezone.now()).date() + }), + 'service': forms.Select({'class': 'form-select'}), + 'pay_method': forms.Select({'class': 'form-select'}), + 'professional': forms.Select({'class': 'form-select'}), + 'first_time': forms.CheckboxInput({'class': ''}), + } + labels={ + 'client':'Cliente', + 'date':'Data', + 'time':'Hora', + 'service':'Serviço', + 'pay_method':'Pagamento', + 'professional':'Profissional', + 'first_time':'Primeira Vez', + } \ No newline at end of file diff --git a/Movement/Forms/FormsExpense.py b/Movement/Forms/FormsExpense.py new file mode 100644 index 0000000..c14045c --- /dev/null +++ b/Movement/Forms/FormsExpense.py @@ -0,0 +1,34 @@ +from django import forms +from Movement import models +from django.utils import timezone + +class FormsExpense(forms.ModelForm): + class Meta: + model = models.Expense + fields = [ + 'date', + 'chart_of_account', + 'bank', + 'firm', + 'professional', + 'gross_value', + ] + widgets = { + 'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class': '', + 'value': timezone.localtime(timezone.now()).date() + }), + 'chart_of_account': forms.Select({'class': 'form-select'}), + 'bank': forms.Select({'class': 'form-select'}), + 'firm': forms.CheckboxInput({'class': ''}), + 'professional': forms.Select({'class': 'form-select'}), + 'gross_value': forms.NumberInput(attrs={'step': 1}), + + } + labels={ + 'date':'Data', + 'chart_of_account':'Plano de contas', + 'bank':'Banco', + 'firm':'Firma', + 'gross_value':'Valor', + 'professional':'Profissional', + } \ No newline at end of file diff --git a/Movement/Forms/FormsProduct.py b/Movement/Forms/FormsProduct.py new file mode 100644 index 0000000..9132a74 --- /dev/null +++ b/Movement/Forms/FormsProduct.py @@ -0,0 +1,39 @@ +from django import forms +from Movement import models +from django.utils import timezone + +class FormsProduct(forms.ModelForm): + class Meta: + model = models.Product + fields = [ + 'client', + 'date', + 'product', + 'quantity', + 'pay_method', + 'professional', + # 'gross_value', + # 'net_value', + + ] + widgets = { + 'client': forms.Select({'class': 'form-select'}), + 'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'', + 'value':timezone.localtime(timezone.now()).date() + }), + 'product': forms.Select({'class': 'form-select'}), + 'pay_method': forms.Select({'class': 'form-select'}), + 'professional': forms.Select({'class': 'form-select'}), + 'quantity': forms.NumberInput(attrs={'step': 1}, ), + # 'gross_value': forms.NumberInput(attrs={'step': 1}), + # 'net_value': forms.NumberInput(attrs={'step': 1}), + } + labels={ + 'client':'Cliente', + 'date':'Data', + 'product':'Produto', + 'pay_method':'M. Pagamento', + 'professional':'Profissional', + 'quantity':'Quantiddade', + # 'net_value':'Valor Liquido', + } \ No newline at end of file diff --git a/Movement/Forms/FormsStock.py b/Movement/Forms/FormsStock.py new file mode 100644 index 0000000..82fbc8d --- /dev/null +++ b/Movement/Forms/FormsStock.py @@ -0,0 +1,33 @@ +from django import forms +from Movement import models +from django.utils import timezone + +class FormsStock(forms.ModelForm): + class Meta: + model = models.Stock + fields = [ + 'date', + 'product', + 'quantity', + 'gross_value', + 'bank', + 'notes', + ] + widgets = { + 'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'', + 'value':timezone.localtime(timezone.now()).date() + }), + 'product': forms.Select({'class': 'form-select'}), + 'quantity': forms.NumberInput(attrs={'step': 1}), + 'gross_value': forms.NumberInput(attrs={'step': 1}), + 'bank': forms.Select({'class': 'form-select'}), + 'notes': forms.Textarea({'class': 'form-control', 'rows': 3, }), + } + labels={ + 'date':'Data', + 'product':'Produto', + 'quantity':'Quantidade', + 'gross_value':'Valor', + 'bank':'Banco', + 'notes':'Notas', + } \ No newline at end of file diff --git a/Movement/Forms/__pycache__/FormsCalendar.cpython-312.pyc b/Movement/Forms/__pycache__/FormsCalendar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..290a989acd9d9562c1790c8b05d8243aca6a7a16 GIT binary patch literal 1833 zcmb_dO>7%Q6rTOxICg%V=FeF}P-4PD?1(F*Kj5S-s7WI#XlsnDt!I*~yY`ydby7zW z2b4pQI3y>hQl(a0aOFw_aezA)Brb`3h&56!aN?FU1*D#s*|n8K0R&P<_RM>4-h1=C zdGF2s90~;h9iM;s$Ko#%0KYP(H7M_mqYvm(0T4jW0(maQag63IJ};yMj}|O3FQp_7 z@Zbu7;u?Sw;&Q>J{fVU}_)JPE%ewL#V|0#4^ES>ql#uf_L>8k|*UY08yMVGMtby2M zj)o~w0SKfx2vWRvDo0P{YrLP?5-ytI4iF;MJ?~Sp?}ta z$^+qv+Pa2+!O`{ta76zXj{kORFH-BJv-oJ90c|hF}Nmgk7*3a#Yq` z4(mP7!>7t8F@sz~SBRXoOjK}*2n`nzkrgUY9E6w5EFyuTQO@L%yJ$laEMj{eIgV); z42uNjP3*WCPhHAdhU2WXv$~Hv$U<3nMUCB#$MW$Q#H?=!&;{zdTtv8=vC@)Zm5|O8 znb{aFkqpSPnUQ=%k2*c9=U;TlA|YGb3sYW)U-{^Qp+ zX`3?^j64m^Cc!xh-E2Z%p&Sj;#K!PPXk}Ip6E%}5P|Zw+1Tq=gvn7ks!A$1Ul41Ef znDr`ATfIjlueB+B6Isx~>>VKT4KH-kMiHU+3dNF(*_%V!EIVsh-c1Pwd-*sp5=t(j z?A<%|Jx`k`%O+evu0v$YxI-U~$KZ(CgXhWQTj>vJN}Tjfw1lv07t&M6x$D}+bdtu0 z@Emf|Gxic<(WbpD`*RC!qF5#(%QtSL{$%=hdTDR3fkszfrE{}$U3$s~!+~}AKm+|F z8>nJ!T92+&KiL_1yWTh1I5)B}UAew_z54!7^3Ls#8_|iaTYJ%o-RQ)2a9jO8_-*jJ zj(YUsUUX_VI#rKeJ{0&%T=*H_dwULK&^vm<`c|r;CAO~aX^CAeQC+Rx`)2j=YVEVS zc41FT?rO=pHhtQ9V05EYS>0THbhDb@8J(>6pKnB7-HJUNzdv48wxc^^7weHr4ehn9 z>4(?uU#pI7pWo5nscY{xBJr)*UL?L7iC33@;H&w1Wb&{-*b`V+Xpns`H+lxyuWz_9 zINBJ}8-rtqooZL$3mLyouLqCQX;v4p#u)Z6VAg$}80(DkwBBHp(wbPZ9aimY;7@*3 z3OogL@)eoRtgaFn=8VFE?bnOiN||3=L4Pk%a!t!=R?ZCjfUt!6r<^{SsFQxNUchfs i|Ln1L7|H{IwQ8%lmR5sj0Gs`AXVxSj zwI>c#>H$usQlzH6)De-wv429PUO;YzH4>+ua)XezQVvyTc5TH`a%o5Qo8P>7`&ld z$3S~rfKdpAi&Bg4KST|_luP|zT(7=_s{=)f(u2;HG9=yAb8!?!G1P^+Q5^N41o!l8 z^cu;hJ?&YWn8zM8bfzNcVHPi}LgJb3vIz?Xx8itAU4qUUQGteMi3G8&VZpX)!QgzrWGtmDbxHgLuR_DMd&dNdLE%9!J{`j zg)c*~g$w*Z>f!PukugIeeS%EA0X?|cy=Xzl9YT1h;5r`Ul+(~DxJ;Yl(je15gO*EJ zbdgIeHYFOmuZDDT79zTZ#DwV7F`u(ssh z@gHEF3l)0_lVB0LT|_I`qfEEp5^vS};GFY;r_(c6@}E*nX#R7&j)~_w`5Tz7d2TsB zgB=f(MNISa?mD*lD(@#auuatyJ5K*L$ji;mkelr|1vS+RDLKhnd;>&|D)q#0j&z*?Xh4Ylp+{)RR{l$BpU2ZRJ@`^n}skhzPKVE z!70z5%);*mCHEeAi}Q=3r$XwfB1zH-=syAJ6EOTly(mR?E>|aaC;tQ-`hxxi)O3Oy literal 0 HcmV?d00001 diff --git a/Movement/Forms/__pycache__/FormsProduct.cpython-312.pyc b/Movement/Forms/__pycache__/FormsProduct.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7956965c78b568ea43bb8152adbeb1d272b92523 GIT binary patch literal 1613 zcmb7E&rcgi6rTOPtZl%M7zdmtDNwpC_)w{rmOv7RrmX^@t*W#uSJuWe&~ILLTSR--jDK`kID&^FfT`W0@Dy1X&+wZ-3^X9#I z@A=O}!T@YtZHSJi0Pq(Vx{Jx-I{A`)ng9YQxWE%ELEv0;MNhJ%kV~%YDV8Dt5!?V! z-T+WRLMeWFzUQ+eMS`W(R8xD#1yi8PijTd35!Le{ayiq9OYEHS)QV7H1pVq{@SHOZ7|{1fhY8T+tWB(Hc1vu3s@zY4vckW|tm54~t9t1S25 z1WOeG(n^E9dl82slpJA)`Qj_I8j5%?LK!NM`!GtWUVX$vefo9%&Z(;Fy)^dUHc-1S zJ=VLg@IRt`vz*?{D)V}Lun!uJ@Hp1Z0mkpE)&NYvemDRJVG<67n!(zzdFExZw`$o% zL~K)~YSDF2nNS(p1W~OL)s*T#R_!uzNR1j5yH@ZJ`QC>#&bC)j5IBC>cBxWy?I2i> z@h+PQkc*0BU7!4RX40FPggC~crNES^OllQ`d5Tn7v)w8(MXK^MHld152o9(m5L9`_ zt85DREdQvOcT(sC^M1$u90oWf7*H)2hK;Cv-6l5G!d@i)dVDc^aoJwAJ(iPC<4nEc zbmNVE5#|J;4bhUBq0VH3|hbAyt?2c%i^@ccUH5C*#z6k%b%15sThIE(|aq zI;wsZW={K9An3DlrAja#aN6hkMcd`$My0ZUH+qlQQq{YIaA-!gyAE7MB%rEm-(lnV z2%NBk;N`X4NBOSfSe2CzIX&^dOVn&tzNm)=y9BkLo)=w=;7GncRLR*Ul^)OX3w_=mikZ z4j-u?J+W17)*JPQw_D!c#B6)ya%c3N?a2qz_oiFg?)kl``S$3QPUhY1g$Fn9-E2+m zUfwgWwlmi{X>(gSNSpgq^d2z|5w literal 0 HcmV?d00001 diff --git a/Movement/Forms/__pycache__/FormsStock.cpython-312.pyc b/Movement/Forms/__pycache__/FormsStock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a55a99fde3467293067e7ac3232e326521bb7a5 GIT binary patch literal 1595 zcmbVMO-vg{6rTO{52gWQJ1({gG@xoFaN9#GH6>|UlC(_&Nt>o=R~FXdnNpkmac9O5 zBh(WID)oR*=D;EC$q|vlF~=S&^#URltC2YM#0^5KN;y=W*~Nk=IaD2K-+nXioAP2mEo_Xaq8GbeQ`Od@I-I#Z!V5sTEY2kT|ZqTkmomsV(lbO`O}doIPEy)U}jkb{d%#ohv8>Sc>sEOJwXOFb6T7D7MU`VELtkLmV-(q7B7|fAk=Mv6QvSQ)ebdS3;@%DhGtqYEIjxM zvLV4D1{ULP(Wh>$PO+F?7PGywWs6y2it8-*M)>})> zrF(bU&erhw&e;oo)>zYav&MGT*vvfY-Rydt9rtsiYwzslMz?dLn^zxwxcUC$+y{PY zkUPHKyngSE_JysX_jXd}{q(uj+pX#5bld&a+8(~Plm6_mH`W(li5z4=s^8BH_-D`g z{X>3Vzn{t-c1L>RKkE2Ro*90diz!3JgJLrz#Op$cV_Xm-V7(n@ezgDq literal 0 HcmV?d00001 diff --git a/Movement/Urls/__pycache__/urlsCalendar.cpython-312.pyc b/Movement/Urls/__pycache__/urlsCalendar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41fb72db865e322dcb1bdfa36199dd09b7c91e12 GIT binary patch literal 1114 zcmbW0&ubGw6vt<>8=ExUO=y)`*8Bm1l3YR$r71`fyqF?N41`r#*k_w`e}tJ$+IsWW zlUMx<1gZatmn;b^4tNkx-YNwJPtIh!>}C&zI)~Z!Em@*l_32hn{IHp0^){@&KV0h3RQ_r;-uCa}dJBg%^2h@AcYX!?O zYhSI_oSdbEip@mSXB_?&)W}pvRs&(wlr}AWwkm z(F%H(uceFKq8`=J8O!b2t~s_~pKNg=|NRjC$gfKYWBd(0_#;a=^Gik9{Q1VY9jM#B zx*e!>U#-v7ooVCgTz>Xl&Q0^$hZjM);g=ghx$T$Rv+|?q0nFvsU;jVJTh^vpJd8t7dl8GsmNTi4ZM$*QGJOl(CJ3u54|cH+cCq=*~N_xzv#{qA|rmcQq6y8w@e>W*Sk0Q?}q zVld(2<}U=`3y^^fRiMEEgk+si6B;$3AV>fNWeQQF^kQT594#1;1TMn0On*yW;4{g% zW$a)^Hi%c}jf_-`k;V*mb$77d$jHPPyO>eflEK6nS)Emik^5=0gHv?)37@iRMC&?*eN5~qn>mo#*i zstXp99OQG6DNu;*tWa+&y3;g|59%G{NQ%1Z3zWF8Z^|)Vpu~M0q@wk61LfAogk?Qd zEX}_cl}6%~@)ow9WgM;ANF3RoS93lik0gC))J`nbw#bL=vzUrBq&qcoqHWPc%*XD@ zPf7NhG0ywNFcV>yQgjbXDQbBsMcw&#Le_dWOL@I|pTRZbSL+~4x4(iL^0xmx5t?G( zMwTtULStk(hAwuHee4*fDBzZm)kC(pXi)6qrbW_ucy7%+_0w(5kWW-}V3jct|3rX& zg{Nx@LU;wrzv%=_{K|r4X0kU?J$Bz^_dT}ZvW*%0c-nd~r+b%ldcuG1dR)Wh8Xnhl zx#o;(PleZWdVq7&%!6~$tF+uo%c}@(MVM6%r`@-6`rUsdaXF99%O2ly`Ig5EE-%b@ XOg)+>hnE|2*Tqae@rkkS;|~7;DNtNn literal 0 HcmV?d00001 diff --git a/Movement/Urls/__pycache__/urlsProduct.cpython-312.pyc b/Movement/Urls/__pycache__/urlsProduct.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d861df4c67a82ed24ad1f53271a5addc5155a550 GIT binary patch literal 1101 zcmbW0PiqrF7{+IIH#TXKO|8W$Yd%1VBv5;5N)a}mTD4H35Ef+Z4mIii2{V&uy?HBs z0sRDm)NkS?O9G1n9>kNkN)Li3-^p&e+Z+mY4zu$<^UUvkhTZ*IE-xY&_unhs4HcoE zvY3rRvN(T(5&D1}lBam zTIH8S)UeR{Hh)!9L}}P1uh||AoWTJXce0g9iOq>QU_9^yZiwZ_!7wrIb{T&L2PMe2 zJ@R&`vDNkYX8&lr(IVXLx?&}D$BOi4eeJ#j_^dBh=6x;VlFPnWnfl6&OiEwePMc8&>0$dcDeTGac;BERLq8+FMxy$eA2;}H7<)0v7f{*Lbb(NwJb)={o-a_hv6^tDi5 zi}dwSUmxomqvq3zw)aEJj|#>|E2=ibYBQ>uVbvU0AB}cjPPBt>|Gx<>8zbXEWbA~- bPGszd#{Sr7k1RgP4bCe0it?^VS0U;@aU>rz literal 0 HcmV?d00001 diff --git a/Movement/Urls/__pycache__/urlsStock.cpython-312.pyc b/Movement/Urls/__pycache__/urlsStock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..907d92726a553121aec0be816eb5802061da5cc6 GIT binary patch literal 1027 zcmbW0Pm9w)7{+Ik)TT|7mfawV_PWqZ>S?}xFRTeLvoM{`!?V$&A$oprW_czZ>$X8u20`^>flD)YEzz<$z zPhpi@Q3$|$-~t!=UKprNMSv#JPt>T;*m$_bGF2#fipyB`Fa~8hoW>VlPqg4I;+$V zynyaUgJ!*hsN?xUwXD}w-N?PhTGs2T4)W2zJ1%RkdQ#I;&FwqEacG@jpJ4vkQ-fJU zLljVpYY0|&Q@?heH1CjCBet5B7kzPvRYUk)HH5Xl3hs*UkZNpic99g}fP4m5{BD0Y z+xvExAWZBRXoN5g1G|IBfQFIXX4VjXiin*VwY$u`%}=m!V@0Q_dN2CXA4Erw%1 z3LqcZYc4|wzk|EK6bVW{OCVPmZ;$(lu@f6RiDAWtH8t){8V_g6;WtGc-+p(Pm{x3B ziMbn_yHj&-(mI+c&)C|eaOXoWsW#$jBdNCHYHM1(KY3u!l$Za%IM>y(bgto>%;_I@ C2?8Vl literal 0 HcmV?d00001 diff --git a/Movement/Urls/urlsCalendar.py b/Movement/Urls/urlsCalendar.py new file mode 100644 index 0000000..f8bf26f --- /dev/null +++ b/Movement/Urls/urlsCalendar.py @@ -0,0 +1,16 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Movement.Views import ( + viewsCalendar , + viewsCalendarCreateCustom +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsCalendar.CalendarListView.as_view(), name='MovCalendarListView'), + # path('/Create', viewsCalendar.CalendarCreateView.as_view(), name='CalendarCreateView'), + path('//Detail', viewsCalendar.CalendarDetailView.as_view(), name='MovCalendarDetailView'), + path('//Update', viewsCalendar.CalendarUpdateView.as_view(), name='MovCalendarUpdateView'), + path('//Delete', viewsCalendar.CalendarDeleteView.as_view(), name='MovCalendarDeleteView'), + path('/CreateCuston', viewsCalendarCreateCustom.CalendarCreateCustomView.as_view(), name='MovCalendarCreateCustom'), +] \ No newline at end of file diff --git a/Movement/Urls/urlsExpense.py b/Movement/Urls/urlsExpense.py new file mode 100644 index 0000000..0027cfe --- /dev/null +++ b/Movement/Urls/urlsExpense.py @@ -0,0 +1,16 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Movement.Views import ( + viewsExpense , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsExpense.ExpenseListView.as_view(), name='MovExpenseListView'), + path('/Create', viewsExpense.ExpenseCreateView.as_view(), name='MovExpenseCreateView'), + path('//Detail', viewsExpense.ExpenseDetailView.as_view(), name='MovExpenseDetailView'), + path('//Update', viewsExpense.ExpenseUpdateView.as_view(), name='MovExpenseUpdateView'), + path('//Delete', viewsExpense.ExpenseDeleteView.as_view(), name='MovExpenseDeleteView'), + path('/CreateFirm', viewsExpense.ExpenseFirmCreateView.as_view(), name='MovExpenseFirmCreateView'), + path('/CreateProf', viewsExpense.ExpenseProfCreateView.as_view(), name='MovExpenseProfCreateView'), +] \ No newline at end of file diff --git a/Movement/Urls/urlsProduct.py b/Movement/Urls/urlsProduct.py new file mode 100644 index 0000000..fd7274a --- /dev/null +++ b/Movement/Urls/urlsProduct.py @@ -0,0 +1,16 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Movement.Views import ( + viewsProduct , + viewsProductCreateCustom +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsProduct.ProductListView.as_view(), name='MovProductListView'), + # path('/Create', viewsProduct.ProductCreateView.as_view(), name='MovProductCreateView'), + path('//Detail', viewsProduct.ProductDetailView.as_view(), name='MovProductDetailView'), + path('//Update', viewsProduct.ProductUpdateView.as_view(), name='MovProductUpdateView'), + path('//Delete', viewsProduct.ProductDeleteView.as_view(), name='MovProductDeleteView'), + path('/CreateCuston', viewsProductCreateCustom.ProductCreateCustomView.as_view(), name='MovProductCreateCustom'), +] \ No newline at end of file diff --git a/Movement/Urls/urlsStock.py b/Movement/Urls/urlsStock.py new file mode 100644 index 0000000..34ccb76 --- /dev/null +++ b/Movement/Urls/urlsStock.py @@ -0,0 +1,15 @@ +from django.urls import path +# from django.contrib.auth import views as auth_views +from Movement.Views import ( + viewsStock , +) + +urlpatterns = [ + # URLs de Professional + path('/', viewsStock.StockListView.as_view(), name='MovStockListView'), + path('/Create', viewsStock.StockCreateView.as_view(), name='MovStockCreateView'), + path('//Detail', viewsStock.StockDetailView.as_view(), name='MovStockDetailView'), + path('//Update', viewsStock.StockUpdateView.as_view(), name='MovStockUpdateView'), + path('//Delete', viewsStock.StockDeleteView.as_view(), name='MovStockDeleteView'), + # path('/CreateCuston', viewsStockCreateCustom.StockCreateCustomView.as_view(), name='MovStockCreateCustom'), +] \ No newline at end of file diff --git a/Movement/Views/__pycache__/viewsCalendar.cpython-312.pyc b/Movement/Views/__pycache__/viewsCalendar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bdb74b175f0e113d87d5a3743c494dcfbba99f1 GIT binary patch literal 2600 zcma)8&2JM|5P$n&d;OJ7Y`0EnOG2T*7BE#s6{$s4MN&Qr1jI)xts<=)?+dKiwZnUB z8b?OtfK+p6DTj({uN6J?&_4k6RH>IlQ5Eyl2&p}Bi!o@Q#nSaFkH%1i~i>ZZMnnF;imoAn0Ffk2PDx;JPJN<=27h@H4gY>g(UMx{rw zaBp)c@Fc;L3Ouo%Cl`3q;K>9YrRT{9o-B9<0*~7B6q>p*_zageVnRFTaQ_R3ekD@l zjFx>G>Q`s&o<2cc8rdhPUv^xKF=UZDSHI@eF43C}hf({yGw0Mq@gilO!?{!6>M$gc zJy~ZSA1}MKW|tWl;$GdRE(a~c=q<`PwcPT26ULhFcyzvAqm>YWP|DrG`bki}hGbA; zN;WZNs#LZ9z)&}1wq(X_*-Y4qsoAQTY?B$uj@{MFRGZ96X8JNQ;$kp5QG~>NF0vd& zQ|Y?zxk8I<&yXrFQYXrsmTmzKRz>RDS_NH!-}+x5zLy>nzvsNCw8%G*(MMg&ZK*}7 z7{BeQ0t2@{)#P>y0Ukc;?tEKr$*jyj^G!f&CS;|D_8uhK44a%CF`Xa%AFqHd3IrZ5Up@2`s zXB^k3jNutX(ydp@Zm_5-R8HL)p+%EfA&9W7id*K~vN+;5Iy$=WVto9gsjD0~H1#D? z$*kza3>d;zOzb_y`WS zK|Eg|f98iDj4kC4Ea#23*3t9#TlZQk`pA+#vZC)@()a#wa#=srR-dHxPI2VnodRYD4K?gdd31!%Wmjln0qz|Ld1fy5?P;mvo7WYBSaqaLg##|K3%01KQyLi%TU1> zGu;$<$W^y=EzA)XbpVOTb^)(Y*R?D|Vk58*NA`WnMnN(?5?F@(Fo@@ONhg!Lf8pMR zh0i*LgA3<7yY?-r#ZIoUaJI8+KdAr8iP-QO0m1e})3=m+R9EY`-p-4?sTiv0mGEZ6 znlD6&JsKK=!e%*GeA3X^J9vh@DE6V~!O7mm;eHebh#yIK+EFy%!2*HA;je?(^40I* zSMOg^i{TWE-tvLiDDYXo0%B($NE5FrPg9c#P1?OeH&f8@(oGfmdk=`sj@}1EXbd}C z9;zckD5Cy+Cg^jO>*d-tYE2rMoxp?*Qlw^}*@tDyGH6KiMx{cbXdBE8kYq=|+y~}S z9HMv&egTJG0&{5h%FyAZp~DNGKgsQ0967d}`w-c5um>?te>KF%!Lu`n0m?)llo~*p z+zRF9h1dsWXbd^^K5W*74lX#jJOR4YPM|}i*as+(YugbzhBg#PQ;tQm9ijh$1?Nl} zuZehV@L!ME)eXna!JO$*x#3?gd3eophK0`X zRuThIS1kqiI}6gUMaH0zM7p~YA1tlBB1^{DYWJ$)#0taFx8dO7^XiJsWCP8eS|Ki-%4;KD|L;u(4Z_4lKTL fXz|Fz7|D5r76W5_V zN&fuj_RoL*%Xj|s=XgAdp#41Y=JxdnLVsr+uZ8Q(t6u=Kid3WuIx+-FFnp5F@JoIp zAO(z|6cpH;PY)SkDQt+6$oqahVnn4V=L34oXp`DFAJpSULP~Hxq_-O#QU~Y5dZ*DP zbqUCa&LLI2i_{1XV-fov1zkO)Eep|1>>Jj}1gUsQv+NrhzC)v91S>Xn`N>(e!Jo!D z_Qp?RThVm3CgY=Bm&_S0e-(dN&(8b50i!x~d`oL3bB z10lmyv2HPLOxJMU2Cj|ZIZP}p>q>C}`l5j?OPRq|*45sn{(6U-^p{{%j3hxtk`McH z;`)UyF9lUW3gK`r(PB>YAskVCkA(W#sOpzuWi&0QfxDvAriz>o-i=6c&V^t!!MQMS z?PWACNFCQuCPKG)XLBt%R{SwhdddR7LVu6<6|(a&!HDTiMsP)AQW@e1Zq*2ieQv3OyBukM1q zxZS)Nv>XJxfn7_27Xe^5lw&7uYPnF;0CaPZ?9EMWNSYU{-2&P~8V8Jxds|9tMCPKu zXwESMHMNrekN(El0{NZ)L&BD(?a+NxA6g8Q0y*ZfrsmC;e7WwXDd?)c z?*Ww?dh@6Zj1x9MLs>8LeVUqylO!7yncJrUEohhkx?szu{&Q!pQ$LK;z?F$>*WJxw z^HvULZHtDcH64PF2J&VeQ@^6?YzXVBMMc<87A$OMLWC(tqfD?H*)+gE5^;5qHI>F) zK`_nmh%m)1=5`2v2!GNGEa?MM-1XLwWn#Cpy(>UisJ17U?>Oy!52I`C`^$k^a@*>q zl}pv+fRh}kCignYy`OJeOCJ79a`LhIrT&Fp9X;oao~w>tbVe^eJ-;?OS&n=aOFmD% z^I-h`cr`WRq(&aUUrCLurQTb<{10z<*hvkqrAEq^Ynjn%=D3qNzLq&z4%~|^$38yq zh&!H%dur`l$}z%J+mIhD+IfDckTonnN>}i( zDii_jijXObepT2+UaLH6B@fn>{NG81SZ=M~|0!>Stl(y+l^drm`CETa_R0fP+C(F{ zahg(a6B!K@0<2*f)YMvK&{E&c|H)a!x(&Nw zhim|PERZzlMFR!+7L8_kO{B`V76_{yK!ZY-Ddyso3nd^1pexMLh3tn_WR#I(jJ(Up z4;bN4!hFr4#KV#w!a%WqQ!L?7#pUmYh1NfT0GiagdsmGWquRaS>E2)M9&x%y%CTCq z@8QMA179Be;$Zdg1?TXE>fuQTeg`Hi?@u}XQ%>?`Ia2HC{p9+CoA+;4cN}we9INg) z<-l*xsXu8>_eAB|4QK0(apjrR4JfZLb8n_oFkamK_GqfhI|55BCWpmS=hoHjE8DA`15W3_TIZf} z2)uJIv7GqWUM;PZDuXAUoPF|cW%uc4;+eXO`X8QNYtK}~40lmR7-xAZ%X!7XvP`2g zq>@_D8Q&($9~Kndogo0{aJ_pP(jb2U(726_Ssfl6TmWH)CHokOv*odR&dCJ=)iR`c z{e2;`+JL=0coE63Wy11_Ff-72y?V`JU6M$I#Wv?TDn~8+*$2B;B+2Xy6{!k&Pw0WwXW|kU99!)t^|5s2gG2{w@ERWe4T6y z?)_KFAKdp60pS+mg2yvSnpAU2e#RW)MKF}Jc?gLtVc|)b?+6P;!Y&EIuz~j0m$Mq2 zXt#!xf_;0)U@t3+u&5*q>1o2Nu!qjFClxms6}>^%$Z_{cHRQgr+8P_2`etHRv)kTEjqI`UOGw8cBae(%0zf3$*tI+WrEiU!Z{( ZsQ-27fUvL9H&Qur;pv5M5p=k~{{T<)cr5?` literal 0 HcmV?d00001 diff --git a/Movement/Views/__pycache__/viewsExpense.cpython-312.pyc b/Movement/Views/__pycache__/viewsExpense.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cb1bd0f85422c67ce6e9b28eb3b2d819072a651 GIT binary patch literal 6220 zcmeGgOKcm*b#}QVS0qL1LrJtO$F!wbrrgSoq%?*jxbaW^Bv#${lVYourMV-U>@F$K zu53%7VI2%q0#Z0W6mHRLDe>aj({{hm|nLeOg5CP&zp7*E;ns zrHkXT)~!dCs6a$=ny78}h#H`NDpTRH*ZwA@hjW6!32}~C<@9n+J8;6B8!~bO;BLGJ4(AHA{9##usR-&wG!j3_5xfM3kIk z`C0gGkVQ&MgOOI74=@k>Dg!|MiSUq^Ro059Kzk`Du^G8)p0^WxJX)$Guz#{*|3Y%{_D8ltj*0mk-JZ}t9b+= z&0mr5Oj{C~BIrGW|H)(~ozH<0=8QzZ@*4AVlv$x`)J)!(r)6P&*@W_ zED!K3-)u%RDPs}X(Q4E3>6C^>WO;J=Tb5Uc1+OP0OERc7Ysv0Hte1~YCevEVFp^0F zwGfZTm!2O#ab)JQ0rolb0h+0q&&`~q#t+T>+{_7@gN-gwW9EGRCe@)ggWh7yph39C zKRUO-cEDnb15M^NT7M7}p|J?y*%Eo$9eeOrxqEoEJFzUUN4oD9Rtjs8-Q~#cwa8#O zGWcj}HF98C`Yae(@7w+G?t{C(Ge5e!+Bdm;W-~xKV#|?DKZ(VW@ie}FEk0I`kNxrR zpC*4l`G=#c@#AapGv)Z1O%I6;SBMx3!z>@4Re{|}B4o+QWGp0Sq26$m)s4ENx6Ne!YL=!=n;4u+K^Va?R~M{q(5DkW zlBh?FEL>JryQ7FS)wE=?D6m1;&_LUMhYbN_oi0E(G`bgI@GQD(aJvzK} ze!YLFB=xO#MVH=P?;iv7E3wTR+av(k>+bZ1u!3HSt#S##_JRuaxAF}|771-rt6ruA zAn*hiB#6OoOsNIn#cnsu*fcxPbb(1V8O-w@9&J*p+7N7}iy^iTK9~(7*pC3!!x9Ka z5F9{&g0cd$5SDElXXxEl(3nrBA#5e*nZ`zeQY5x;xRl3mB7&Xp<5F%Aasq_hxofR+ zq}(~ObndgR*Gjv`SGy)q-fxtpK6@dY-XLW+Hdat;+mkYe?gbBctt-7+YN|=krg7=9 zC@ejlkhdcjJTyCufExur_Yv$O*b6@cL&FQ_?jNh35C=A#@ZV`iwd7rsgiW(0fsV2m z1_ERndjK?>N`qh21cY;1 z3#b5`?G`ovO8im%yzG(gwJD)$0o2YhACy92UJ6B^6q2nTC-h8Zm|hpD`Whn@a%+NS z6L=!GGy|Mq4n<$6dYsfB84{l{2xzsGurt?bAT7SuQog(*zE5TB9Us)c0A|Kk6Nk?=!$YWb; z-TV!&@lkL~0FIlOoUlS7)Z&{RSQ)|5s1Oi9T0x`qxlob&wXpnl% zjzGJf=}XUdzfZ40)z0#9xanw_#gv+lr}KIo@*SkR{GMW)B|}|lrgCY@PQY@kAAlvz zL#by4()@a)LXpC7E6eYsN!udqEP4}`Rf`^5=kMYQT-#{yP&eAjz6hPgcxz?zRLmE_ z?TvE)K;7%R_J9i8SK6P*{p*9nzn%QetO2cQK z$Y&iZ+4E>j{k!3w&Eq--X`d-d8BfS?nx~t9%mxs;aZ+;m!v; z*E)yFokOdg`<8v6n)~6E@JHsu!h=F-`0Y=oJ~>=^{p1t*l%t=)M<-V!iISY)`Y8(2 z#g6TyAe0vmE4*l{OGX$>7#bPF1F(Y#4gshymES=k0*udW5<3oZW~UHLA;1vws%+CJi)yyHjMKK6ZTkP8ZC=baQ|vs7e;NT^9SwAZYG`T5 z0Zl5X<$&+uylM{E>qh(k(Hy|8pe#Q?FoS}5MX+uqQ72eqaAGJ}J6?Ssu_S`#5P21e z2)GJ=fIWU0?NG-C1Gx(P(rE-%9NZy6h6|Czc?;xY=)~cKI1})`t7KVPE0Hjl0TLG`|W{m=!t*}&2fzDPaCXAE@MoR~${u0-O?=0(k@f>^|j zd2uuD>837y)lGOwGb!7eoAT0TTDGHZ#v3pPWIN^>-k>?CkO(oiVvsyvDY zuQrDyk^m$rk!T0WN+bnHS|Vx($w?#w$bdw&4l+D%xv8r7!`QXRAs!d&v2&1zkEKePP`hkl}GJ2---CC5N|}ns6rYMHr!CknGowf88f7AVjr!KjI%V^m z`XbIiPn7#YJ$>?uPyrLs8gnYXh|M{!PZ`5$h=f}$6GIN6R8-BGmbDUOS@Jp1>T&&)r9(Xe-b3TLX z9ICcZn`a|1*uq~6lBc=RAE%ac6DzrVQ*Rl$2aWrURby<~7+W=V zFB`jmKDA=(YidvROw;~0^(1AqM#diA{qgQ^{ttIoMvgYmtjEaUXwz6%$>=x&zu#V+ zI=eh|c4g{3W?X2VX&EC;V*_4C@@b)4R;B0x(IRPCu)*psw$m06Tyz73p+-c!Jp&Py z+fZbD>eXCaBg_&xTqkxo`FHzUE zth~a;;e{ME`Wf2=mZ6xW!EMVw0Q2G=X{ECdrteQLo@@x^mJZlyYUP5 zpm`4s63X63Gl6C=ntfn?A;GuGNf$7RW(;n=15D4H^El^&%i2iL1rvLwhs6Z1jVoZb zH$56JqZIotQ;!guushq{OhSE3&1-NNgfw)kf0u?J7SMp}w=gQJVCj0Xa*g)X!RdT@ zI|N}V70Ed`6M}up(ilkbdZ`2z)v7aBa>({WcnggO&_#pvOYOWuIG%wX5>z<52P{ zlsP4a%4Aq#8UC*@Jhd49HHn?=bSx#znJpCS{`G=~zX_b-&S!X-iGi@*7Ucf{le*Bu zU{I`5?U6tfJkUuxjQ9?O@JI-%iri&VBXYLA;t~4Mpd^0EK7k%sG59Q)byZQ6XT@XF-?7K%HVHVJ$*6Lq R8v$o?K}uXYY85 zP1Ei|9L>(`&h5?oW_IrHu~-Db7@72|TLMD=ViRwK+RWo$1G9$|q;MM2If>JKl27+b zew~+iJs<@*rt@h*JtT#6K@yy~UkmFIDdOU~n5!-uql zo|KXt@}YA`5pE$Rj6+z!zIy@p98&*gM2vpJCSrgJmsHcbs^Xh8vOsX&!Y;qOt{m`- zSi_!t5nFjxV{1eoO8VJ_&{H1liNEVzevslPpOJo+2(DMk{fAjyaQ zMeu&-kOB%P1#zet@6;e92|k3witirh>ZFL`m!dVa$|?LULF!QihY#EeOEHHFf;8@M zA>evzXoHjb-a%p*Ufq2)*N+Qj(=v4CsmiNu#k8xLR!a)rn7VH18ci-4H`-b+5S8#x z^Cq6kD~eobAIdoz3ttp|kB%Z2vd6 zFu$^FLUdMs!GdHNrIkf&zHb@pD+>@kOfF+{1>OhiFk4}7Zm!&5w2NP+);Gy3V7M~g zMai~Kb)Gc=tIaf!@3zsyvyHZAHucjjH{2RY?0|LmQ2-OVB6 zS`im4lLl8+4WLK)l2O9cpVu@d!kS`I0rrzk6I)`Cu*1;^GwkA;^3FrT?iplNp)uDG zs97l@?BFH~J3t@6PYwY~hJjQvFGDP|dYEn91;UWpo7%Z)_YU8QG$_C(Vwbe3 zK>8|N125#iFGG+;rFIlR!Nh9m|OihOO8u=|#V;MwfqZi2fx2)iKX-Lxc=u!_tv@&+S6 zWTb2Qy$PDi(HEtkliZHsW3bNr6bK|>Yv9nHzN_SFjI@R`Um$;?Vf7( zi*~*(a&>-Nz(PcYmX9sA44k54v7PuQa;JZa{k(AN}(Y+>jRsgKehrt4$p9|&)^ z%fiT=Y@>IqE{r{&m;hooG5-V%ySKUntmw5uu*w@=P2TcZ%!)I*-CzK^E@`H4Ro@@c zpPz=_0f?PG148rtjp_6lmDE*C)KwMgZN@M&3V_a>&xj!!#Do|G+KRj>v!=rZM8J_c zm~k=D1v&R+?`CVOU7KvUhm*a5Is$ z6WK=Mcr6IQxgFn$e_-uZcdPZWH@`Uh#gFR879R*_+7TMPv)Jer>w@S+NaS*2f(o)+ z%IjE`X+)Nxhb?Q2?~!FlAI;Ses7QeP_5o?Y>2zt#!uq-feYLZnFt?HkMq+Grw4En% znP{{hlCIrG%j_a#4Yt!TId>3YnLtjnU9onfR=}Dj%OdA`i*<&lU01RCMHpd^GtUC~ z?iOnGByZ<-a@%KGsp;*dR^qj0V!}>LY+v{)d89u4Mk9G*`(o?Ru{uBagckyX-=>5> z>IsnX|D^nZiAM;C;}FMiPE661Qp}guj47wzgWjzKfG7|KPQoHb7!V07zl7CRdZ@je zwVOn}HkB`1*Qa#$0bvq`Ny3^d8uyyXsk7|M!EqQBJfZ93nEUB4<$g=J%|Wzn9UN)8 zzKuWoJO_u)*$L};+*e@*mI^1`fc}L19Hz{TCPUC8KgV%jBk7+=`Wju?M`Qcw@IK1y cqwGE!eG(k!ChA9iP@jGK%lU5+OdNy%12#ZJuK)l5 literal 0 HcmV?d00001 diff --git a/Movement/Views/__pycache__/viewsStock.cpython-312.pyc b/Movement/Views/__pycache__/viewsStock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa45cfa8496020803fedd6d5c51411331c9bf036 GIT binary patch literal 4155 zcmb7HO>7&-6`m!Rxu%+9{|&G%;ikw`=dH1+SIUhgC1-#GAFq}AE`4|Fz(Ml``7rl1IBKna*Z zC1{F@Xoi%KfVO}UHX};JloW}NgGQejRieBv8Zk4j#CbntB+P!LpZCK?(i~6*ct2tc znkgkEkN|m;XwqY%_0b5GsPHW0?L$d(OB5_IZV9w4L);PvOM+WMZObuk=?6=aTY_!N zFt-eVWsqCMwq;~BC8xi_hsq&Wn%8aTJ)Pcnqce==9qRSpUD4Y8S!z&UKTDmwZlI4G za8vWvvR-eM3S5{#xnbfxP%M@*rqnos1m1w~Wk|zVL!QLEnegnCqL=iNi1Zc1*9dz{iN=Orw zuoh4vT2PTRQR%CZB|!^4mXv6XJP?%FZ6b%=1mBt;k4lmc&*6Cbu45W*m@DkB5K-R_ z|1xjW>3a|eb%j|=uw!`RyipJiJYIx;5Pp0A0`WUxlQ?bTdaz1<3yFW$(mWKZq=^1K ztr+f6z_18F?roazto7uFfogyaRfS@#*N2d5;IDzUpHLNUlf(U-gg>{~@Ao?Y{+@f+ zl7kDbh_HdYCGlTX^@3Fbz?5uRazl1`g)%q3Oda)uGG(hab=(L8^ibPzgKu7Y#|?tb z4KL}2Lm9&-yM2aL$Qyi7(G_iKEV+_DnH}REs#-Aewyml*#xI-Au6=uT=JMjZHehP; z*9a}gDlN`Z`+dh+S)8FISo{{X7jIhks0pJ*M6H=YE$ zt%3Mvjl4)_HZC>NlUr%ICN-1kC)M@pc5lu zO$e(SRaH1XWdr+h6~dV}JPX6DyCJ@DH^h&an{cSPVqiYd$4z5S=mST!?i6Xk@szQZ zJRD{8xwGn~Ay2I{tYUufbn}R~iB_-+)G$=_6M<#naW*3FDmw*|4fp~vYQGHPo5!RX zPd%AmpI^Jy96GahvpIUYE{-%)Lu+p}M=wD4>p&!w*(D&@X@7dxamO=+ZEpp{QI9)~ z9EM#*3J}_-wNHT(1xkoROMW9L<_wG{{Bqgv=8GD;912;1( z3w6uTD|yYz7A!MsmkYqg)+ssWO29l$zEq%YY?)cW5%=;&nIePaOOEcWy3uk;cRVfo z5j@Zp%Rn1$w7^TD28V$m6}k~v6jx;e5#kTf^G_WmY8dB!>Lw`B(hZFV5>(8YdFOoy+ z_Z!JmPsg{ClXYp5pSi+8gyFV%+4>W7egKti)PP&7`K94uz-irTpj@>v;d?F}NjPvm8B`=vGPbRwz8)a8eWI?pcikHPVKvg-xk9uzwTgy!1By__(4j$V)zHxke zaJ(@%zBM>e3qw+#^so1S=xkOus`bgAeKz;mtMxOp&!uav%;cWVZYAZqB=gM3NtT19 z*f@$aD3IaV1PXi*n?iwMYQd5hLl#Fxtc6;&%nbGt`XK}vZjB)|vmb*v$lm8ri2}=? zjS=W(?@3_qL3o*o#^A)-uf9l~tdE`FN?kxAKMzE{FNQ-?Uk?OBXLkt*kIiwp0{q&o zbx$FCxP_x%-ByFL=z2`txrF*m>}fa?votKbAWKIH8^+`l;_Z`{uNhD<6u38g7(`d~ z!uKD&&=5zwDd^bsYC%w7+j|GZ(O&KUDO0N=T-d!3bnfSV2t17!f}gWBysxTkwg$4 zEs{{!BL@n*1ckltK*Tys~!ce>lKN~~W8>g-V z)d>#HS&%dCkXD3TTKuEKhTCWfn6JPPa}0|N9j<($Ky2tc8)A_PH$Kno6Bz8DObKV}!&7zn>gQ+o2@Lk9g2F2u4Gi|9A>pST4Gi}C#g68`1O^=3 F{{t=$u*CoX literal 0 HcmV?d00001 diff --git a/Movement/Views/viewsCalendar.py b/Movement/Views/viewsCalendar.py new file mode 100644 index 0000000..53f9012 --- /dev/null +++ b/Movement/Views/viewsCalendar.py @@ -0,0 +1,39 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Movement.Forms import FormsCalendar +from Movement import models +from django.urls import reverse_lazy +from django.utils import timezone + +class CalendarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Calendar + template_name = 'Calendar/List.html' + context_object_name = 'Calendar' + paginate_by = 10 + permission_required = 'Base.view_' + def get_queryset(self): + queryset = super().get_queryset() + date = self.request.GET.get('date') + if date: + queryset = queryset.filter(date__icontains=date) + else: + queryset = queryset.filter(date__icontains=timezone.localdate()) + return queryset + +class CalendarDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): + model = models.Calendar + template_name = 'Calendar/Detail.html' + permission_required = 'Base.view_' + +class CalendarUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + model = models.Calendar + template_name = 'Calendar/Update.html' + form_class = FormsCalendar.FormsCalendar + success_url = reverse_lazy('MovCalendarListView') + permission_required = 'Base.change_' + +class CalendarDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): + model = models.Calendar + template_name = 'Calendar/Delete.html' + success_url = reverse_lazy('MovCalendarListView') + permission_required = 'Base.delete_' \ No newline at end of file diff --git a/Movement/Views/viewsCalendarCreateCustom.py b/Movement/Views/viewsCalendarCreateCustom.py new file mode 100644 index 0000000..2d65da5 --- /dev/null +++ b/Movement/Views/viewsCalendarCreateCustom.py @@ -0,0 +1,54 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Movement.Forms import FormsCalendar +from Movement import models +from Client.models import Client +from django.urls import reverse_lazy +from django.contrib import messages + + +class CalendarCreateCustomView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.Calendar + template_name = 'Calendar/Create/index.html' + form_class = FormsCalendar.FormsCalendar + success_url = reverse_lazy('MovCalendarListView') + permission_required = 'Base.add_' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + # if self.request.GET.get('Client'): + # filter_client = Client.objects.filter( + # id=self.request.GET.get('Client') or '' + # ) + # else: filter_client = Client.objects.none() + # context['Client'] = filter_client + return context + + def get_form(self, form_class=None): + form = super().get_form(form_class) + client_id = self.request.GET.get('Client') or self.request.POST.get('client') + if client_id: + filter_client = Client.objects.filter(id=client_id) + else: + filter_client = Client.objects.none() + form.fields['client'].queryset = filter_client.all() + return form + + def form_valid(self, form): + gross_value = form.instance.service.value + net_value = gross_value - ((gross_value * form.instance.pay_method.percentage) / 100) + value_cash = ((100 - form.instance.professional.percentage) * net_value) / 100 + prof_money = (form.instance.professional.percentage * net_value) / 100 + # + form.instance.gross_value = gross_value + form.instance.net_value = net_value + form.instance.value_cash = value_cash + form.instance.prof_money = prof_money + form.instance.created_by = self.request.user + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) \ No newline at end of file diff --git a/Movement/Views/viewsExpense.py b/Movement/Views/viewsExpense.py new file mode 100644 index 0000000..20ef7b1 --- /dev/null +++ b/Movement/Views/viewsExpense.py @@ -0,0 +1,102 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin +from Movement.Forms import FormsExpense +from Movement import models +from Base.models import ChartOfAccount +from django.urls import reverse_lazy +from django.contrib import messages +from django.utils import timezone + +class ExpenseListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Expense + template_name = 'Expense/List.html' + context_object_name = 'Expenses' + paginate_by = 10 + permission_required = 'Base.view_professional' + def get_queryset(self): + queryset = super().get_queryset() + date = self.request.GET.get('date') + if date: + queryset = queryset.filter(date__icontains=date) + else: + queryset = queryset.filter( + date__icontains=timezone.localtime(timezone.now()).month + ) + return queryset + +class ExpenseCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): + model = models.Expense + template_name = 'Expense/Create.html' + form_class = FormsExpense.FormsExpense + success_url = reverse_lazy('MovExpenseListView') + permission_required = 'Base.add_professional' + +class ExpenseDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView): + model = models.Expense + template_name = 'Expense/Detail.html' + permission_required = 'Base.view_professional' + +class ExpenseUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView): + model = models.Expense + template_name = 'Expense/Update.html' + form_class = FormsExpense.FormsExpense + success_url = reverse_lazy('ExpenseListView') + permission_required = 'Base.change_professional' + +class ExpenseDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView): + model = models.Expense + template_name = 'Expense/Delete.html' + success_url = reverse_lazy('MovExpenseListView') + permission_required = 'Base.delete_professional' + +class ExpenseFirmCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): + model = models.Expense + template_name = 'Expense/CreateFirm.html' + form_class = FormsExpense.FormsExpense + success_url = reverse_lazy('MovExpenseListView') + permission_required = 'Base.add_professional' + + def get_form(self, form_class=None): + form = super().get_form(form_class) + form.fields['chart_of_account'].queryset = ChartOfAccount.objects.filter( + firm=True, + debit=True, + ) + return form + + def form_valid(self, form): + form.instance.firm = True + form.instance.created_by = self.request.user + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) + +class ExpenseProfCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): + model = models.Expense + template_name = 'Expense/CreateProf.html' + form_class = FormsExpense.FormsExpense + success_url = reverse_lazy('MovExpenseListView') + permission_required = 'Base.add_professional' + + def get_form(self, form_class=None): + form = super().get_form(form_class) + form.fields['chart_of_account'].queryset = ChartOfAccount.objects.filter( + firm=False, + debit=True, + ) + return form + + def form_valid(self, form): + form.instance.firm = False + form.instance.created_by = self.request.user + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) \ No newline at end of file diff --git a/Movement/Views/viewsProduct.py b/Movement/Views/viewsProduct.py new file mode 100644 index 0000000..17d3bd0 --- /dev/null +++ b/Movement/Views/viewsProduct.py @@ -0,0 +1,47 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin +from Movement.Forms import FormsProduct +from Movement import models +from django.urls import reverse_lazy +from django.utils import timezone + +class ProductListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Product + template_name = 'Product/List.html' + context_object_name = 'Products' + paginate_by = 10 + permission_required = 'Base.view_professional' + def get_queryset(self): + queryset = super().get_queryset() + date = self.request.GET.get('date') + print(date) + if date: + queryset = queryset.filter(date__icontains=date) + else: + queryset = queryset.filter(date__icontains=timezone.localdate()) + return queryset + +# class ProductCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): +# model = models.Product +# template_name = 'Product/Create.html' +# form_class = FormsProduct.FormsProduct +# success_url = reverse_lazy('ProductListView') +# permission_required = 'Base.add_professional' + +class ProductDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView): + model = models.Product + template_name = 'Product/Detail.html' + permission_required = 'Base.view_professional' + +class ProductUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView): + model = models.Product + template_name = 'Product/Update.html' + form_class = FormsProduct.FormsProduct + success_url = reverse_lazy('ProductListView') + permission_required = 'Base.change_professional' + +class ProductDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView): + model = models.Product + template_name = 'Product/Delete.html' + success_url = reverse_lazy('MovProductListView') + permission_required = 'Base.delete_professional' \ No newline at end of file diff --git a/Movement/Views/viewsProductCreateCustom.py b/Movement/Views/viewsProductCreateCustom.py new file mode 100644 index 0000000..acf9b01 --- /dev/null +++ b/Movement/Views/viewsProductCreateCustom.py @@ -0,0 +1,50 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from Movement.Forms import FormsProduct +from Movement import models +from Client.models import Client +from django.urls import reverse_lazy +from django.contrib import messages + + +class ProductCreateCustomView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): + model = models.Product + template_name = 'Product/Create/index.html' + form_class = FormsProduct.FormsProduct + success_url = reverse_lazy('MovProductListView') + permission_required = 'Base.add_' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + # if self.request.GET.get('Client'): + # filter_client = Client.objects.filter( + # id=self.request.GET.get('Client') or '' + # ) + # else: filter_client = Client.objects.none() + # context['Client'] = filter_client + return context + + def get_form(self, form_class=None): + form = super().get_form(form_class) + client_id = self.request.GET.get('Client') or self.request.POST.get('client') + if client_id: + filter_client = Client.objects.filter(id=client_id) + else: + filter_client = Client.objects.none() + form.fields['client'].queryset = filter_client.all() + return form + + def form_valid(self, form): + gross_value = form.instance.product.value + quantity = form.instance.quantity + net_value = gross_value - ((gross_value * form.instance.pay_method.percentage) / 100) + form.instance.gross_value = gross_value * quantity + form.instance.net_value = net_value * quantity + form.instance.created_by = self.request.user + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) \ No newline at end of file diff --git a/Movement/Views/viewsStock.py b/Movement/Views/viewsStock.py new file mode 100644 index 0000000..189d86d --- /dev/null +++ b/Movement/Views/viewsStock.py @@ -0,0 +1,60 @@ +from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin +from Movement.Forms import FormsStock +from Movement import models +from django.urls import reverse_lazy +from django.contrib import messages +from django.utils import timezone + +class StockListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): + model = models.Stock + template_name = 'Stock/List.html' + context_object_name = 'Stocks' + paginate_by = 10 + permission_required = 'Base.view_professional' + def get_queryset(self): + queryset = super().get_queryset() + date = self.request.GET.get('date') + if date: + queryset = queryset.filter(date__icontains=date) + else: + queryset = queryset.filter(date__icontains=timezone.localdate()) + return queryset + +class StockCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView): + model = models.Stock + template_name = 'Stock/Create.html' + form_class = FormsStock.FormsStock + success_url = reverse_lazy('MovStockListView') + permission_required = 'Base.add_professional' + + def form_valid(self, form): + gross_value = form.instance.gross_value + quantity = form.instance.quantity + form.instance.unit_value = gross_value / quantity + form.instance.created_by = self.request.user + messages.success(self.request, 'Registro realizado com sucesso!') + return super().form_valid(form) + + def form_invalid(self, form): + errors = form.errors.as_text() + messages.error(self.request, f'Verifique os dados: {errors}') + return super().form_invalid(form) + +class StockDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView): + model = models.Stock + template_name = 'Stock/Detail.html' + permission_required = 'Base.view_professional' + +class StockUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView): + model = models.Stock + template_name = 'Stock/Update.html' + form_class = FormsStock.FormsStock + success_url = reverse_lazy('MovStockListView') + permission_required = 'Base.change_professional' + +class StockDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView): + model = models.Stock + template_name = 'Stock/Delete.html' + success_url = reverse_lazy('MovStockListView') + permission_required = 'Base.delete_professional' \ No newline at end of file diff --git a/Movement/__init__.py b/Movement/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Movement/admin.py b/Movement/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/Movement/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/Movement/apps.py b/Movement/apps.py new file mode 100644 index 0000000..b9aed9e --- /dev/null +++ b/Movement/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MovementConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'Movement' diff --git a/Movement/migrations/0001_initial.py b/Movement/migrations/0001_initial.py new file mode 100644 index 0000000..fdc9842 --- /dev/null +++ b/Movement/migrations/0001_initial.py @@ -0,0 +1,102 @@ +# Generated by Django 5.2.7 on 2025-11-01 11:15 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Base', '0001_initial'), + ('Client', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Calendar', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('date', models.DateField()), + ('time', models.TimeField()), + ('first_time', models.BooleanField(default=False)), + ('gross_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('net_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('value_cash', models.DecimalField(decimal_places=2, max_digits=10)), + ('prof_money', models.DecimalField(decimal_places=2, max_digits=10)), + ('client', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarClient', to='Client.client')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)), + ('pay_method', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarPayMethod', to='Base.paymethod')), + ('professional', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarProfessional', to='Base.professional')), + ('service', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarService', to='Base.servicelist')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['date', 'time', 'professional'], + }, + ), + migrations.CreateModel( + name='Expense', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('date', models.DateField()), + ('firm', models.BooleanField(default=True)), + ('gross_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseBank', to='Base.bankaccount')), + ('chart_of_account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseChartOfAccount', to='Base.chartofaccount')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)), + ('professional', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseProfessional', to='Base.professional')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['date', 'chart_of_account'], + }, + ), + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('date', models.DateField()), + ('quantity', models.DecimalField(decimal_places=0, default=1, max_digits=10)), + ('gross_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('net_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('client', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductClient', to='Client.client')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)), + ('pay_method', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductPayMethod', to='Base.paymethod')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductProduct', to='Base.productlist')), + ('professional', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductProfessional', to='Base.professional')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['date', 'product'], + }, + ), + migrations.CreateModel( + name='Stock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField()), + ('quantity', models.DecimalField(decimal_places=0, default=1, max_digits=10)), + ('unit_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('gross_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('notes', models.TextField(blank=True, null=True)), + ('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='StockBank', to='Base.bankaccount')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='StockProduct', to='Base.productlist')), + ], + options={ + 'ordering': ['product'], + }, + ), + ] diff --git a/Movement/migrations/__init__.py b/Movement/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Movement/migrations/__pycache__/0001_initial.cpython-312.pyc b/Movement/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e8f4b8bb1faf2b4f11a8bb54c3a4b696881481f GIT binary patch literal 8114 zcmeHMO>7&-72aJ@6iMrcwB;Y_kCJWKqAV-=sVpV3lF0h=k0k47rACbG?TWLaRwj4Z z-IZbrO_~BZ^q5<9G;4D_yNxGP(D)657{n%-7z=MM z$)$>7MJ%BeB|WL)SaHf5^Rf)bj4;Ua5rc}Q;^p$JqP_RSBBvcI$*@uHH>5KjWwB3} z3`15DdX&R~l$_8+Lsk_Xds8Zsl6rhk0mFcm^!MZ+6~rouS`_0D8!JK_D&iQ)vrN~t zUx;BOZ(e&?hbvJO^HIs;xl*KuJg6AP0?ViJjIoGCUR1K-d+2dS7dhmo+-LG|dp80P z-5G)J80E{ZXCFIaH%j;Ml|6^Ad>>y0<*V7J$ZbA!-!Ny8^3*+-Cq#L^+y3K}ul`wG z=me_VIQfusMqt)c1#_M*nDb1*oMFm&_E|fnTG-)C={=)oj*-xD~$F3$J93vg+vjf7P)UXY}TQs^hIA%#m-S z{+t|nXh!-0&W39TDxOy_8+^j3k{XyAKhqe8xazE4&dJT!wG{JtqXe+*Hbt$S$A zw#W&!F}&}a=_sp;kpor5QSO-QxjQD|1B|?t$f-*cp4gepjp$A6AIshi@NiS$xhCoo zE^TXTYZqiiHe@jgRPR7imJ~ztgJ-dCKuk&s5;e@pXc%)h2BRKaDy|r+5Z5HpkPtqW z*5s6^WrTZD2K#kM12ys*=v|ex1yz>>MNCQ9E5;3ZRf4;U5+p5(D@g+fTn&O~0NGKh zsP73PLO8IJMntRAthM?K0)GO0C! z$r|~f)-J*W><}|TN-~yIghSc+C&bJcC9Rc{=(Pfm%Th|rmUJC1e#9iMd@8Vyx)yR| z_K|Q2L~K=#OSmE{G3^l6f|S`EPRcq&EE|>Fb+}aQQ#AzPR}#@8jeH+yVe%l~+2A0L z1A|3bN+KPXsA=bhs$}SXT2cUp9*AZNdlp3H9zNz0uR+H(gV4ozTwPHN9E>lCnjt`t zvXqmqzyKMzz1Z(CuAQJOpxo+WmiL6qJF(9T(PCV@kc26;C^7j!AWDE0t;7xN`}vBf z7_yPkD8$H36fBio25BeABLWXx=5jj-!9lnCG;p{i?W!x!4mo{yrS2$o_=!D^z0ej< z8*2O>1Ov9L3*TZzH6*zF)2qPV#>hpaMk;+=dQDFBLk1ZpP=KDQCM8jEdS!#Kb9mU@PS;PmZgY=XI_T_a zXCN@FYLc8#ZjtSZmPI9@Vh$}}AKi|y8*s_Q)NOuffXBY+Azm1t86CxbUb=6%@@iUg z?@NErJOKll|BMX0F+T&q*XMsKK^8MqWqwf7?-^=(egIOVq)kZr{Fu5brJy&zci%d{ zKb5woGg=8~qYoc6^gqM%Bj)S!;~$RfdKrJij_>S_@8Yimw(p|lyZAew-SoEA^!8W2 z{@oH!rT4?p-EzhsA;Wc+uWlz){dMT1dAj-IRr_?ab-H=e^Z2|O6HGPN7)oeAG6I0ufX*0+_X8@MiLYCNKRku7^ z{WSAQ#_k@mx<~Bp39Ea;?taJWe#cC_x63f^v!mR%3{x}4K_@iMQKfCf=r$|T_6Th) zekp$;+rzWg@T@&7Si^!nykre80r!3O77?1@-r@dDUQ66Rofqh?Dz`ouabS2kd@vKkS}6URl1|#DuE<8=wk*%GivQr>iaH1O^BG z&1(+)8czcJT5{lb=DQMBzN7Lv;Msp-<{Wj09-3#&s^;|zc2%=g)%>V(b8x%LIb{n= zQfct!Dtn!Hvx;V%(9MD)=^%2PM)Ed|#00k+@`LA25zo!7-*Vg*t^l{);CS}9_g6PH zFH*Ukr literal 0 HcmV?d00001 diff --git a/Movement/migrations/__pycache__/__init__.cpython-312.pyc b/Movement/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df2a61d4c9fea4b92cd4b6d7c1af4144684046eb GIT binary patch literal 164 zcmX@j%ge<81lNMzWq|0%AOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdlIYq;;_lhPbtkwwJTx;n#l;n#URE + {% for cl in form.client.field.queryset %} + +

{{ cl.first_name }} {{ cl.last_name }}

+ {% endfor %} +
+ +{#{{ form.client }}#} diff --git a/Movement/templates/Calendar/Create/date.html b/Movement/templates/Calendar/Create/date.html new file mode 100644 index 0000000..799dbd3 --- /dev/null +++ b/Movement/templates/Calendar/Create/date.html @@ -0,0 +1,7 @@ +{##} +
diff --git a/Movement/templates/Calendar/Create/first_time.html b/Movement/templates/Calendar/Create/first_time.html new file mode 100644 index 0000000..7344333 --- /dev/null +++ b/Movement/templates/Calendar/Create/first_time.html @@ -0,0 +1,18 @@ +{#
Professional
#} +{#
#} +{# {% for prof in form.professional.field.queryset %}#} +{#
#} +{#
#} +{#
#} +{# {% endfor %}#} +{#

#} +
+ + +
\ No newline at end of file diff --git a/Movement/templates/Calendar/Create/index.html b/Movement/templates/Calendar/Create/index.html new file mode 100644 index 0000000..899fd07 --- /dev/null +++ b/Movement/templates/Calendar/Create/index.html @@ -0,0 +1,32 @@ +{% extends "BaseLogin.html" %} +{% block title %} Cadastro {% endblock %} +{% block content %} + +
+
+
+
+ {% csrf_token %} +
+
{% include 'Calendar/Create/client.html' %}
+
+
+
{% include 'Calendar/Create/professional.html' %}
+
{% include 'Calendar/Create/pay_method.html' %}
+
{% include 'Calendar/Create/service.html' %}
+
+ {% include 'Calendar/Create/date.html' %} +
{% include 'Calendar/Create/time.html' %} + {% include 'Calendar/Create/first_time.html' %} +
+
+ +       + Cancelar +
+ +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Calendar/Create/pay_method.html b/Movement/templates/Calendar/Create/pay_method.html new file mode 100644 index 0000000..f603467 --- /dev/null +++ b/Movement/templates/Calendar/Create/pay_method.html @@ -0,0 +1,13 @@ +
Metodo de Pagamento

+
+ {% for Pay in form.pay_method.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Calendar/Create/professional.html b/Movement/templates/Calendar/Create/professional.html new file mode 100644 index 0000000..323506a --- /dev/null +++ b/Movement/templates/Calendar/Create/professional.html @@ -0,0 +1,13 @@ +
Professional

+
+ {% for prof in form.professional.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Calendar/Create/service.html b/Movement/templates/Calendar/Create/service.html new file mode 100644 index 0000000..d42e659 --- /dev/null +++ b/Movement/templates/Calendar/Create/service.html @@ -0,0 +1,13 @@ +
Serviço

+
+ {% for serv in form.service.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Calendar/Create/time.html b/Movement/templates/Calendar/Create/time.html new file mode 100644 index 0000000..b551dd3 --- /dev/null +++ b/Movement/templates/Calendar/Create/time.html @@ -0,0 +1,17 @@ +
Time
+
+ +

+ + \ No newline at end of file diff --git a/Movement/templates/Calendar/Delete.html b/Movement/templates/Calendar/Delete.html new file mode 100644 index 0000000..a51ba6d --- /dev/null +++ b/Movement/templates/Calendar/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Movement/templates/Calendar/Detail.html b/Movement/templates/Calendar/Detail.html new file mode 100644 index 0000000..b76b1b6 --- /dev/null +++ b/Movement/templates/Calendar/Detail.html @@ -0,0 +1,16 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes

+
+
+

{{ object.name }}

+

{{ object.value }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Calendar/List.html b/Movement/templates/Calendar/List.html new file mode 100644 index 0000000..03f48ca --- /dev/null +++ b/Movement/templates/Calendar/List.html @@ -0,0 +1,62 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Agenda


+
+
+
+
+ + +
+
+
+

+
+ + + +{# #} + + + + + + + + + {% for Cal in Calendar %} + +{# #} + + + + + + + {% endfor %} + +
ID Hora professional Cliente service Ações
{{ Cal.id }} {{ Cal.time }} {{ Cal.professional }} {{ Cal.client }} {{ Cal.service }} + + + +{# {% if perms.brands.change_brands %}#} +{# #} +{# #} +{# #} +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+ +
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Movement/templates/Calendar/Update.html b/Movement/templates/Calendar/Update.html new file mode 100644 index 0000000..f60a1ac --- /dev/null +++ b/Movement/templates/Calendar/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Expense/Create.html b/Movement/templates/Expense/Create.html new file mode 100644 index 0000000..5ced28a --- /dev/null +++ b/Movement/templates/Expense/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} + +
+

Cadastrar Banco

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Expense/CreateFirm.html b/Movement/templates/Expense/CreateFirm.html new file mode 100644 index 0000000..b7870f5 --- /dev/null +++ b/Movement/templates/Expense/CreateFirm.html @@ -0,0 +1,22 @@ +{% extends "BaseLogin.html" %} +{% block title %} Create {% endblock %} +{% block content %} + +
+

Despesa da Firma

+
+
+
+ {% csrf_token %} + {{ form.date.label }} {{ form.date }}

+ {{ form.chart_of_account.label }}
{{ form.chart_of_account }}
+ {{ form.bank.label }}
{{ form.bank }}
+ {{ form.gross_value.label }} {{ form.gross_value }}

+ +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Expense/CreateProf.html b/Movement/templates/Expense/CreateProf.html new file mode 100644 index 0000000..b79d2f2 --- /dev/null +++ b/Movement/templates/Expense/CreateProf.html @@ -0,0 +1,23 @@ +{% extends "BaseLogin.html" %} +{% block title %} Create {% endblock %} +{% block content %} + +
+

Despesa Do Prof.

+
+
+
+ {% csrf_token %} + {{ form.date.label }} {{ form.date }}

+ {{ form.chart_of_account.label }}
{{ form.chart_of_account }}
+ {{ form.bank.label }}
{{ form.bank }}
+ {{ form.professional.label }}
{{ form.professional }}
+ {{ form.gross_value.label }} {{ form.gross_value }}

+ +
+{# Cancelar e Voltar #} +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Expense/Delete.html b/Movement/templates/Expense/Delete.html new file mode 100644 index 0000000..83943d8 --- /dev/null +++ b/Movement/templates/Expense/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Movement/templates/Expense/Detail.html b/Movement/templates/Expense/Detail.html new file mode 100644 index 0000000..6b4aa78 --- /dev/null +++ b/Movement/templates/Expense/Detail.html @@ -0,0 +1,15 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.name }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Expense/List.html b/Movement/templates/Expense/List.html new file mode 100644 index 0000000..0ba1d80 --- /dev/null +++ b/Movement/templates/Expense/List.html @@ -0,0 +1,78 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Despesas


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} +{#
#} +{# #} +{# Criar #} +{#
#} + + +{# {% endif %}#} +
+ +
+ + + + + + + + + + + + + + {% for Exp in Expenses %} + + + + + + + + + + {% endfor %} + +
Data Plano de Contas Banco Firma Prof Valor Ações
{{ Exp.date|date:"d/m/Y" }} {{ Exp.chart_of_account }} {{ Exp.bank }} {{ Exp.firm }} {{ Exp.professional }} {{ Exp.gross_value }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Movement/templates/Expense/Update.html b/Movement/templates/Expense/Update.html new file mode 100644 index 0000000..e14cab8 --- /dev/null +++ b/Movement/templates/Expense/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Product/Create/client.html b/Movement/templates/Product/Create/client.html new file mode 100644 index 0000000..57f165a --- /dev/null +++ b/Movement/templates/Product/Create/client.html @@ -0,0 +1,4 @@ +{% for cl in form.client.field.queryset %} + +

{{ cl.first_name }} {{ cl.last_name }}

+{% endfor %}
\ No newline at end of file diff --git a/Movement/templates/Product/Create/date.html b/Movement/templates/Product/Create/date.html new file mode 100644 index 0000000..a4b6958 --- /dev/null +++ b/Movement/templates/Product/Create/date.html @@ -0,0 +1,6 @@ +

\ No newline at end of file diff --git a/Movement/templates/Product/Create/index.html b/Movement/templates/Product/Create/index.html new file mode 100644 index 0000000..6c312f7 --- /dev/null +++ b/Movement/templates/Product/Create/index.html @@ -0,0 +1,33 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} + +
+

Cadastrar

+
+
+
+
+
+ {% csrf_token %} +
+
{% include 'Product/Create/client.html' %}
+
+
+
{% include 'Product/Create/date.html' %}
+
{{ form.quantity.label }}
{{ form.quantity }}
+
+
+
{% include 'Product/Create/product.html' %}
+
{% include 'Product/Create/pay_method.html' %}
+
{% include 'Product/Create/professional.html' %}
+
+ +
+
+
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Product/Create/pay_method.html b/Movement/templates/Product/Create/pay_method.html new file mode 100644 index 0000000..f603467 --- /dev/null +++ b/Movement/templates/Product/Create/pay_method.html @@ -0,0 +1,13 @@ +
Metodo de Pagamento

+
+ {% for Pay in form.pay_method.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Product/Create/product.html b/Movement/templates/Product/Create/product.html new file mode 100644 index 0000000..838483e --- /dev/null +++ b/Movement/templates/Product/Create/product.html @@ -0,0 +1,13 @@ +
Produto

+
+ {% for Pay in form.product.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Product/Create/professional.html b/Movement/templates/Product/Create/professional.html new file mode 100644 index 0000000..323506a --- /dev/null +++ b/Movement/templates/Product/Create/professional.html @@ -0,0 +1,13 @@ +
Professional

+
+ {% for prof in form.professional.field.queryset %} +
+
+
+ {% endfor %} +

\ No newline at end of file diff --git a/Movement/templates/Product/Create/quantity.html b/Movement/templates/Product/Create/quantity.html new file mode 100644 index 0000000..eadfb9d --- /dev/null +++ b/Movement/templates/Product/Create/quantity.html @@ -0,0 +1,8 @@ +
+
+
+
+

\ No newline at end of file diff --git a/Movement/templates/Product/Delete.html b/Movement/templates/Product/Delete.html new file mode 100644 index 0000000..83943d8 --- /dev/null +++ b/Movement/templates/Product/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Movement/templates/Product/Detail.html b/Movement/templates/Product/Detail.html new file mode 100644 index 0000000..6b4aa78 --- /dev/null +++ b/Movement/templates/Product/Detail.html @@ -0,0 +1,15 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.name }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Product/List.html b/Movement/templates/Product/List.html new file mode 100644 index 0000000..ad26af1 --- /dev/null +++ b/Movement/templates/Product/List.html @@ -0,0 +1,75 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Produtos


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} +{#
#} +{# #} +{# Criar #} +{#
#} +{# {% endif %}#} +
+ +
+ + + + + + + + + + +{# #} + + + + + + {% for Prod in Products %} + + + + + + + +{# #} + + + + {% endfor %} + +
date product pay_method professional quantity gross_value net_value client Ações
{{ Prod.date|date:"d/m/Y" }} {{ Prod.product.name }} {{ Prod.pay_method }} {{ Prod.professional }} {{ Prod.quantity }} {{ Prod.gross_value }} {{ Prod.net_value }} {{ Prod.client }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Movement/templates/Product/Update.html b/Movement/templates/Product/Update.html new file mode 100644 index 0000000..e14cab8 --- /dev/null +++ b/Movement/templates/Product/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Stock/Create.html b/Movement/templates/Stock/Create.html new file mode 100644 index 0000000..5ced28a --- /dev/null +++ b/Movement/templates/Stock/Create.html @@ -0,0 +1,19 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} + +
+

Cadastrar Banco

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Stock/Delete.html b/Movement/templates/Stock/Delete.html new file mode 100644 index 0000000..83943d8 --- /dev/null +++ b/Movement/templates/Stock/Delete.html @@ -0,0 +1,18 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Deletar da Marcar

+
+
+

Tem certeza que quer deletar ?

+ {{ object.name }} +
+ {% csrf_token %} + +
+
+
+ Cancelar e Voltar +
+{% endblock %} diff --git a/Movement/templates/Stock/Detail.html b/Movement/templates/Stock/Detail.html new file mode 100644 index 0000000..6b4aa78 --- /dev/null +++ b/Movement/templates/Stock/Detail.html @@ -0,0 +1,15 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Detalhes do Banco

+
+
+

{{ object.name }}

+

Descrição: {{ object.description }}

+{# Editar #} +
+
+ Cancelar e Voltar +
+{% endblock %} \ No newline at end of file diff --git a/Movement/templates/Stock/List.html b/Movement/templates/Stock/List.html new file mode 100644 index 0000000..515c595 --- /dev/null +++ b/Movement/templates/Stock/List.html @@ -0,0 +1,72 @@ +{% extends "BaseLogin.html" %} +{% block title %} List {% endblock %} +{% block content %} +

Entrada de Estoque


+
+
+
+
+ + +
+
+
+{# {% if perms.brands.add_brands %}#} + +{# {% endif %}#} +
+ +
+ + + + + + + + + + + + + + + {% for Stock in Stocks %} + + + + + + + + + + + {% endfor %} + +
date product quantity unit_value gross_value bank notes Ações
{{ Stock.date|date:"d/m/Y" }} {{ Stock.product.name }} {{ Stock.quantity }} {{ Stock.unit_value }} {{ Stock.gross_value }} {{ Stock.bank }} {{ Stock.notes }} + + + +{# {% if perms.brands.change_brands %}#} + + + +{# {% endif %}#} +{# {% if perms.brands.delete_brands %}#} + + + +{# {% endif %}#} +
+
+ {% include 'components/_pagination.html' %} +{% endblock %} diff --git a/Movement/templates/Stock/Update.html b/Movement/templates/Stock/Update.html new file mode 100644 index 0000000..e14cab8 --- /dev/null +++ b/Movement/templates/Stock/Update.html @@ -0,0 +1,17 @@ +{% extends "BaseLogin.html" %} +{% block title %} Bank Accounts List {% endblock %} +{% block content %} +
+

Editar Bancos

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ Cancelar e Voltar +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Movement/tests.py b/Movement/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/Movement/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Setup/__pycache__/__init__.cpython-312.pyc b/Setup/__pycache__/__init__.cpython-312.pyc index 94b147decf3104041799f53658fb4a9521713b5d..329fbad7139aab19437675a39eeafb149ca14488 100644 GIT binary patch delta 37 rcmbQiIE|6}G%qg~0}vD(d_9rdn9+2iy%eW&YF`)k3o8Hs diff --git a/Setup/__pycache__/__init__.cpython-313.pyc b/Setup/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 9ad52868fc33f70ff0e868955c8285c53ab91b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmey&%ge<81U<&DGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~i7epzCXetCJh zeoAUuVrfo^esF3@X@P!xd}dx|NqoFsLFFwDo80`A(wtPgB37Ulkdeh8#z$sGM#ds$ GAPWG~%N&>h diff --git a/Setup/__pycache__/settings.cpython-312.pyc b/Setup/__pycache__/settings.cpython-312.pyc index c0acffeeb82d1f787045d564bca23c34981fd5f8..775b12d14d938a594a67b2e6d2460993fa4a62e6 100644 GIT binary patch delta 155 zcmcaB`dyUoG%qg~0}w=R{gENWw~_AxleAHlSaND!Nor9+YO!8I3^sbH^wEk wIJ+djAjTPNY(Q%9-WVkXd+hAKNn~HFIaHn9$w_6YIdp~0gVzQ4%b}}e z5%AZ1JjtUaav7-W0aZXZ$Q5*xTtytYhL*`v_g3+?au*W7R1OuRYjQSr9L?z3+`dUT zgq^;{S;RcV9fxO_ZERqoI9TQOj=4K(fLK-3o@Q{iqY!7Jd57!UV1t{OyvMKe_W`{H z7JDYaoMwRWp5kbx!NIR{pn*G0$KQc>%p5q5W&bD$s@bvmv5&I|I%ZG6h5!Zy$F#JL zEu4ibjLka-nA`8`I;U&4!hlCUOzZoQI8Mz9u7*1Dff@QS$X{fw#-h) z+UTs5+QqP&TwA}-m*8j3W!E0A^J^OqfLJfByZH__984^1^8W}Ra&>t3D_+SsiwBm6iDH893s$=J*^Xz@Dy-%6K4sV2JeiMIEC8y!X|XB^XgFP zyn;63|FT7t9&T8Ezt~eaCTLH-PjuTACN>=0vvlZCeht~4czg&HYTFu zcVyqeNb703;@A4Kv4%<9M_+4cM>DiuzgNRX*EzVr|M6?_;~r>EV!SZ$r>`|o@Aoj# zI-gsJTF&Yoap%N9t_TROwI<})bmQ<4KxYVEY`k#eLJzB&B6!hYcCSyIL%w^aiglac z)Vk17=9Y$a)r;z8S2J8jP!;=N&s2!&#)N=ZFJAZJvJB6HEPHVaE?-^SBVjljFCokR z<>T`SwoUyAdoc@c9K-PvnU{ z)jDbe3m8yc$YXY@l}b%|F192u-D))2@@}hEZq&D+d!(IaO>9fZ%RWcjRbRhWEsK63 zddZ5|7JawKD~P-8$8u9d=y{`6k)MgRDhL};zidscZ|{oRl3Z?7BrsUrk>nQ*sJX;0 z1YBKvQ1@c~s{H~YZ-eEs@7+sH)_yo%a!0CE#emO@mjQdeB5jGgwYCi28}e3Fs#UyX ztpODssLqdbzURkwS#QU?5ByNeCM4{7K}kV=wU& z9A;m~k4On1{y$W93C2;Frs)qMhK~HFK+#t|#He)km&D&5y-O{hq?Z4cy8SM7_at@q zU25$lwKhzQGE}BT51CPnO0vV~ui333`;ke`hlZJt`9vlJk{p#?8m31HDkssWb4$Ol zr@6xWH20B;+|G=`u^jUunTp0nVU`UIlcO6{?z^{C7VJhdr}O-2w(#bslkA-j(Qp=Y zqJhp;DtYN`_Qfb10$d^>n$yJ7X`(eI7TKlHTdFWxq2>xh_I>*1F!?@pX_$BqVaG;k zDsy?roM!TG3MZN6Vd^x!I82_hi*Mp5>`mAML*?(irRHImYz_pA%RrpwZ=6sIgon)i E7f#)XNB{r; diff --git a/Setup/__pycache__/urls.cpython-312.pyc b/Setup/__pycache__/urls.cpython-312.pyc index b3db99d4d393dd37854fee3cbd008604569006b6..923a460c17906663c47a6ec04fb21ea847bfe805 100644 GIT binary patch literal 1360 zcma)*O-~a+7{_PZ=^NV?DQ|rNM2Rugr0Bt*2vn%v1W5=XX?j_A2iSJI+stl>?9ChA z?1}Uv82ki&1uvV-$w`a{4@OTIZl0W(w%UbFbPmtX|M~src``FQA5*Cjz{ZCk5gmsC z_{zm#Wcrhf_Ywf7Km(d&fTmQHBt8!rp=P)mZo(>*KnS3)7DiHCR2vlNed|fT=ISie z%ZYW6MW{v2SQkEgEGk$mki`W{1hNsqf=em8x zH-xCns%vf43Gxjgnywrw*m1-nB(9+z3-|T}lS}}BHb;o*N zaVY&%a??6mtSAODH3hqQrVy|C_wfF(1b6N@mfCQquiAP*=AQnZ+}u^y014l-S1n}P zD9G1GTg5m{Yjwpuuu7_BI#_?nA2gtHKgn+wLzcl2o`$yWAPRYw$}F<~!$H`z-+>E; z!LR$3<=U=|uwC0jM+iHXS$m4?hGVsA6}D-Fw~<}jK~B3><26dHV;Wy+vdc5j8lGYm z_-nSmv2Y%iBVQk>2hcJwA?8ZxbO+aPcm=zyvZU--68NU*K^%z z@5U<0tr1w}dbS($<{y*n3W2Ntp}j<|yW}mblfnjp6~5ql_qKPlO!7|%T<1F5S@H@c kGQLRQJ+3b|EOZXMxg|37kibX(YIt5qkA_~$c!KTqH_Rt?_5c6? literal 1091 zcmb7DK~K~`6rOflcIgTjPaX%2S(;!QFkBjtC`u$Tny7?i-DD~4>~7aira0^s-J4q z%i!_=f)f;?HVU;+k2R{dbxp;!xJHe(LCvAUDRsmdnhtpSa6`ks%sMu%1 zY=#r3+9+48_4RgRuWmQ|11PpOUp&PDOL|d10Z}Q(=s`tS=29<^-6&fFs2Z;g4n@at2JNh8Zb)capF_5(o%8D zw$@@_h`T!=EF44q8w(}}gexLW!MLLH1hD>xjjDHi(N!RG_8*Kkk|55)DCvUS6b>3@1qYSS|mbLSRDgVrNCuV&Y46Hh}RHDFb*|zmf z-Ah}`O+TbjV(Yn~9M9`z_5MVWcXPBq`4B8F_C2#F^Ln=nx2D_8r%R%sPx5Go!(&5v zbBsMVAj3_SHbf*zZYWK8bL^ZyqDxptKku!1olQZw=xmW)!X-;OkBE2!7w~uDIq!Fh zhtW|ePP&&jmMIIfnB3>r0Ykkru?*9BP1CdseMU2WV5H4{L3b`DkU4pH^JwYBJN8ai ik5|u(+nll`6n1h+@0z16Vq!vW5nLmcSX8DRT4+G)1y@v zwz9PY>R*80a}!w@m=H^=iXGdRs3#;O@Q}Q`Jb&-|KKotG%{f4>_UE6&`!xW*tB-2c z%i!u*2A@C|Fwix+=C-kAG83w}wq4t@n6+gy8-g8c33RO;vvZ>YxPEu$uj49eo0CZI zvv+K{d!}tna@9X%vc{n9Ht?}5cHVSe!hojzXpl23BAUWJWw1*`p23XKeG&-Iab6Dz z+|5~>VIc@h`7VqjE+C`1ARI~z4h4k=5gBn0Zb*QHG6JJiVkHyQEGC!}$O-WsDA!Pk zjQa?MG~iyikJACI+66R0Bt>m+6$zR}0Y|DB$@UyM&)?%jVsYQu$kRX*)@?QDLk~U) zLx@utB^hPHhp^9R0+YiY&ayH&p{eUv%X+0i37AqSw@R_YSx-P*Rb{qiV^r3;U&&{=}}yad^t`iey>4qD}c{wtF!hAZcLLsihJcx8=Id z4|OkHqp)$9M5${QmU6tPm(@ozI*$r)H2YLqtoOZgXN!8TCvQ!!SIn10r9Q!;Jtl_@ z6wN92%#s;qtF*-Y+zF6`QZ`Ju_w0RINg>N#-$ diff --git a/Setup/__pycache__/wsgi.cpython-312.pyc b/Setup/__pycache__/wsgi.cpython-312.pyc index 1a42becc2abd2155a245fd35cc3a06d710dc0a94..b8fd61245dc04e81847aaa80a779bd6b0f297e56 100644 GIT binary patch delta 40 ucmeyv@{5K0G%qg~0}vD(e7%wT10$p1%O=vOy21S-_-%xmyOAVTuG0=H>$a#3ofrgrfG?Vd!!+j1@ z;B*?Qv<`_dgP0D7VV?6e3Qa1-aA^BIvmBXJKvQAqvN}Meu+39VM=6JUR0EK)F}Z%s zSS%y$#V4UiTKoh8%Qoxtf3ps<+^pjBjinqyC`h2QLnGUOwMFYuB@T8jMLrqC3s983a~95R{J8<*m64FS6>rs;P1< zP1yu7O_dZSv4t^=!U;EJ>l)ujG^_NKcbHucD~iGjuCrLpS8Mk2({lOAe3M(MZPV@F zKzh?2e_f36Kc|Tsv)c%hU+BSi Home

+

{{ ok }}

{% endblock %} \ No newline at end of file diff --git a/Templates/components/_footer.html b/Templates/components/_footer.html index 08d87c6..5cfaa06 100644 --- a/Templates/components/_footer.html +++ b/Templates/components/_footer.html @@ -1,6 +1,6 @@