378 lines
16 KiB
Python
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",
|
|
),
|
|
],
|
|
},
|
|
),
|
|
]
|