bottleneckcrm/backend/opportunity/migrations/0001_initial.py

378 lines
16 KiB
Python

# Generated by Django 5.2.8 on 2025-11-27 12:17
import uuid
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("accounts", "0001_initial"),
("common", "0001_initial"),
("contacts", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Opportunity",
fields=[
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="Created At"),
),
(
"updated_at",
models.DateTimeField(
auto_now=True, verbose_name="Last Modified At"
),
),
(
"id",
models.UUIDField(
db_index=True,
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
unique=True,
),
),
(
"name",
models.CharField(max_length=255, verbose_name="Opportunity Name"),
),
(
"stage",
models.CharField(
choices=[
("PROSPECTING", "Prospecting"),
("QUALIFICATION", "Qualification"),
("PROPOSAL", "Proposal"),
("NEGOTIATION", "Negotiation"),
("CLOSED_WON", "Closed Won"),
("CLOSED_LOST", "Closed Lost"),
],
default="PROSPECTING",
max_length=64,
verbose_name="Stage",
),
),
(
"opportunity_type",
models.CharField(
blank=True,
choices=[
("NEW_BUSINESS", "New Business"),
("EXISTING_BUSINESS", "Existing Business"),
("RENEWAL", "Renewal"),
("UPSELL", "Upsell"),
("CROSS_SELL", "Cross-sell"),
],
max_length=64,
null=True,
verbose_name="Type",
),
),
(
"currency",
models.CharField(
blank=True,
choices=[
("AED", "AED, Dirham"),
("AFN", "AFN, Afghani"),
("ALL", "ALL, Lek"),
("AMD", "AMD, Dram"),
("ANG", "ANG, Guilder"),
("AOA", "AOA, Kwanza"),
("ARS", "ARS, Peso"),
("AUD", "AUD, Dollar"),
("AWG", "AWG, Guilder"),
("AZN", "AZN, Manat"),
("BAM", "BAM, Marka"),
("BBD", "BBD, Dollar"),
("BDT", "BDT, Taka"),
("BGN", "BGN, Lev"),
("BHD", "BHD, Dinar"),
("BIF", "BIF, Franc"),
("BMD", "BMD, Dollar"),
("BND", "BND, Dollar"),
("BOB", "BOB, Boliviano"),
("BRL", "BRL, Real"),
("BSD", "BSD, Dollar"),
("BTN", "BTN, Ngultrum"),
("BWP", "BWP, Pula"),
("BYR", "BYR, Ruble"),
("BZD", "BZD, Dollar"),
("CAD", "CAD, Dollar"),
("CDF", "CDF, Franc"),
("CHF", "CHF, Franc"),
("CLP", "CLP, Peso"),
("CNY", "CNY, Yuan Renminbi"),
("COP", "COP, Peso"),
("CRC", "CRC, Colon"),
("CUP", "CUP, Peso"),
("CVE", "CVE, Escudo"),
("CZK", "CZK, Koruna"),
("DJF", "DJF, Franc"),
("DKK", "DKK, Krone"),
("DOP", "DOP, Peso"),
("DZD", "DZD, Dinar"),
("EGP", "EGP, Pound"),
("ERN", "ERN, Nakfa"),
("ETB", "ETB, Birr"),
("EUR", "EUR, Euro"),
("FJD", "FJD, Dollar"),
("FKP", "FKP, Pound"),
("GBP", "GBP, Pound"),
("GEL", "GEL, Lari"),
("GHS", "GHS, Cedi"),
("GIP", "GIP, Pound"),
("GMD", "GMD, Dalasi"),
("GNF", "GNF, Franc"),
("GTQ", "GTQ, Quetzal"),
("GYD", "GYD, Dollar"),
("HKD", "HKD, Dollar"),
("HNL", "HNL, Lempira"),
("HRK", "HRK, Kuna"),
("HTG", "HTG, Gourde"),
("HUF", "HUF, Forint"),
("IDR", "IDR, Rupiah"),
("ILS", "ILS, Shekel"),
("INR", "INR, Rupee"),
("IQD", "IQD, Dinar"),
("IRR", "IRR, Rial"),
("ISK", "ISK, Krona"),
("JMD", "JMD, Dollar"),
("JOD", "JOD, Dinar"),
("JPY", "JPY, Yen"),
("KES", "KES, Shilling"),
("KGS", "KGS, Som"),
("KHR", "KHR, Riels"),
("KMF", "KMF, Franc"),
("KPW", "KPW, Won"),
("KRW", "KRW, Won"),
("KWD", "KWD, Dinar"),
("KYD", "KYD, Dollar"),
("KZT", "KZT, Tenge"),
("LAK", "LAK, Kip"),
("LBP", "LBP, Pound"),
("LKR", "LKR, Rupee"),
("LRD", "LRD, Dollar"),
("LSL", "LSL, Loti"),
("LTL", "LTL, Litas"),
("LVL", "LVL, Lat"),
("LYD", "LYD, Dinar"),
("MAD", "MAD, Dirham"),
("MDL", "MDL, Leu"),
("MGA", "MGA, Ariary"),
("MKD", "MKD, Denar"),
("MMK", "MMK, Kyat"),
("MNT", "MNT, Tugrik"),
("MOP", "MOP, Pataca"),
("MRO", "MRO, Ouguiya"),
("MUR", "MUR, Rupee"),
("MVR", "MVR, Rufiyaa"),
("MWK", "MWK, Kwacha"),
("MXN", "MXN, Peso"),
("MYR", "MYR, Ringgit"),
("MZN", "MZN, Metical"),
("NAD", "NAD, Dollar"),
("NGN", "NGN, Naira"),
("NIO", "NIO, Cordoba"),
("NOK", "NOK, Krone"),
("NPR", "NPR, Rupee"),
("NZD", "NZD, Dollar"),
("OMR", "OMR, Rial"),
("PAB", "PAB, Balboa"),
("PEN", "PEN, Sol"),
("PGK", "PGK, Kina"),
("PHP", "PHP, Peso"),
("PKR", "PKR, Rupee"),
("PLN", "PLN, Zloty"),
("PYG", "PYG, Guarani"),
("QAR", "QAR, Rial"),
("RON", "RON, Leu"),
("RSD", "RSD, Dinar"),
("RUB", "RUB, Ruble"),
("RWF", "RWF, Franc"),
("SAR", "SAR, Rial"),
("SBD", "SBD, Dollar"),
("SCR", "SCR, Rupee"),
("SDG", "SDG, Pound"),
("SEK", "SEK, Krona"),
("SGD", "SGD, Dollar"),
("SHP", "SHP, Pound"),
("SLL", "SLL, Leone"),
("SOS", "SOS, Shilling"),
("SRD", "SRD, Dollar"),
("SSP", "SSP, Pound"),
("STD", "STD, Dobra"),
("SYP", "SYP, Pound"),
("SZL", "SZL, Lilangeni"),
("THB", "THB, Baht"),
("TJS", "TJS, Somoni"),
("TMT", "TMT, Manat"),
("TND", "TND, Dinar"),
("TOP", "TOP, Paanga"),
("TRY", "TRY, Lira"),
("TTD", "TTD, Dollar"),
("TWD", "TWD, Dollar"),
("TZS", "TZS, Shilling"),
("UAH", "UAH, Hryvnia"),
("UGX", "UGX, Shilling"),
("USD", "$, Dollar"),
("UYU", "UYU, Peso"),
("UZS", "UZS, Som"),
("VEF", "VEF, Bolivar"),
("VND", "VND, Dong"),
("VUV", "VUV, Vatu"),
("WST", "WST, Tala"),
("XAF", "XAF, Franc"),
("XCD", "XCD, Dollar"),
("XOF", "XOF, Franc"),
("XPF", "XPF, Franc"),
("YER", "YER, Rial"),
("ZAR", "ZAR, Rand"),
("ZMK", "ZMK, Kwacha"),
("ZWL", "ZWL, Dollar"),
],
max_length=3,
null=True,
verbose_name="Currency",
),
),
(
"amount",
models.DecimalField(
blank=True,
decimal_places=2,
max_digits=12,
null=True,
verbose_name="Amount",
),
),
(
"probability",
models.IntegerField(
blank=True, default=0, null=True, verbose_name="Probability (%)"
),
),
(
"closed_on",
models.DateField(
blank=True, null=True, verbose_name="Expected Close Date"
),
),
(
"lead_source",
models.CharField(
blank=True,
choices=[
("NONE", "NONE"),
("CALL", "CALL"),
("EMAIL", " EMAIL"),
("EXISTING CUSTOMER", "EXISTING CUSTOMER"),
("PARTNER", "PARTNER"),
("PUBLIC RELATIONS", "PUBLIC RELATIONS"),
("CAMPAIGN", "CAMPAIGN"),
("WEBSITE", "WEBSITE"),
("OTHER", "OTHER"),
],
max_length=255,
null=True,
verbose_name="Lead Source",
),
),
(
"description",
models.TextField(blank=True, null=True, verbose_name="Notes"),
),
("is_active", models.BooleanField(default=True)),
(
"account",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="opportunities",
to="accounts.account",
),
),
(
"assigned_to",
models.ManyToManyField(
related_name="opportunity_assigned_to", to="common.profile"
),
),
(
"closed_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="opportunity_closed_by",
to="common.profile",
),
),
(
"contacts",
models.ManyToManyField(
related_name="opportunity_contacts", to="contacts.contact"
),
),
(
"created_by",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_created_by",
to=settings.AUTH_USER_MODEL,
verbose_name="Created By",
),
),
(
"org",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="opportunities",
to="common.org",
),
),
("tags", models.ManyToManyField(blank=True, to="common.tags")),
(
"teams",
models.ManyToManyField(
related_name="opportunity_teams", to="common.teams"
),
),
(
"updated_by",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_updated_by",
to=settings.AUTH_USER_MODEL,
verbose_name="Last Modified By",
),
),
],
options={
"verbose_name": "Opportunity",
"verbose_name_plural": "Opportunities",
"db_table": "opportunity",
"ordering": ("-created_at",),
"indexes": [
models.Index(fields=["stage"], name="opportunity_stage_39fb59_idx"),
models.Index(
fields=["org", "-created_at"],
name="opportunity_org_id_945a7b_idx",
),
],
},
),
]