task-d.4
This commit is contained in:
@@ -317,6 +317,16 @@ export const crmEnquiries = pgTable(
|
||||
isHotProject: boolean('is_hot_project').default(false).notNull(),
|
||||
isActive: boolean('is_active').default(true).notNull(),
|
||||
pipelineStage: text('pipeline_stage').default('lead').notNull(),
|
||||
closedWonAt: timestamp('closed_won_at', { withTimezone: true }),
|
||||
closedLostAt: timestamp('closed_lost_at', { withTimezone: true }),
|
||||
closedByUserId: text('closed_by_user_id'),
|
||||
poNumber: text('po_number'),
|
||||
poDate: timestamp('po_date', { withTimezone: true }),
|
||||
poAmount: doublePrecision('po_amount'),
|
||||
poCurrency: text('po_currency'),
|
||||
lostReason: text('lost_reason'),
|
||||
lostCompetitor: text('lost_competitor'),
|
||||
lostRemark: text('lost_remark'),
|
||||
assignedToUserId: text('assigned_to_user_id'),
|
||||
assignedAt: timestamp('assigned_at', { withTimezone: true }),
|
||||
assignedBy: text('assigned_by'),
|
||||
@@ -365,6 +375,25 @@ export const crmEnquiryCustomers = pgTable('crm_enquiry_customers', {
|
||||
deletedAt: timestamp('deleted_at', { withTimezone: true })
|
||||
});
|
||||
|
||||
export const crmEnquiryAttachments = pgTable('crm_enquiry_attachments', {
|
||||
id: text('id').primaryKey(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
enquiryId: text('enquiry_id').notNull(),
|
||||
category: text('category').notNull(),
|
||||
fileName: text('file_name').notNull(),
|
||||
originalFileName: text('original_file_name').notNull(),
|
||||
storageProvider: text('storage_provider').notNull(),
|
||||
storageKey: text('storage_key').notNull(),
|
||||
fileSize: integer('file_size'),
|
||||
fileType: text('file_type'),
|
||||
description: text('description'),
|
||||
uploadedAt: timestamp('uploaded_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
uploadedBy: text('uploaded_by').notNull(),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
deletedAt: timestamp('deleted_at', { withTimezone: true })
|
||||
});
|
||||
|
||||
export const crmQuotations = pgTable(
|
||||
'crm_quotations',
|
||||
{
|
||||
|
||||
@@ -285,6 +285,36 @@ const FOUNDATION_OPTIONS = {
|
||||
{ code: 'email', label: 'Email', value: 'email', sortOrder: 4 },
|
||||
{ code: 'line', label: 'LINE', value: 'line', sortOrder: 5 }
|
||||
],
|
||||
crm_lost_reason: [
|
||||
{ code: 'competitor_won', label: 'Competitor Won', value: 'competitor_won', sortOrder: 1 },
|
||||
{
|
||||
code: 'budget_not_approved',
|
||||
label: 'Budget Not Approved',
|
||||
value: 'budget_not_approved',
|
||||
sortOrder: 2
|
||||
},
|
||||
{
|
||||
code: 'project_cancelled',
|
||||
label: 'Project Cancelled',
|
||||
value: 'project_cancelled',
|
||||
sortOrder: 3
|
||||
},
|
||||
{
|
||||
code: 'customer_no_response',
|
||||
label: 'Customer No Response',
|
||||
value: 'customer_no_response',
|
||||
sortOrder: 4
|
||||
},
|
||||
{
|
||||
code: 'technical_requirement_mismatch',
|
||||
label: 'Technical Requirement Mismatch',
|
||||
value: 'technical_requirement_mismatch',
|
||||
sortOrder: 5
|
||||
},
|
||||
{ code: 'price_too_high', label: 'Price Too High', value: 'price_too_high', sortOrder: 6 },
|
||||
{ code: 'timeline_not_fit', label: 'Timeline Not Fit', value: 'timeline_not_fit', sortOrder: 7 },
|
||||
{ code: 'other', label: 'Other', value: 'other', sortOrder: 8 }
|
||||
],
|
||||
crm_job_title: [
|
||||
{ code: 'sales', label: 'Sales Engineer', value: 'sales', sortOrder: 1 },
|
||||
{ code: 'sales_support', label: 'Sales Support', value: 'sales_support', sortOrder: 2 },
|
||||
|
||||
Reference in New Issue
Block a user