update
This commit is contained in:
parent
11e1a9d5e0
commit
569fa3f7fb
@ -1,72 +1,164 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
from . import views
|
from . import views
|
||||||
from allauth.account import views as allauth_views
|
from allauth.account import views as allauth_views
|
||||||
from django.conf.urls import (
|
from django.conf.urls import handler400, handler403, handler404, handler500
|
||||||
handler400, handler403, handler404, handler500
|
|
||||||
)
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# main URLs
|
# main URLs
|
||||||
path('', views.HomeView.as_view(), name='landing_page'),
|
path("", views.HomeView.as_view(), name="landing_page"),
|
||||||
path('welcome/', views.WelcomeView.as_view(), name='welcome'),
|
path("welcome/", views.WelcomeView.as_view(), name="welcome"),
|
||||||
|
|
||||||
# Accounts URLs
|
# Accounts URLs
|
||||||
path('login/', views.Login.as_view(), name='account_login'),
|
path("login/", views.Login.as_view(), name="account_login"),
|
||||||
path('logout/', allauth_views.LogoutView.as_view(template_name='account/logout.html'), name='account_logout'),
|
path(
|
||||||
# path('signup/', allauth_views.SignupView.as_view(template_name='account/signup.html'), name='account_signup'),
|
"logout/",
|
||||||
path('signup/', views.dealer_signup, name='account_signup'),
|
allauth_views.LogoutView.as_view(template_name="account/logout.html"),
|
||||||
path('password/change/',
|
name="account_logout",
|
||||||
allauth_views.PasswordChangeView.as_view(template_name='account/password_change.html'),
|
),
|
||||||
name='account_change_password'),
|
# path('signup/', allauth_views.SignupView.as_view(template_name='account/signup.html'), name='account_signup'),
|
||||||
path('password/reset/',
|
path("signup/", views.dealer_signup, name="account_signup"),
|
||||||
allauth_views.PasswordResetView.as_view(template_name='account/password_reset.html'),
|
path(
|
||||||
name='account_reset_password'),
|
"password/change/",
|
||||||
path('password/reset/done/',
|
allauth_views.PasswordChangeView.as_view(
|
||||||
allauth_views.PasswordResetDoneView.as_view(template_name='account/password_reset_done.html'),
|
template_name="account/password_change.html"
|
||||||
name='account_password_reset_done'),
|
),
|
||||||
path('login/code/', allauth_views.RequestLoginCodeView.as_view(template_name='account/request_login_code.html')),
|
name="account_change_password",
|
||||||
#Dashboards
|
),
|
||||||
path('dashboards/accounting/', views.AccountingDashboard.as_view(), name='accounting'),
|
path(
|
||||||
path('test/', views.TestView.as_view(), name='test'),
|
"password/reset/",
|
||||||
|
allauth_views.PasswordResetView.as_view(
|
||||||
|
template_name="account/password_reset.html"
|
||||||
|
),
|
||||||
|
name="account_reset_password",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"password/reset/done/",
|
||||||
|
allauth_views.PasswordResetDoneView.as_view(
|
||||||
|
template_name="account/password_reset_done.html"
|
||||||
|
),
|
||||||
|
name="account_password_reset_done",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"login/code/",
|
||||||
|
allauth_views.RequestLoginCodeView.as_view(
|
||||||
|
template_name="account/request_login_code.html"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
# Dashboards
|
||||||
|
path(
|
||||||
|
"dashboards/accounting/", views.AccountingDashboard.as_view(), name="accounting"
|
||||||
|
),
|
||||||
|
path("test/", views.TestView.as_view(), name="test"),
|
||||||
# Dealer URLs
|
# Dealer URLs
|
||||||
path('dealers/<int:pk>/', views.DealerDetailView.as_view(), name='dealer_detail'),
|
path("dealers/<int:pk>/", views.DealerDetailView.as_view(), name="dealer_detail"),
|
||||||
path('dealers/<int:pk>/update/', views.DealerUpdateView.as_view(), name='dealer_update'),
|
path(
|
||||||
path('dealers/activity/', views.UserActivityLogListView.as_view(), name='dealer_activity'),
|
"dealers/<int:pk>/update/",
|
||||||
|
views.DealerUpdateView.as_view(),
|
||||||
|
name="dealer_update",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"dealers/activity/",
|
||||||
|
views.UserActivityLogListView.as_view(),
|
||||||
|
name="dealer_activity",
|
||||||
|
),
|
||||||
# path('dealers/<int:pk>/delete/', views.DealerDeleteView.as_view(), name='dealer_delete'),
|
# path('dealers/<int:pk>/delete/', views.DealerDeleteView.as_view(), name='dealer_delete'),
|
||||||
|
|
||||||
# CRM URLs
|
# CRM URLs
|
||||||
path('customers/', views.CustomerListView.as_view(), name='customer_list'),
|
path("customers/", views.CustomerListView.as_view(), name="customer_list"),
|
||||||
path('customers/<int:pk>/', views.CustomerDetailView.as_view(), name='customer_detail'),
|
path(
|
||||||
path('customers/create/', views.CustomerCreateView.as_view(), name='customer_create'),
|
"customers/<int:pk>/",
|
||||||
path('customers/<int:pk>/update/', views.CustomerUpdateView.as_view(), name='customer_update'),
|
views.CustomerDetailView.as_view(),
|
||||||
path('customers/<int:pk>/delete/', views.delete_customer, name='customer_delete'),
|
name="customer_detail",
|
||||||
path('customers/<int:customer_id>/opportunities/create/', views.OpportunityCreateView.as_view(), name='create_opportunity'),
|
),
|
||||||
path('customers/<int:pk>/add-note/', views.add_note_to_customer, name='add_note_to_customer'),
|
path(
|
||||||
|
"customers/create/", views.CustomerCreateView.as_view(), name="customer_create"
|
||||||
path('crm/leads/', views.LeadListView.as_view(), name='lead_list'),
|
),
|
||||||
path('crm/leads/<int:pk>/view/', views.LeadDetailView.as_view(), name='lead_detail'),
|
path(
|
||||||
path('crm/leads/create/', views.LeadCreateView.as_view(), name='lead_create'),
|
"customers/<int:pk>/update/",
|
||||||
path('crm/leads/<int:pk>/update/', views.LeadUpdateView.as_view(), name='lead_update'),
|
views.CustomerUpdateView.as_view(),
|
||||||
path('crm/leads/<int:pk>/delete/', views.LeadDeleteView.as_view(), name='lead_delete'),
|
name="customer_update",
|
||||||
path('crm/leads/<int:pk>/add-note/', views.add_note_to_lead, name='add_note'),
|
),
|
||||||
path('crm/leads/<int:pk>/add-activity/', views.add_activity_to_lead, name='add_activity'),
|
path("customers/<int:pk>/delete/", views.delete_customer, name="customer_delete"),
|
||||||
path('crm/opportunities/create/', views.OpportunityCreateView.as_view(), name='opportunity_create'),
|
path(
|
||||||
path('crm/opportunities/<int:pk>/', views.OpportunityDetailView.as_view(), name='opportunity_detail'),
|
"customers/<int:customer_id>/opportunities/create/",
|
||||||
path('crm/opportunities/<int:pk>/edit/', views.OpportunityUpdateView.as_view(), name='update_opportunity'),
|
views.OpportunityCreateView.as_view(),
|
||||||
path('crm/opportunities/', views.OpportunityListView.as_view(), name='opportunity_list'),
|
name="create_opportunity",
|
||||||
path('crm/opportunities/<int:pk>/delete/', views.delete_opportunity, name='delete_opportunity'),
|
),
|
||||||
|
path(
|
||||||
|
"customers/<int:pk>/add-note/",
|
||||||
|
views.add_note_to_customer,
|
||||||
|
name="add_note_to_customer",
|
||||||
|
),
|
||||||
|
path("crm/leads/", views.LeadListView.as_view(), name="lead_list"),
|
||||||
|
path(
|
||||||
|
"crm/leads/<int:pk>/view/", views.LeadDetailView.as_view(), name="lead_detail"
|
||||||
|
),
|
||||||
|
path("crm/leads/create/", views.LeadCreateView.as_view(), name="lead_create"),
|
||||||
|
path(
|
||||||
|
"crm/leads/<int:pk>/update/", views.LeadUpdateView.as_view(), name="lead_update"
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/leads/<int:pk>/delete/", views.LeadDeleteView.as_view(), name="lead_delete"
|
||||||
|
),
|
||||||
|
path("crm/leads/<int:pk>/add-note/", views.add_note_to_lead, name="add_note"),
|
||||||
|
path(
|
||||||
|
"crm/leads/<int:pk>/add-activity/",
|
||||||
|
views.add_activity_to_lead,
|
||||||
|
name="add_activity",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/opportunities/create/",
|
||||||
|
views.OpportunityCreateView.as_view(),
|
||||||
|
name="opportunity_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/opportunities/<int:pk>/",
|
||||||
|
views.OpportunityDetailView.as_view(),
|
||||||
|
name="opportunity_detail",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/opportunities/<int:pk>/edit/",
|
||||||
|
views.OpportunityUpdateView.as_view(),
|
||||||
|
name="update_opportunity",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/opportunities/",
|
||||||
|
views.OpportunityListView.as_view(),
|
||||||
|
name="opportunity_list",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"crm/opportunities/<int:pk>/delete/",
|
||||||
|
views.delete_opportunity,
|
||||||
|
name="delete_opportunity",
|
||||||
|
),
|
||||||
# path('crm/opportunities/<int:pk>/logs/', views.OpportunityLogsView.as_view(), name='opportunity_logs'),
|
# path('crm/opportunities/<int:pk>/logs/', views.OpportunityLogsView.as_view(), name='opportunity_logs'),
|
||||||
path('crm/notifications/', views.NotificationListView.as_view(), name='notifications_history'),
|
path(
|
||||||
path('crm/fetch_notifications/', views.fetch_notifications, name='fetch_notifications'),
|
"crm/notifications/",
|
||||||
path('crm/notifications/<int:pk>/mark_as_read/', views.mark_notification_as_read, name='mark_notification_as_read'),
|
views.NotificationListView.as_view(),
|
||||||
|
name="notifications_history",
|
||||||
#Vendor URLs
|
),
|
||||||
path('vendors', views.VendorListView.as_view(), name='vendor_list'),
|
path(
|
||||||
path('vendors/<int:pk>/', views.VendorDetailView.as_view(), name='vendor_detail'),
|
"crm/fetch_notifications/",
|
||||||
path('vendors/create/', views.VendorCreateView.as_view(), name='vendor_create'),
|
views.fetch_notifications,
|
||||||
path('vendors/<int:pk>/update/', views.VendorUpdateView.as_view(), name='vendor_update'),
|
name="fetch_notifications",
|
||||||
path('vendors/<int:pk>/delete/', views.VendorDetailView.as_view(), name='vendor_delete'),
|
),
|
||||||
|
path(
|
||||||
|
"crm/notifications/<int:pk>/mark_as_read/",
|
||||||
|
views.mark_notification_as_read,
|
||||||
|
name="mark_notification_as_read",
|
||||||
|
),
|
||||||
|
# Vendor URLs
|
||||||
|
path("vendors", views.VendorListView.as_view(), name="vendor_list"),
|
||||||
|
path("vendors/<int:pk>/", views.VendorDetailView.as_view(), name="vendor_detail"),
|
||||||
|
path("vendors/create/", views.VendorCreateView.as_view(), name="vendor_create"),
|
||||||
|
path(
|
||||||
|
"vendors/<int:pk>/update/",
|
||||||
|
views.VendorUpdateView.as_view(),
|
||||||
|
name="vendor_update",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"vendors/<int:pk>/delete/",
|
||||||
|
views.VendorDetailView.as_view(),
|
||||||
|
name="vendor_delete",
|
||||||
|
),
|
||||||
# Car URLs
|
# Car URLs
|
||||||
path("cars/inventory/", views.CarInventory.as_view(), name="car_inventory_all"),
|
path("cars/inventory/", views.CarInventory.as_view(), name="car_inventory_all"),
|
||||||
path(
|
path(
|
||||||
@ -126,113 +218,314 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
path("cars/inventory/search/", views.SearchCodeView.as_view(), name="car_search"),
|
path("cars/inventory/search/", views.SearchCodeView.as_view(), name="car_search"),
|
||||||
# path('cars/<int:car_pk>/colors/<int:pk>/update/',views.CarColorUpdateView.as_view(),name='color_update'),
|
# path('cars/<int:car_pk>/colors/<int:pk>/update/',views.CarColorUpdateView.as_view(),name='color_update'),
|
||||||
|
path("cars/reserve/<int:car_id>/", views.reserve_car_view, name="reserve_car"),
|
||||||
path('cars/reserve/<int:car_id>/', views.reserve_car_view, name='reserve_car'),
|
path(
|
||||||
path('reservations/<int:reservation_id>/', views.manage_reservation, name='reservations'),
|
"reservations/<int:reservation_id>/",
|
||||||
path('cars/<int:car_pk>/add-custom-card/', views.CustomCardCreateView.as_view(), name='add_custom_card'),
|
views.manage_reservation,
|
||||||
|
name="reservations",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"cars/<int:car_pk>/add-custom-card/",
|
||||||
|
views.CustomCardCreateView.as_view(),
|
||||||
|
name="add_custom_card",
|
||||||
|
),
|
||||||
# Sales URLs quotation_create
|
# Sales URLs quotation_create
|
||||||
path('sales/quotations/create/', views.QuotationCreateView.as_view(), name='quotation_create'),
|
path(
|
||||||
path('sales/quotations/<int:pk>/', views.QuotationDetailView.as_view(), name='quotation_detail'),
|
"sales/quotations/create/",
|
||||||
path('sales/quotations/', views.QuotationListView.as_view(), name='quotation_list'),
|
views.QuotationCreateView.as_view(),
|
||||||
path('sales/quotations/<int:pk>/confirm/', views.confirm_quotation, name='confirm_quotation'),
|
name="quotation_create",
|
||||||
path('sales/orders/detail/<int:order_id>/', views.SalesOrderDetailView.as_view(), name='order_detail'),
|
),
|
||||||
path('quotation/<int:quotation_id>/pdf/', views.download_quotation_pdf, name='quotation_pdf'),
|
path(
|
||||||
path('generate_invoice/<int:pk>/', views.generate_invoice, name='generate_invoice'),
|
"sales/quotations/<int:pk>/",
|
||||||
path('sales/quotations/<int:pk>/mark_quotation/', views.mark_quotation, name='mark_quotation'),
|
views.QuotationDetailView.as_view(),
|
||||||
path('sales/quotations/<int:pk>/post_quotation/', views.post_quotation, name='post_quotation'),
|
name="quotation_detail",
|
||||||
path('sales/quotations/<int:pk>/invoice_detail/', views.invoice_detail, name='invoice_detail'),
|
),
|
||||||
path('subscriptions', views.SubscriptionPlans.as_view(), name='subscriptions'),
|
path("sales/quotations/", views.QuotationListView.as_view(), name="quotation_list"),
|
||||||
#Payment URLs
|
path(
|
||||||
# path('sales/quotations/<int:pk>/payment/', views.PaymentCreateView.as_view(), name='payment_create'),
|
"sales/quotations/<int:pk>/confirm/",
|
||||||
path('sales/quotations/<int:pk>/payment/', views.payment_create, name='payment_create'),
|
views.confirm_quotation,
|
||||||
|
name="confirm_quotation",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/orders/detail/<int:order_id>/",
|
||||||
|
views.SalesOrderDetailView.as_view(),
|
||||||
|
name="order_detail",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"quotation/<int:quotation_id>/pdf/",
|
||||||
|
views.download_quotation_pdf,
|
||||||
|
name="quotation_pdf",
|
||||||
|
),
|
||||||
|
path("generate_invoice/<int:pk>/", views.generate_invoice, name="generate_invoice"),
|
||||||
|
path(
|
||||||
|
"sales/quotations/<int:pk>/mark_quotation/",
|
||||||
|
views.mark_quotation,
|
||||||
|
name="mark_quotation",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/quotations/<int:pk>/post_quotation/",
|
||||||
|
views.post_quotation,
|
||||||
|
name="post_quotation",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/quotations/<int:pk>/invoice_detail/",
|
||||||
|
views.invoice_detail,
|
||||||
|
name="invoice_detail",
|
||||||
|
),
|
||||||
|
path("subscriptions", views.SubscriptionPlans.as_view(), name="subscriptions"),
|
||||||
|
# Payment URLs
|
||||||
|
# path('sales/quotations/<int:pk>/payment/', views.PaymentCreateView.as_view(), name='payment_create'),
|
||||||
|
path(
|
||||||
|
"sales/quotations/<int:pk>/payment/",
|
||||||
|
views.payment_create,
|
||||||
|
name="payment_create",
|
||||||
|
),
|
||||||
# Users URLs
|
# Users URLs
|
||||||
path('user/create/', views.UserCreateView.as_view(), name='user_create'),
|
path("user/create/", views.UserCreateView.as_view(), name="user_create"),
|
||||||
path('user/<int:pk>/update/', views.UserUpdateView.as_view(), name='user_update'),
|
path("user/<int:pk>/update/", views.UserUpdateView.as_view(), name="user_update"),
|
||||||
path('user/<int:pk>/', views.UserDetailView.as_view(), name='user_detail'),
|
path("user/<int:pk>/", views.UserDetailView.as_view(), name="user_detail"),
|
||||||
path('user/', views.UserListView.as_view(), name='user_list'),
|
path("user/", views.UserListView.as_view(), name="user_list"),
|
||||||
path('user/<int:pk>/confirm/', views.UserDeleteview, name='user_delete'),
|
path("user/<int:pk>/confirm/", views.UserDeleteview, name="user_delete"),
|
||||||
# Organization URLs
|
# Organization URLs
|
||||||
path('organizations/', views.OrganizationListView.as_view(), name='organization_list'),
|
path(
|
||||||
path('organizations/<int:pk>/', views.OrganizationDetailView.as_view(), name='organization_detail'),
|
"organizations/", views.OrganizationListView.as_view(), name="organization_list"
|
||||||
path('organizations/create/', views.OrganizationCreateView.as_view(), name='organization_create'),
|
),
|
||||||
path('organizations/<int:pk>/update/', views.OrganizationUpdateView.as_view(), name='organization_update'),
|
path(
|
||||||
path('organizations/<int:pk>/delete/', views.OrganizationDeleteView.as_view(), name='organization_delete'),
|
"organizations/<int:pk>/",
|
||||||
|
views.OrganizationDetailView.as_view(),
|
||||||
|
name="organization_detail",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"organizations/create/",
|
||||||
|
views.OrganizationCreateView.as_view(),
|
||||||
|
name="organization_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"organizations/<int:pk>/update/",
|
||||||
|
views.OrganizationUpdateView.as_view(),
|
||||||
|
name="organization_update",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"organizations/<int:pk>/delete/",
|
||||||
|
views.OrganizationDeleteView.as_view(),
|
||||||
|
name="organization_delete",
|
||||||
|
),
|
||||||
# Representative URLs
|
# Representative URLs
|
||||||
path('representatives/', views.RepresentativeListView.as_view(), name='representative_list'),
|
path(
|
||||||
path('representatives/<int:pk>/', views.RepresentativeDetailView.as_view(), name='representative_detail'),
|
"representatives/",
|
||||||
path('representatives/create/', views.RepresentativeCreateView.as_view(), name='representative_create'),
|
views.RepresentativeListView.as_view(),
|
||||||
path('representatives/<int:pk>/update/', views.RepresentativeUpdateView.as_view(), name='representative_update'),
|
name="representative_list",
|
||||||
path('representatives/<int:pk>/delete/', views.RepresentativeDeleteView.as_view(), name='representative_delete'),
|
),
|
||||||
|
path(
|
||||||
#Ledger URLS
|
"representatives/<int:pk>/",
|
||||||
#Bank Account
|
views.RepresentativeDetailView.as_view(),
|
||||||
path('bank_accounts/', views.BankAccountListView.as_view(), name='bank_account_list'),
|
name="representative_detail",
|
||||||
path('bank_accounts/<uuid:pk>/', views.BankAccountDetailView.as_view(), name='bank_account_detail'),
|
),
|
||||||
path('bank_accounts/create/', views.BankAccountCreateView.as_view(), name='bank_account_create'),
|
path(
|
||||||
path('bank_accounts/<uuid:pk>/update/', views.BankAccountUpdateView.as_view(), name='bank_account_update'),
|
"representatives/create/",
|
||||||
path('bank_accounts/<uuid:pk>/delete/', views.bank_account_delete, name='bank_account_delete'),
|
views.RepresentativeCreateView.as_view(),
|
||||||
|
name="representative_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"representatives/<int:pk>/update/",
|
||||||
|
views.RepresentativeUpdateView.as_view(),
|
||||||
|
name="representative_update",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"representatives/<int:pk>/delete/",
|
||||||
|
views.RepresentativeDeleteView.as_view(),
|
||||||
|
name="representative_delete",
|
||||||
|
),
|
||||||
|
# Ledger URLS
|
||||||
|
# Bank Account
|
||||||
|
path(
|
||||||
|
"bank_accounts/", views.BankAccountListView.as_view(), name="bank_account_list"
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"bank_accounts/<uuid:pk>/",
|
||||||
|
views.BankAccountDetailView.as_view(),
|
||||||
|
name="bank_account_detail",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"bank_accounts/create/",
|
||||||
|
views.BankAccountCreateView.as_view(),
|
||||||
|
name="bank_account_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"bank_accounts/<uuid:pk>/update/",
|
||||||
|
views.BankAccountUpdateView.as_view(),
|
||||||
|
name="bank_account_update",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"bank_accounts/<uuid:pk>/delete/",
|
||||||
|
views.bank_account_delete,
|
||||||
|
name="bank_account_delete",
|
||||||
|
),
|
||||||
# Account
|
# Account
|
||||||
path('coa_accounts/', views.AccountListView.as_view(), name='account_list'),
|
path("coa_accounts/", views.AccountListView.as_view(), name="account_list"),
|
||||||
path('coa_accounts/<uuid:pk>/', views.AccountDetailView.as_view(), name='account_detail'),
|
path(
|
||||||
path('coa_accounts/create/', views.AccountCreateView.as_view(), name='account_create'),
|
"coa_accounts/<uuid:pk>/",
|
||||||
path('coa_accounts/<uuid:pk>/update/', views.AccountUpdateView.as_view(), name='account_update'),
|
views.AccountDetailView.as_view(),
|
||||||
path('coa_accounts/<uuid:pk>/delete/', views.account_delete, name='account_delete'),
|
name="account_detail",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"coa_accounts/create/", views.AccountCreateView.as_view(), name="account_create"
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"coa_accounts/<uuid:pk>/update/",
|
||||||
|
views.AccountUpdateView.as_view(),
|
||||||
|
name="account_update",
|
||||||
|
),
|
||||||
|
path("coa_accounts/<uuid:pk>/delete/", views.account_delete, name="account_delete"),
|
||||||
# Estimate
|
# Estimate
|
||||||
path('sales/estimates/', views.EstimateListView.as_view(), name='estimate_list'),
|
path("sales/estimates/", views.EstimateListView.as_view(), name="estimate_list"),
|
||||||
path('sales/estimates/<uuid:pk>/', views.EstimateDetailView.as_view(), name='estimate_detail'),
|
path(
|
||||||
path('sales/estimates/create/', views.create_estimate, name='estimate_create'),
|
"sales/estimates/<uuid:pk>/",
|
||||||
path('sales/estimates/<uuid:pk>/estimate_mark_as/', views.estimate_mark_as, name='estimate_mark_as'),
|
views.EstimateDetailView.as_view(),
|
||||||
path('sales/estimates/<uuid:pk>/preview/', views.EstimatePreviewView.as_view(), name='estimate_preview'),
|
name="estimate_detail",
|
||||||
path('sales/estimates/<uuid:pk>/payment_request/', views.PaymentRequest.as_view(), name='payment_request'),
|
),
|
||||||
path('sales/estimates/<uuid:pk>/send_email', views.send_email_view, name='send_email'),
|
path("sales/estimates/create/", views.create_estimate, name="estimate_create"),
|
||||||
|
path(
|
||||||
|
"sales/estimates/<uuid:pk>/estimate_mark_as/",
|
||||||
|
views.estimate_mark_as,
|
||||||
|
name="estimate_mark_as",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/estimates/<uuid:pk>/preview/",
|
||||||
|
views.EstimatePreviewView.as_view(),
|
||||||
|
name="estimate_preview",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/estimates/<uuid:pk>/payment_request/",
|
||||||
|
views.PaymentRequest.as_view(),
|
||||||
|
name="payment_request",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/estimates/<uuid:pk>/send_email", views.send_email_view, name="send_email"
|
||||||
|
),
|
||||||
# Invoice
|
# Invoice
|
||||||
path('sales/invoices/', views.InvoiceListView.as_view(), name='invoice_list'),
|
path("sales/invoices/", views.InvoiceListView.as_view(), name="invoice_list"),
|
||||||
path('sales/invoices/<uuid:pk>/create/', views.invoice_create, name='invoice_create'),
|
path(
|
||||||
path('sales/invoices/<uuid:pk>/', views.InvoiceDetailView.as_view(), name='invoice_detail'),
|
"sales/invoices/<uuid:pk>/create/", views.invoice_create, name="invoice_create"
|
||||||
path('sales/invoices/<uuid:pk>/preview/', views.InvoicePreviewView.as_view(), name='invoice_preview'),
|
),
|
||||||
path('sales/invoices/<uuid:pk>/invoice_mark_as/', views.invoice_mark_as, name='invoice_mark_as'),
|
path(
|
||||||
path('sales/invoices/<uuid:pk>/draft_invoice_update/', views.DraftInvoiceModelUpdateFormView.as_view(), name='draft_invoice_update'),
|
"sales/invoices/<uuid:pk>/",
|
||||||
path('sales/invoices/<uuid:pk>/approved_invoice_update/', views.ApprovedInvoiceModelUpdateFormView.as_view(), name='approved_invoice_update'),
|
views.InvoiceDetailView.as_view(),
|
||||||
path('sales/invoices/<uuid:pk>/paid_invoice_update/', views.PaidInvoiceModelUpdateFormView.as_view(), name='paid_invoice_update'),
|
name="invoice_detail",
|
||||||
|
),
|
||||||
# path('sales/estimates/<uuid:pk>/preview/', views.EstimatePreviewView.as_view(), name='estimate_preview'),
|
path(
|
||||||
# path('send_email/<uuid:pk>', views.send_email, name='send_email'),
|
"sales/invoices/<uuid:pk>/preview/",
|
||||||
|
views.InvoicePreviewView.as_view(),
|
||||||
#Payment
|
name="invoice_preview",
|
||||||
path('sales/payments/', views.PaymentListView, name='payment_list'),
|
),
|
||||||
path('sales/payments/<uuid:pk>/create/', views.PaymentCreateView, name='payment_create'),
|
path(
|
||||||
path('sales/payments/create/', views.PaymentCreateView, name='payment_create'),
|
"sales/invoices/<uuid:pk>/invoice_mark_as/",
|
||||||
path('sales/payments/<uuid:pk>/payment_details/', views.PaymentDetailView, name='payment_details'),
|
views.invoice_mark_as,
|
||||||
path('sales/payments/<uuid:pk>/payment_mark_as_paid/', views.payment_mark_as_paid, name='payment_mark_as_paid'),
|
name="invoice_mark_as",
|
||||||
# path('sales/payments/<uuid:pk>/update/', views.JournalEntryUpdateView.as_view(), name='payment_update'),
|
),
|
||||||
# path('sales/payments/<uuid:pk>/delete/', views.JournalEntryDeleteView.as_view(), name='payment_delete'),
|
path(
|
||||||
# path('sales/payments/<uuid:pk>/preview/', views.JournalEntryPreviewView.as_view(), name='payment_preview'),
|
"sales/invoices/<uuid:pk>/draft_invoice_update/",
|
||||||
# # Journal
|
views.DraftInvoiceModelUpdateFormView.as_view(),
|
||||||
# path('sales/journal/<uuid:pk>/create/', views.JournalEntryCreateView.as_view(), name='journal_create'),
|
name="draft_invoice_update",
|
||||||
|
),
|
||||||
# Items
|
path(
|
||||||
path('items/services/', views.ItemServiceListView.as_view(), name='item_service_list'),
|
"sales/invoices/<uuid:pk>/approved_invoice_update/",
|
||||||
path('items/services/create/', views.ItemServiceCreateView.as_view(), name='item_service_create'),
|
views.ApprovedInvoiceModelUpdateFormView.as_view(),
|
||||||
path('items/services/<int:pk>/update/', views.ItemServiceUpdateView.as_view(), name='item_service_update'),
|
name="approved_invoice_update",
|
||||||
# Expanese
|
),
|
||||||
path('items/expeneses/', views.ItemExpenseListView.as_view(), name='item_expense_list'),
|
path(
|
||||||
path('items/expeneses/create/', views.ItemExpenseCreateView.as_view(), name='item_expense_create'),
|
"sales/invoices/<uuid:pk>/paid_invoice_update/",
|
||||||
path('items/expeneses/<uuid:pk>/update/', views.ItemExpenseUpdateView.as_view(), name='item_expense_update'),
|
views.PaidInvoiceModelUpdateFormView.as_view(),
|
||||||
# Bills
|
name="paid_invoice_update",
|
||||||
path('items/bills/', views.BillListView.as_view(), name='bill_list'),
|
),
|
||||||
path('items/bills/create/', views.BillCreateView.as_view(), name='bill_create'),
|
# path('sales/estimates/<uuid:pk>/preview/', views.EstimatePreviewView.as_view(), name='estimate_preview'),
|
||||||
# path('items/bills/<uuid:pk>/update/', views.ItemExpenseUpdateView.as_view(), name='item_expense_update'),
|
# path('send_email/<uuid:pk>', views.send_email, name='send_email'),
|
||||||
|
# Payment
|
||||||
|
path("sales/payments/", views.PaymentListView, name="payment_list"),
|
||||||
|
path(
|
||||||
|
"sales/payments/<uuid:pk>/create/",
|
||||||
|
views.PaymentCreateView,
|
||||||
|
name="payment_create",
|
||||||
|
),
|
||||||
|
path("sales/payments/create/", views.PaymentCreateView, name="payment_create"),
|
||||||
|
path(
|
||||||
|
"sales/payments/<uuid:pk>/payment_details/",
|
||||||
|
views.PaymentDetailView,
|
||||||
|
name="payment_details",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"sales/payments/<uuid:pk>/payment_mark_as_paid/",
|
||||||
|
views.payment_mark_as_paid,
|
||||||
|
name="payment_mark_as_paid",
|
||||||
|
),
|
||||||
|
# path('sales/payments/<uuid:pk>/update/', views.JournalEntryUpdateView.as_view(), name='payment_update'),
|
||||||
|
# path('sales/payments/<uuid:pk>/delete/', views.JournalEntryDeleteView.as_view(), name='payment_delete'),
|
||||||
|
# path('sales/payments/<uuid:pk>/preview/', views.JournalEntryPreviewView.as_view(), name='payment_preview'),
|
||||||
|
# # Journal
|
||||||
|
# path('sales/journal/<uuid:pk>/create/', views.JournalEntryCreateView.as_view(), name='journal_create'),
|
||||||
|
# Items
|
||||||
|
path(
|
||||||
|
"items/services/", views.ItemServiceListView.as_view(), name="item_service_list"
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/services/create/",
|
||||||
|
views.ItemServiceCreateView.as_view(),
|
||||||
|
name="item_service_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/services/<int:pk>/update/",
|
||||||
|
views.ItemServiceUpdateView.as_view(),
|
||||||
|
name="item_service_update",
|
||||||
|
),
|
||||||
|
# Expanese
|
||||||
|
path(
|
||||||
|
"items/expeneses/",
|
||||||
|
views.ItemExpenseListView.as_view(),
|
||||||
|
name="item_expense_list",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/expeneses/create/",
|
||||||
|
views.ItemExpenseCreateView.as_view(),
|
||||||
|
name="item_expense_create",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/expeneses/<uuid:pk>/update/",
|
||||||
|
views.ItemExpenseUpdateView.as_view(),
|
||||||
|
name="item_expense_update",
|
||||||
|
),
|
||||||
|
# Bills
|
||||||
|
path("items/bills/", views.BillListView.as_view(), name="bill_list"),
|
||||||
|
path("items/bills/create/", views.bill_create, name="bill_create"),
|
||||||
|
path(
|
||||||
|
"items/bills/<uuid:pk>/bill_detail/",
|
||||||
|
views.BillDetailView.as_view(),
|
||||||
|
name="bill_detail",
|
||||||
|
),
|
||||||
|
path("items/bills/<uuid:pk>/delete/", views.BillDeleteView, name="bill_delete"),
|
||||||
|
path(
|
||||||
|
"items/bills/<uuid:pk>/in_review/",
|
||||||
|
views.InReviewBillView.as_view(),
|
||||||
|
name="in_review_bill",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/bills/<uuid:pk>/in_approve/",
|
||||||
|
views.ApprovedBillModelView.as_view(),
|
||||||
|
name="in_approve_bill",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/bills/<uuid:pk>/mark_as_approved/",
|
||||||
|
views.bill_mark_as_approved,
|
||||||
|
name="bill_mark_as_approved",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"items/bills/<uuid:pk>/mark_as_paid/",
|
||||||
|
views.bill_mark_as_paid,
|
||||||
|
name="bill_mark_as_paid",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
handler404 = 'inventory.views.custom_page_not_found_view'
|
handler404 = "inventory.views.custom_page_not_found_view"
|
||||||
handler500 = 'inventory.views.custom_error_view'
|
handler500 = "inventory.views.custom_error_view"
|
||||||
handler403 = 'inventory.views.custom_permission_denied_view'
|
handler403 = "inventory.views.custom_permission_denied_view"
|
||||||
handler400 = 'inventory.views.custom_bad_request_view'
|
handler400 = "inventory.views.custom_bad_request_view"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -3006,33 +3006,263 @@ class ItemExpenseListView(ListView):
|
|||||||
|
|
||||||
|
|
||||||
class BillListView(ListView):
|
class BillListView(ListView):
|
||||||
model = ItemModel
|
model = BillModel
|
||||||
template_name = "ledger/bills/bill_list.html"
|
template_name = "ledger/bills/bill_list.html"
|
||||||
context_object_name = "bills"
|
context_object_name = "bills"
|
||||||
paginate_by = 20
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
dealer = get_user_type(self.request)
|
dealer = get_user_type(self.request)
|
||||||
return dealer.entity.get_bills()
|
qs = dealer.entity.get_bills()
|
||||||
|
return qs
|
||||||
|
|
||||||
|
class BillDetailView(LoginRequiredMixin, DetailView):
|
||||||
class BillCreateView(LoginRequiredMixin,SuccessMessageMixin,CreateView):
|
|
||||||
model = BillModel
|
model = BillModel
|
||||||
form_class = BillModelCreateForm
|
template_name = "ledger/bills/bill_detail.html"
|
||||||
template_name = "ledger/bills/bill_form.html"
|
context_object_name = "bill"
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
bill = kwargs.get("object")
|
||||||
|
if bill.get_itemtxs_data():
|
||||||
|
txs = bill.get_itemtxs_data()[0]
|
||||||
|
car_and_item_info = [
|
||||||
|
{
|
||||||
|
"car": models.Car.objects.get(vin=x.item_model.name),
|
||||||
|
"total": models.Car.objects.get(
|
||||||
|
vin=x.item_model.name
|
||||||
|
).finances.cost_price
|
||||||
|
* Decimal(x.quantity),
|
||||||
|
"itemmodel": x,
|
||||||
|
}
|
||||||
|
for x in txs
|
||||||
|
]
|
||||||
|
grand_total = sum(
|
||||||
|
Decimal(
|
||||||
|
models.Car.objects.get(vin=x.item_model.name).finances.cost_price
|
||||||
|
)
|
||||||
|
* Decimal(x.quantity)
|
||||||
|
for x in txs
|
||||||
|
)
|
||||||
|
kwargs["car_and_item_info"] = car_and_item_info
|
||||||
|
kwargs["grand_total"] = grand_total
|
||||||
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
class InReviewBillView(LoginRequiredMixin, UpdateView):
|
||||||
|
model = BillModel
|
||||||
|
form_class = InReviewBillModelUpdateForm
|
||||||
|
template_name = "ledger/bills/bill_update_form.html"
|
||||||
success_url = reverse_lazy("bill_list")
|
success_url = reverse_lazy("bill_list")
|
||||||
success_message = _("Bill created successfully.")
|
success_message = _("Bill updated successfully.")
|
||||||
|
context_object_name = "bill"
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
dealer = get_user_type(self.request)
|
|
||||||
kwargs = super().get_form_kwargs()
|
kwargs = super().get_form_kwargs()
|
||||||
|
dealer = get_user_type(self.request)
|
||||||
kwargs["entity_model"] = dealer.entity
|
kwargs["entity_model"] = dealer.entity
|
||||||
|
kwargs["user_model"] = dealer.entity.admin
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
# def form_valid(self, form):
|
def get_success_url(self):
|
||||||
|
return reverse_lazy("bill_detail", kwargs={"pk": self.kwargs["pk"]})
|
||||||
|
def form_valid(self, form):
|
||||||
|
dealer = get_user_type(self.request)
|
||||||
|
form.instance.entity = dealer.entity
|
||||||
|
self.object.mark_as_review()
|
||||||
|
return super().form_valid(form)
|
||||||
|
class ApprovedBillModelView(LoginRequiredMixin, UpdateView):
|
||||||
|
model = BillModel
|
||||||
|
form_class = ApprovedBillModelUpdateForm
|
||||||
|
template_name = "ledger/bills/bill_update_form.html"
|
||||||
|
success_url = reverse_lazy("bill_list")
|
||||||
|
success_message = _("Bill updated successfully.")
|
||||||
|
context_object_name = "bill"
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
kwargs = super().get_form_kwargs()
|
||||||
|
dealer = get_user_type(self.request)
|
||||||
|
kwargs["entity_model"] = dealer.entity
|
||||||
|
kwargs["user_model"] = dealer.entity.admin
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse_lazy("bill_detail", kwargs={"pk": self.kwargs["pk"]})
|
||||||
|
def form_valid(self, form):
|
||||||
|
dealer = get_user_type(self.request)
|
||||||
|
form.instance.entity = dealer.entity
|
||||||
|
if not self.object.is_approved():
|
||||||
|
self.object.mark_as_approved(user_model=dealer.entity.admin)
|
||||||
|
return super().form_valid(form)
|
||||||
|
|
||||||
|
def bill_mark_as_approved(request,pk):
|
||||||
|
bill = get_object_or_404(BillModel,pk=pk)
|
||||||
|
if request.method == "POST":
|
||||||
|
dealer = get_user_type(request)
|
||||||
|
if bill.is_approved():
|
||||||
|
messages.error(request, _("Bill is already approved."))
|
||||||
|
return redirect("bill_detail",pk=bill.pk)
|
||||||
|
bill.mark_as_approved(user_model=dealer.entity.admin)
|
||||||
|
bill.save()
|
||||||
|
messages.success(request, _("Bill marked as approved successfully."))
|
||||||
|
return redirect("bill_detail",pk=bill.pk)
|
||||||
|
|
||||||
|
def bill_mark_as_paid(request,pk):
|
||||||
|
bill = get_object_or_404(BillModel,pk=pk)
|
||||||
|
if request.method == "POST":
|
||||||
|
dealer = get_user_type(request)
|
||||||
|
if bill.is_paid():
|
||||||
|
messages.error(request, _("Bill is already paid."))
|
||||||
|
return redirect("bill_detail",pk=bill.pk)
|
||||||
|
if bill.amount_due == bill.amount_paid:
|
||||||
|
bill.mark_as_paid(user_model=dealer.entity.admin)
|
||||||
|
bill.save()
|
||||||
|
bill.ledger.lock_journal_entries()
|
||||||
|
bill.ledger.post_journal_entries()
|
||||||
|
bill.ledger.post()
|
||||||
|
bill.ledger.save()
|
||||||
|
messages.success(request, _("Bill marked as paid successfully."))
|
||||||
|
else:
|
||||||
|
messages.error(request, _("Amount paid is not equal to amount due."))
|
||||||
|
return redirect("bill_detail",pk=bill.pk)
|
||||||
|
|
||||||
|
# def get_context_data(self, **kwargs):
|
||||||
# dealer = get_user_type(self.request)
|
# dealer = get_user_type(self.request)
|
||||||
# form.instance.entity = dealer.entity
|
# context = super().get_context_data(**kwargs)
|
||||||
# return super().form_valid(form)
|
# context['entity_model'] = dealer.entity
|
||||||
|
# context['user_model'] = dealer.entity.admin
|
||||||
|
|
||||||
|
# return context
|
||||||
|
# class BillCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
|
||||||
|
# model = BillModel
|
||||||
|
# form_class = BillModelCreateForm
|
||||||
|
# template_name = "ledger/bills/bill_form.html"
|
||||||
|
# success_url = reverse_lazy("bill_list")
|
||||||
|
# success_message = _("Bill created successfully.")
|
||||||
|
# def get_form_kwargs(self):
|
||||||
|
# dealer = get_user_type(self.request)
|
||||||
|
# kwargs = super().get_form_kwargs()
|
||||||
|
# kwargs["entity_model"] = dealer.entity
|
||||||
|
# return kwargs
|
||||||
|
|
||||||
|
# def form_valid(self, form):
|
||||||
|
# dealer = get_user_type(self.request)
|
||||||
|
# form.instance.entity = dealer.entity
|
||||||
|
# ledger = dealer.entity.create_ledger(
|
||||||
|
# name=f"Bill for Vendor {form.instance.vendor.vendor_name}", posted=True
|
||||||
|
# )
|
||||||
|
# form.instance.ledger = ledger
|
||||||
|
# return super().form_valid(form)
|
||||||
|
@login_required
|
||||||
|
def bill_create(request):
|
||||||
|
dealer = get_user_type(request)
|
||||||
|
entity = dealer.entity
|
||||||
|
if request.method == "POST":
|
||||||
|
data = json.loads(request.body)
|
||||||
|
vendor_id = data.get("vendor")
|
||||||
|
terms = data.get("terms")
|
||||||
|
vendor = entity.get_vendors().filter(pk=vendor_id).first()
|
||||||
|
items = data.get("item", [])
|
||||||
|
quantities = data.get("quantity", [])
|
||||||
|
if not all([items, quantities]):
|
||||||
|
return JsonResponse(
|
||||||
|
{"status": "error", "message": "Items and Quantities are required"},
|
||||||
|
status=400,
|
||||||
|
)
|
||||||
|
if isinstance(quantities, list):
|
||||||
|
if "0" in quantities:
|
||||||
|
return JsonResponse(
|
||||||
|
{"status": "error", "message": "Quantity must be greater than zero"}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if int(quantities) <= 0:
|
||||||
|
return JsonResponse(
|
||||||
|
{"status": "error", "message": "Quantity must be greater than zero"}
|
||||||
|
)
|
||||||
|
bill = entity.create_bill(vendor_model=vendor, terms=terms)
|
||||||
|
if isinstance(items, list):
|
||||||
|
item_quantity_map = {}
|
||||||
|
for item, quantity in zip(items, quantities):
|
||||||
|
if item in item_quantity_map:
|
||||||
|
item_quantity_map[item] += int(quantity)
|
||||||
|
else:
|
||||||
|
item_quantity_map[item] = int(quantity)
|
||||||
|
item_list = list(item_quantity_map.keys())
|
||||||
|
quantity_list = list(item_quantity_map.values())
|
||||||
|
items_list = [
|
||||||
|
{"item_id": item_list[i], "quantity": quantity_list[i]}
|
||||||
|
for i in range(len(item_list))
|
||||||
|
]
|
||||||
|
items_txs = []
|
||||||
|
for item in items_list:
|
||||||
|
item_instance = ItemModel.objects.get(pk=item.get("item_id"))
|
||||||
|
car = models.Car.objects.get(vin=item_instance.name)
|
||||||
|
quantity = Decimal(item.get("quantity"))
|
||||||
|
items_txs.append(
|
||||||
|
{
|
||||||
|
"item_number": item_instance.item_number,
|
||||||
|
"quantity": quantity,
|
||||||
|
"unit_cost": car.finances.cost_price,
|
||||||
|
"total_amount": car.finances.cost_price * quantity,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
bill_itemtxs = {
|
||||||
|
item.get("item_number"): {
|
||||||
|
"unit_cost": item.get("unit_cost"),
|
||||||
|
"quantity": item.get("quantity"),
|
||||||
|
"total_amount": item.get("total_amount"),
|
||||||
|
}
|
||||||
|
for item in items_txs
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
item = entity.get_items_all().filter(pk=items).first()
|
||||||
|
instance = models.Car.objects.get(vin=item.name)
|
||||||
|
bill_itemtxs = {
|
||||||
|
item.item_number: {
|
||||||
|
"unit_cost": instance.finances.cost_price,
|
||||||
|
"quantity": Decimal(quantities),
|
||||||
|
"total_amount": instance.finances.cost_price * Decimal(quantities),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bill_itemtxs = bill.migrate_itemtxs(
|
||||||
|
itemtxs=bill_itemtxs,
|
||||||
|
commit=True,
|
||||||
|
operation=BillModel.ITEMIZE_APPEND,
|
||||||
|
)
|
||||||
|
url = reverse("bill_detail", kwargs={"pk": bill.pk})
|
||||||
|
return JsonResponse(
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"message": "Estimate created successfully!",
|
||||||
|
"url": f"{url}",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
form = forms.BillModelCreateForm(entity_model=entity)
|
||||||
|
form.initial.update(
|
||||||
|
{
|
||||||
|
"cash_account": entity.get_default_coa_accounts().get(name="Cash"),
|
||||||
|
"prepaid_account": entity.get_default_coa_accounts().get(
|
||||||
|
name="Prepaid Expenses"
|
||||||
|
),
|
||||||
|
"unearned_account": entity.get_default_coa_accounts().get(
|
||||||
|
name="Accounts Payable"
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
car_list = models.Car.objects.filter(dealer=dealer)
|
||||||
|
context = {
|
||||||
|
"form": form,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"car": x,
|
||||||
|
"product": entity.get_items_all()
|
||||||
|
.filter(item_role=ItemModel.ITEM_ROLE_PRODUCT, name=x.vin)
|
||||||
|
.first(),
|
||||||
|
}
|
||||||
|
for x in car_list
|
||||||
|
],
|
||||||
|
}
|
||||||
|
return render(request, "ledger/bills/bill_form.html", context)
|
||||||
|
|
||||||
|
def BillDeleteView(request, pk):
|
||||||
|
bill = get_object_or_404(BillModel, pk=pk)
|
||||||
|
bill.delete()
|
||||||
|
return redirect("bill_list")
|
||||||
|
|
||||||
|
|
||||||
class SubscriptionPlans(ListView):
|
class SubscriptionPlans(ListView):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user