@khester/create-dynamics-app 1.1.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/artifacts/registry.d.ts +18 -0
- package/dist/artifacts/registry.d.ts.map +1 -0
- package/dist/artifacts/registry.js +340 -0
- package/dist/artifacts/registry.js.map +1 -0
- package/dist/artifacts/types.d.ts +122 -0
- package/dist/artifacts/types.d.ts.map +1 -0
- package/dist/artifacts/types.js +7 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/artifacts/validators.d.ts +16 -0
- package/dist/artifacts/validators.d.ts.map +1 -0
- package/dist/artifacts/validators.js +45 -0
- package/dist/artifacts/validators.js.map +1 -0
- package/dist/fromDesign.d.ts +5 -0
- package/dist/fromDesign.d.ts.map +1 -0
- package/dist/fromDesign.js +98 -0
- package/dist/fromDesign.js.map +1 -0
- package/dist/index.js +129 -177
- package/dist/index.js.map +1 -1
- package/dist/injectDevTools.d.ts +28 -0
- package/dist/injectDevTools.d.ts.map +1 -0
- package/dist/injectDevTools.js +148 -0
- package/dist/injectDevTools.js.map +1 -0
- package/dist/scaffold.d.ts +48 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +180 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/templatePlan.d.ts +3 -0
- package/dist/templatePlan.d.ts.map +1 -0
- package/dist/templatePlan.js +43 -0
- package/dist/templatePlan.js.map +1 -0
- package/dist/utils/copyTemplate.d.ts +13 -1
- package/dist/utils/copyTemplate.d.ts.map +1 -1
- package/dist/utils/copyTemplate.js +98 -4
- package/dist/utils/copyTemplate.js.map +1 -1
- package/dist/utils/updatePackageJson.d.ts +11 -1
- package/dist/utils/updatePackageJson.d.ts.map +1 -1
- package/dist/utils/updatePackageJson.js +12 -10
- package/dist/utils/updatePackageJson.js.map +1 -1
- package/package.json +10 -7
- package/templates/_shared/dev-tools/auth/get-token.js +72 -0
- package/templates/_shared/dev-tools/dev/mock-xrm.js +42 -0
- package/templates/_shared/dev-tools/metadata-sync/index.js +152 -0
- package/templates/_shared/dev-tools/smoke/test-retrieve.js +44 -0
- package/templates/dialog-form/README.md +27 -0
- package/templates/dialog-form/_variants/App.v8.tsx +39 -0
- package/templates/dialog-form/_variants/App.v9.tsx +41 -0
- package/templates/dialog-form/gitignore +5 -0
- package/templates/dialog-form/package.json +27 -0
- package/templates/dialog-form/public/index.html +11 -0
- package/templates/dialog-form/src/index.tsx +10 -0
- package/templates/dialog-form/src/services/dataverse.ts +30 -0
- package/templates/dialog-form/tsconfig.json +15 -0
- package/templates/dialog-form/webpack.config.js +17 -0
- package/templates/grid-customizer/README.md +28 -0
- package/templates/grid-customizer/gitignore +4 -0
- package/templates/grid-customizer/package.json +25 -0
- package/templates/grid-customizer/src/GridCustomizer.ts +28 -0
- package/templates/grid-customizer/src/cell-renderers.tsx +35 -0
- package/templates/grid-customizer/src/index.ts +4 -0
- package/templates/grid-customizer/src/types/grid-types.ts +30 -0
- package/templates/grid-customizer/src/utils/color-utils.ts +24 -0
- package/templates/grid-customizer/tsconfig.json +15 -0
- package/templates/grid-customizer/webpack.config.js +17 -0
- package/templates/pcf-dataset/ControlManifest.Input.xml +16 -0
- package/templates/pcf-dataset/README.md +21 -0
- package/templates/pcf-dataset/gitignore +5 -0
- package/templates/pcf-dataset/index.ts +39 -0
- package/templates/pcf-dataset/package.json +30 -0
- package/templates/pcf-dataset/strings/{{componentName}}.1033.resx +47 -0
- package/templates/pcf-dataset/tsconfig.json +8 -0
- package/templates/pcf-dataset/{{componentName}}Component.tsx +39 -0
- package/templates/pcf-field/ControlManifest.Input.xml +17 -0
- package/templates/pcf-field/README.md +95 -0
- package/templates/pcf-field/_variants/ValueInput.boolean.tsx +24 -0
- package/templates/pcf-field/_variants/ValueInput.date.tsx +27 -0
- package/templates/pcf-field/_variants/ValueInput.number.tsx +35 -0
- package/templates/pcf-field/_variants/ValueInput.text.tsx +27 -0
- package/templates/pcf-field/gitignore +5 -0
- package/templates/pcf-field/index.ts +61 -0
- package/templates/pcf-field/package.json +30 -0
- package/templates/pcf-field/strings/{{componentName}}.1033.resx +47 -0
- package/templates/pcf-field/tsconfig.json +8 -0
- package/templates/pcf-field/{{componentName}}Component.tsx +35 -0
- package/templates/power-pages-starter/gitignore +5 -0
- package/templates/react-custom-page/gitignore +5 -0
- package/templates/{dynamics-365-starter → react-custom-page}/package.json +3 -3
- package/templates/react-custom-page/tools/metadata-sync/index.js +152 -0
- package/templates/static-web-app/README.md +36 -0
- package/templates/static-web-app/_variants/App.v8.tsx +32 -0
- package/templates/static-web-app/_variants/App.v9.tsx +31 -0
- package/templates/static-web-app/api/host.json +12 -0
- package/templates/static-web-app/api/package.json +19 -0
- package/templates/static-web-app/api/src/functions/hello.ts +16 -0
- package/templates/static-web-app/api/tsconfig.json +14 -0
- package/templates/static-web-app/frontend/index.html +12 -0
- package/templates/static-web-app/frontend/package.json +23 -0
- package/templates/static-web-app/frontend/src/index.tsx +8 -0
- package/templates/static-web-app/frontend/tsconfig.json +16 -0
- package/templates/static-web-app/frontend/vite.config.ts +13 -0
- package/templates/static-web-app/gitignore +8 -0
- package/templates/static-web-app/package.json +15 -0
- package/templates/static-web-app/staticwebapp.config.json +7 -0
- package/templates/teams-app/README.md +27 -0
- package/templates/teams-app/_variants/graph.off.ts +7 -0
- package/templates/teams-app/_variants/graph.on.ts +22 -0
- package/templates/teams-app/appPackage/manifest.json +26 -0
- package/templates/teams-app/gitignore +5 -0
- package/templates/teams-app/index.html +12 -0
- package/templates/teams-app/package.json +26 -0
- package/templates/teams-app/src/App.tsx +25 -0
- package/templates/teams-app/src/index.tsx +8 -0
- package/templates/teams-app/tsconfig.json +16 -0
- package/templates/teams-app/vite.config.ts +9 -0
- package/templates/web-resource/README.md +39 -0
- package/templates/web-resource/_variants/App.v8.tsx +29 -0
- package/templates/web-resource/_variants/App.v9.tsx +28 -0
- package/templates/web-resource/gitignore +5 -0
- package/templates/web-resource/package.json +27 -0
- package/templates/web-resource/public/index.html +11 -0
- package/templates/web-resource/src/index.tsx +10 -0
- package/templates/web-resource/src/services/dataverse.ts +30 -0
- package/templates/web-resource/tsconfig.json +15 -0
- package/templates/web-resource/webpack.config.js +17 -0
- package/dist/utils/consultingHelpers.d.ts +0 -13
- package/dist/utils/consultingHelpers.d.ts.map +0 -1
- package/dist/utils/consultingHelpers.js +0 -569
- package/dist/utils/consultingHelpers.js.map +0 -1
- package/templates/dynamics-365-starter/INTEGRATION_TEST_RESULTS.md +0 -302
- package/templates/dynamics-365-starter/PHASE_4_COMPLETION_SUMMARY.md +0 -305
- package/templates/dynamics-365-starter/deployment/QUICKSTART-MAC.md +0 -507
- package/templates/dynamics-365-starter/deployment/QUICKSTART-WINDOWS.md +0 -372
- package/templates/dynamics-365-starter/deployment/pipelines/README.md +0 -375
- package/templates/dynamics-365-starter/deployment/pipelines/azure-pipelines.yml +0 -330
- package/templates/dynamics-365-starter/deployment/pipelines/github-actions.yml +0 -422
- package/templates/dynamics-365-starter/deployment/pipelines/jenkins.groovy +0 -636
- package/templates/dynamics-365-starter/deployment/scripts/deploy.ps1 +0 -417
- package/templates/dynamics-365-starter/deployment/scripts/deploy.sh +0 -582
- package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.ps1 +0 -486
- package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.sh +0 -567
- package/templates/dynamics-365-starter/deployment/scripts/validate-setup.ps1 +0 -703
- package/templates/dynamics-365-starter/deployment/scripts/validate-setup.sh +0 -671
- package/templates/dynamics-365-starter/docs/team-standards/README.md +0 -273
- package/templates/dynamics-365-starter/docs/team-standards/client-onboarding.md +0 -577
- package/templates/dynamics-365-starter/docs/team-standards/code-review-checklist.md +0 -359
- package/templates/dynamics-365-starter/docs/team-standards/coding-standards.md +0 -700
- package/templates/dynamics-365-starter/docs/team-standards/cross-platform-team-guide.md +0 -736
- package/templates/dynamics-365-starter/docs/team-standards/development-workflows.md +0 -727
- package/templates/dynamics-365-starter/docs/troubleshooting/common-errors.md +0 -758
- package/templates/dynamics-365-starter/docs/troubleshooting/platform-specific-issues.md +0 -878
- package/templates/dynamics-365-starter/src/client-project-template/README.md +0 -234
- package/templates/dynamics-365-starter/src/client-project-template/config/client.template.json +0 -114
- package/templates/dynamics-365-starter/src/client-project-template/config/environments/template.json +0 -186
- package/templates/dynamics-365-starter/src/client-project-template/scripts/client-setup.js +0 -667
- package/templates/dynamics-365-starter/src/examples/README.md +0 -52
- package/templates/dynamics-365-starter/src/examples/component-examples/opportunity-management.tsx +0 -625
- package/templates/dynamics-365-starter/src/examples/entity-examples/opportunity-model.ts +0 -545
- package/templates/dynamics-365-starter/src/examples/integration-examples/custom-pcf-wrapper.tsx +0 -722
- package/templates/dynamics-365-starter/src/examples/workflow-examples/sales-workflow.ts +0 -662
- package/templates/dynamics-365-starter/src/page-templates/EntityDashboard.tsx +0 -519
- package/templates/dynamics-365-starter/src/page-templates/EntityDetailPage.tsx +0 -456
- package/templates/dynamics-365-starter/src/page-templates/EntityListPage.tsx +0 -406
- package/templates/dynamics-365-starter/src/page-templates/RelatedEntitiesPage.tsx +0 -578
- package/templates/dynamics-365-starter/src/page-templates/SearchPage.tsx +0 -629
- package/templates/dynamics-365-starter/tools/entity-generator/index.js +0 -168
- package/templates/dynamics-365-starter/tools/entity-generator/templates/constants.template.ts +0 -124
- package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.css +0 -283
- package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.tsx +0 -275
- package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.css +0 -204
- package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.tsx +0 -413
- package/templates/dynamics-365-starter/tools/entity-generator/templates/model.template.ts +0 -250
- package/templates/dynamics-365-starter/tools/metadata-sync/d365-client.js +0 -410
- package/templates/dynamics-365-starter/tools/metadata-sync/index.js +0 -512
- package/templates/dynamics-365-starter/tools/metadata-sync/type-generator.js +0 -675
- /package/templates/{dynamics-365-starter → react-custom-page}/README.md +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/deployment/README.md +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/docs/BEST_PRACTICES.md +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/docs/MIGRATION_GUIDE.md +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/public/index.html +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/scripts/custom-build.js +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountForm.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountForm.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountManagement.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountManagement.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactForm.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactForm.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactManagement.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactManagement.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LogDialog.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingContext.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingDebugPanel.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingDebugPanel.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingProvider.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/logger.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/constants/account.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/constants/contact.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/index.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/models/Account.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/models/BaseEntity.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/models/Contact.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/pcf/ContactControlWrapper.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/pcf/MultiEntityControlWrapper.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/providers/DynamicsProvider.tsx +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/services/MockApiService.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/services/ServiceFactory.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/services/XrmApiService.ts +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/src/styles/index.css +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/tsconfig.json +0 -0
- /package/templates/{dynamics-365-starter → react-custom-page}/webpack.config.js +0 -0
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
# Client Project Architecture Template
|
|
2
|
-
|
|
3
|
-
This template provides a standardized structure for multi-client Dynamics 365 consulting projects.
|
|
4
|
-
|
|
5
|
-
## Directory Structure
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
client-project/
|
|
9
|
-
├── config/
|
|
10
|
-
│ ├── client.json # Client-specific configuration
|
|
11
|
-
│ ├── environments/ # Environment configurations
|
|
12
|
-
│ │ ├── dev.json
|
|
13
|
-
│ │ ├── test.json
|
|
14
|
-
│ │ └── prod.json
|
|
15
|
-
│ └── deployment.json # Deployment settings
|
|
16
|
-
├── src/
|
|
17
|
-
│ ├── branding/ # Client-specific branding
|
|
18
|
-
│ │ ├── theme.ts # Theme customization
|
|
19
|
-
│ │ ├── logos/ # Client logos and assets
|
|
20
|
-
│ │ └── styles.css # Client-specific styles
|
|
21
|
-
│ ├── entities/ # Client entity definitions
|
|
22
|
-
│ │ ├── custom/ # Custom entities
|
|
23
|
-
│ │ └── extensions/ # Standard entity extensions
|
|
24
|
-
│ ├── workflows/ # Business logic workflows
|
|
25
|
-
│ ├── integrations/ # External system integrations
|
|
26
|
-
│ └── reports/ # Custom reports and dashboards
|
|
27
|
-
├── deployment/
|
|
28
|
-
│ ├── scripts/ # Deployment automation
|
|
29
|
-
│ ├── solutions/ # Dynamics 365 solutions
|
|
30
|
-
│ └── documentation/ # Deployment guides
|
|
31
|
-
└── docs/
|
|
32
|
-
├── client-requirements.md # Client-specific requirements
|
|
33
|
-
├── technical-specifications.md
|
|
34
|
-
└── user-guides/
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Configuration Files
|
|
38
|
-
|
|
39
|
-
### client.json
|
|
40
|
-
```json
|
|
41
|
-
{
|
|
42
|
-
"name": "Client Name",
|
|
43
|
-
"code": "CLI",
|
|
44
|
-
"industry": "Manufacturing",
|
|
45
|
-
"timezone": "America/New_York",
|
|
46
|
-
"locale": "en-US",
|
|
47
|
-
"branding": {
|
|
48
|
-
"primaryColor": "#0078d4",
|
|
49
|
-
"secondaryColor": "#106ebe",
|
|
50
|
-
"logoPath": "src/branding/logos/client-logo.png"
|
|
51
|
-
},
|
|
52
|
-
"features": {
|
|
53
|
-
"enableAdvancedLogging": true,
|
|
54
|
-
"enableCustomWorkflows": true,
|
|
55
|
-
"enableReporting": true
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### environments/prod.json
|
|
61
|
-
```json
|
|
62
|
-
{
|
|
63
|
-
"name": "Production",
|
|
64
|
-
"dynamics365Url": "https://client.crm.dynamics.com",
|
|
65
|
-
"webApiUrl": "https://client.api.crm.dynamics.com/api/data/v9.2",
|
|
66
|
-
"tenantId": "client-tenant-id",
|
|
67
|
-
"clientId": "client-app-id",
|
|
68
|
-
"security": {
|
|
69
|
-
"enableAuditLogging": true,
|
|
70
|
-
"requireMFA": true,
|
|
71
|
-
"sessionTimeout": 480
|
|
72
|
-
},
|
|
73
|
-
"performance": {
|
|
74
|
-
"enableCaching": true,
|
|
75
|
-
"batchSize": 100,
|
|
76
|
-
"timeoutMs": 30000
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Usage
|
|
82
|
-
|
|
83
|
-
1. **Initialize Client Project**:
|
|
84
|
-
```bash
|
|
85
|
-
create-dynamics-app my-client-project --client-name "ACME Corp" --entities "opportunity,quote,invoice"
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
2. **Configure Client Settings**:
|
|
89
|
-
- Update `config/client.json` with client details
|
|
90
|
-
- Customize branding in `src/branding/`
|
|
91
|
-
- Configure environments in `config/environments/`
|
|
92
|
-
|
|
93
|
-
3. **Generate Custom Entities**:
|
|
94
|
-
```bash
|
|
95
|
-
npm run generate:entity -- --entity customopportunity --display-name "Custom Opportunity"
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
4. **Deploy to Environment**:
|
|
99
|
-
```bash
|
|
100
|
-
npm run deploy:prod
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Best Practices
|
|
104
|
-
|
|
105
|
-
### Multi-Tenant Considerations
|
|
106
|
-
- Use environment-specific configurations
|
|
107
|
-
- Implement client-specific theming
|
|
108
|
-
- Maintain separate deployment pipelines
|
|
109
|
-
- Use feature flags for client-specific functionality
|
|
110
|
-
|
|
111
|
-
### Security
|
|
112
|
-
- Store sensitive configuration in Azure Key Vault
|
|
113
|
-
- Use managed identities for authentication
|
|
114
|
-
- Implement proper access controls
|
|
115
|
-
- Enable audit logging
|
|
116
|
-
|
|
117
|
-
### Development Workflow
|
|
118
|
-
1. Create feature branch for client customization
|
|
119
|
-
2. Implement and test changes
|
|
120
|
-
3. Run quality checks: `npm run quality`
|
|
121
|
-
4. Deploy to test environment
|
|
122
|
-
5. Get client approval
|
|
123
|
-
6. Deploy to production
|
|
124
|
-
|
|
125
|
-
### Code Organization
|
|
126
|
-
- Keep client-specific code in dedicated directories
|
|
127
|
-
- Use dependency injection for client configurations
|
|
128
|
-
- Implement factory patterns for environment-specific services
|
|
129
|
-
- Document all customizations
|
|
130
|
-
|
|
131
|
-
## Deployment
|
|
132
|
-
|
|
133
|
-
### Automated Deployment
|
|
134
|
-
The template includes scripts for automated deployment:
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
# Deploy to specific environment
|
|
138
|
-
./scripts/deploy.sh dev
|
|
139
|
-
./scripts/deploy.sh test
|
|
140
|
-
./scripts/deploy.sh prod
|
|
141
|
-
|
|
142
|
-
# Deploy with client validation
|
|
143
|
-
./scripts/deploy-client.sh --client ACME --env prod
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Manual Deployment Checklist
|
|
147
|
-
- [ ] Update client configuration
|
|
148
|
-
- [ ] Build and test locally
|
|
149
|
-
- [ ] Deploy to test environment
|
|
150
|
-
- [ ] Run smoke tests
|
|
151
|
-
- [ ] Get client sign-off
|
|
152
|
-
- [ ] Deploy to production
|
|
153
|
-
- [ ] Verify deployment
|
|
154
|
-
- [ ] Update documentation
|
|
155
|
-
|
|
156
|
-
## Customization Examples
|
|
157
|
-
|
|
158
|
-
### Client Theming
|
|
159
|
-
```typescript
|
|
160
|
-
// src/branding/theme.ts
|
|
161
|
-
export const clientTheme = {
|
|
162
|
-
palette: {
|
|
163
|
-
themePrimary: '#0078d4',
|
|
164
|
-
themeSecondary: '#106ebe',
|
|
165
|
-
neutralPrimary: '#323130'
|
|
166
|
-
},
|
|
167
|
-
fonts: {
|
|
168
|
-
medium: {
|
|
169
|
-
fontFamily: 'Client Corporate Font, Segoe UI, sans-serif'
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Custom Entity Extensions
|
|
176
|
-
```typescript
|
|
177
|
-
// src/entities/extensions/OpportunityExtensions.ts
|
|
178
|
-
export class ClientOpportunity extends Opportunity {
|
|
179
|
-
public customField1: string = '';
|
|
180
|
-
public customField2: number = 0;
|
|
181
|
-
|
|
182
|
-
public validateClientSpecificRules(): ValidationResult {
|
|
183
|
-
// Client-specific validation logic
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Environment-Specific Services
|
|
189
|
-
```typescript
|
|
190
|
-
// src/services/ClientServiceFactory.ts
|
|
191
|
-
export class ClientServiceFactory {
|
|
192
|
-
public static createApiService(environment: string): IApiService {
|
|
193
|
-
const config = getEnvironmentConfig(environment);
|
|
194
|
-
|
|
195
|
-
if (config.enableMockServices) {
|
|
196
|
-
return new MockApiService();
|
|
197
|
-
} else {
|
|
198
|
-
return new XrmApiService(config);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
## Maintenance
|
|
205
|
-
|
|
206
|
-
### Regular Tasks
|
|
207
|
-
- Update client configurations as requirements change
|
|
208
|
-
- Monitor deployment success rates
|
|
209
|
-
- Review and update documentation
|
|
210
|
-
- Conduct security audits
|
|
211
|
-
- Performance monitoring and optimization
|
|
212
|
-
|
|
213
|
-
### Upgrade Path
|
|
214
|
-
1. Test new framework versions in dev environment
|
|
215
|
-
2. Update client projects incrementally
|
|
216
|
-
3. Maintain backward compatibility
|
|
217
|
-
4. Document breaking changes
|
|
218
|
-
5. Coordinate client upgrade schedules
|
|
219
|
-
|
|
220
|
-
## Support
|
|
221
|
-
|
|
222
|
-
For client project support:
|
|
223
|
-
1. Check project documentation in `docs/`
|
|
224
|
-
2. Review deployment logs
|
|
225
|
-
3. Contact development team with client context
|
|
226
|
-
4. Escalate to client success team if needed
|
|
227
|
-
|
|
228
|
-
## Templates Available
|
|
229
|
-
|
|
230
|
-
- **Standard CRM**: Contact, Account, Opportunity management
|
|
231
|
-
- **Sales Pipeline**: Quote, Order, Invoice workflow
|
|
232
|
-
- **Service Management**: Case, Knowledge base, SLA tracking
|
|
233
|
-
- **Project Management**: Project, Task, Resource allocation
|
|
234
|
-
- **Custom Industry**: Tailored for specific industry needs
|
package/templates/dynamics-365-starter/src/client-project-template/config/client.template.json
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{clientName}}",
|
|
3
|
-
"code": "{{clientCode}}",
|
|
4
|
-
"industry": "{{industry}}",
|
|
5
|
-
"timezone": "{{timezone}}",
|
|
6
|
-
"locale": "{{locale}}",
|
|
7
|
-
"version": "1.0.0",
|
|
8
|
-
"created": "{{currentDate}}",
|
|
9
|
-
"lastUpdated": "{{currentDate}}",
|
|
10
|
-
"contact": {
|
|
11
|
-
"primaryContact": "{{primaryContact}}",
|
|
12
|
-
"email": "{{contactEmail}}",
|
|
13
|
-
"phone": "{{contactPhone}}"
|
|
14
|
-
},
|
|
15
|
-
"branding": {
|
|
16
|
-
"primaryColor": "{{primaryColor}}",
|
|
17
|
-
"secondaryColor": "{{secondaryColor}}",
|
|
18
|
-
"accentColor": "{{accentColor}}",
|
|
19
|
-
"logoPath": "src/branding/logos/{{clientCode}}-logo.png",
|
|
20
|
-
"faviconPath": "src/branding/logos/{{clientCode}}-favicon.ico",
|
|
21
|
-
"fontFamily": "{{fontFamily}}",
|
|
22
|
-
"customCss": "src/branding/{{clientCode}}-custom.css"
|
|
23
|
-
},
|
|
24
|
-
"features": {
|
|
25
|
-
"enableAdvancedLogging": true,
|
|
26
|
-
"enableCustomWorkflows": true,
|
|
27
|
-
"enableReporting": true,
|
|
28
|
-
"enableMobileOptimization": true,
|
|
29
|
-
"enableOfflineCapability": false,
|
|
30
|
-
"enableMultiLanguage": false,
|
|
31
|
-
"enableCustomDashboards": true,
|
|
32
|
-
"enableDataExport": true,
|
|
33
|
-
"enableBulkOperations": true,
|
|
34
|
-
"enableAdvancedSecurity": true
|
|
35
|
-
},
|
|
36
|
-
"customEntities": [
|
|
37
|
-
{{#each customEntities}}
|
|
38
|
-
{
|
|
39
|
-
"name": "{{name}}",
|
|
40
|
-
"displayName": "{{displayName}}",
|
|
41
|
-
"description": "{{description}}",
|
|
42
|
-
"enabled": true
|
|
43
|
-
}{{#unless @last}},{{/unless}}
|
|
44
|
-
{{/each}}
|
|
45
|
-
],
|
|
46
|
-
"integrations": {
|
|
47
|
-
"sharepoint": {
|
|
48
|
-
"enabled": false,
|
|
49
|
-
"siteUrl": ""
|
|
50
|
-
},
|
|
51
|
-
"teams": {
|
|
52
|
-
"enabled": false,
|
|
53
|
-
"appId": ""
|
|
54
|
-
},
|
|
55
|
-
"powerBI": {
|
|
56
|
-
"enabled": false,
|
|
57
|
-
"workspaceId": ""
|
|
58
|
-
},
|
|
59
|
-
"powerAutomate": {
|
|
60
|
-
"enabled": true
|
|
61
|
-
},
|
|
62
|
-
"externalAPIs": [
|
|
63
|
-
{{#each externalAPIs}}
|
|
64
|
-
{
|
|
65
|
-
"name": "{{name}}",
|
|
66
|
-
"endpoint": "{{endpoint}}",
|
|
67
|
-
"authType": "{{authType}}",
|
|
68
|
-
"enabled": {{enabled}}
|
|
69
|
-
}{{#unless @last}},{{/unless}}
|
|
70
|
-
{{/each}}
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
"compliance": {
|
|
74
|
-
"gdprCompliant": true,
|
|
75
|
-
"hipaaCompliant": false,
|
|
76
|
-
"soxCompliant": false,
|
|
77
|
-
"auditRetentionDays": 365,
|
|
78
|
-
"dataClassification": "Internal"
|
|
79
|
-
},
|
|
80
|
-
"deployment": {
|
|
81
|
-
"strategy": "blue-green",
|
|
82
|
-
"rollbackEnabled": true,
|
|
83
|
-
"approvalRequired": true,
|
|
84
|
-
"notificationEmail": "{{contactEmail}}",
|
|
85
|
-
"maintenanceWindow": {
|
|
86
|
-
"timezone": "{{timezone}}",
|
|
87
|
-
"startTime": "02:00",
|
|
88
|
-
"duration": 120
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
"support": {
|
|
92
|
-
"level": "Enterprise",
|
|
93
|
-
"hours": "24/7",
|
|
94
|
-
"escalationEmail": "{{supportEmail}}",
|
|
95
|
-
"slaTier": "Gold"
|
|
96
|
-
},
|
|
97
|
-
"customizations": {
|
|
98
|
-
"entities": {
|
|
99
|
-
"naming": "{{clientCode}}_",
|
|
100
|
-
"prefix": "{{clientCode}}",
|
|
101
|
-
"suffix": ""
|
|
102
|
-
},
|
|
103
|
-
"workflows": {
|
|
104
|
-
"customValidation": true,
|
|
105
|
-
"customBusinessLogic": true,
|
|
106
|
-
"customIntegrations": true
|
|
107
|
-
},
|
|
108
|
-
"ui": {
|
|
109
|
-
"customTheme": true,
|
|
110
|
-
"customComponents": true,
|
|
111
|
-
"customLayouts": true
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
package/templates/dynamics-365-starter/src/client-project-template/config/environments/template.json
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{environmentName}}",
|
|
3
|
-
"type": "{{environmentType}}",
|
|
4
|
-
"description": "{{environmentDescription}}",
|
|
5
|
-
"lastUpdated": "{{currentDate}}",
|
|
6
|
-
"dynamics365": {
|
|
7
|
-
"orgUrl": "{{orgUrl}}",
|
|
8
|
-
"webApiUrl": "{{webApiUrl}}",
|
|
9
|
-
"version": "9.2",
|
|
10
|
-
"region": "{{region}}",
|
|
11
|
-
"tenantId": "{{tenantId}}",
|
|
12
|
-
"dataverse": {
|
|
13
|
-
"environmentId": "{{environmentId}}",
|
|
14
|
-
"uniqueName": "{{uniqueName}}"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"authentication": {
|
|
18
|
-
"type": "{{authType}}",
|
|
19
|
-
"clientId": "{{clientId}}",
|
|
20
|
-
"clientSecret": "{{clientSecret}}",
|
|
21
|
-
"redirectUri": "{{redirectUri}}",
|
|
22
|
-
"scopes": [
|
|
23
|
-
"https://{{orgDomain}}.crm.dynamics.com/user_impersonation"
|
|
24
|
-
],
|
|
25
|
-
"authority": "https://login.microsoftonline.com/{{tenantId}}"
|
|
26
|
-
},
|
|
27
|
-
"security": {
|
|
28
|
-
"enableAuditLogging": true,
|
|
29
|
-
"requireMFA": "{{requireMFA}}",
|
|
30
|
-
"sessionTimeout": {{sessionTimeout}},
|
|
31
|
-
"enableConditionalAccess": true,
|
|
32
|
-
"allowedIPs": [
|
|
33
|
-
{{#each allowedIPs}}
|
|
34
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
35
|
-
{{/each}}
|
|
36
|
-
],
|
|
37
|
-
"dataLossPreventionEnabled": true,
|
|
38
|
-
"encryptionAtRest": true,
|
|
39
|
-
"encryptionInTransit": true
|
|
40
|
-
},
|
|
41
|
-
"performance": {
|
|
42
|
-
"enableCaching": {{enableCaching}},
|
|
43
|
-
"cacheTimeout": {{cacheTimeout}},
|
|
44
|
-
"batchSize": {{batchSize}},
|
|
45
|
-
"timeoutMs": {{timeoutMs}},
|
|
46
|
-
"retryAttempts": {{retryAttempts}},
|
|
47
|
-
"retryDelayMs": {{retryDelayMs}},
|
|
48
|
-
"enableCompression": true,
|
|
49
|
-
"enableCDN": {{enableCDN}}
|
|
50
|
-
},
|
|
51
|
-
"monitoring": {
|
|
52
|
-
"enableApplicationInsights": true,
|
|
53
|
-
"instrumentationKey": "{{instrumentationKey}}",
|
|
54
|
-
"logLevel": "{{logLevel}}",
|
|
55
|
-
"enableMetrics": true,
|
|
56
|
-
"enableTracing": true,
|
|
57
|
-
"enableProfiling": false,
|
|
58
|
-
"alertRules": [
|
|
59
|
-
{
|
|
60
|
-
"name": "High Error Rate",
|
|
61
|
-
"condition": "exceptions/hour > 10",
|
|
62
|
-
"severity": "Critical",
|
|
63
|
-
"enabled": true
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"name": "Slow Response Time",
|
|
67
|
-
"condition": "avg(requests/duration) > 5000",
|
|
68
|
-
"severity": "Warning",
|
|
69
|
-
"enabled": true
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
"backup": {
|
|
74
|
-
"enabled": {{backupEnabled}},
|
|
75
|
-
"frequency": "{{backupFrequency}}",
|
|
76
|
-
"retentionDays": {{backupRetentionDays}},
|
|
77
|
-
"storageAccount": "{{backupStorageAccount}}",
|
|
78
|
-
"enablePointInTimeRestore": {{enablePointInTimeRestore}}
|
|
79
|
-
},
|
|
80
|
-
"networking": {
|
|
81
|
-
"enableVNet": {{enableVNet}},
|
|
82
|
-
"subnetId": "{{subnetId}}",
|
|
83
|
-
"enablePrivateEndpoint": {{enablePrivateEndpoint}},
|
|
84
|
-
"enableServiceEndpoint": {{enableServiceEndpoint}},
|
|
85
|
-
"firewallRules": [
|
|
86
|
-
{{#each firewallRules}}
|
|
87
|
-
{
|
|
88
|
-
"name": "{{name}}",
|
|
89
|
-
"startIP": "{{startIP}}",
|
|
90
|
-
"endIP": "{{endIP}}",
|
|
91
|
-
"enabled": {{enabled}}
|
|
92
|
-
}{{#unless @last}},{{/unless}}
|
|
93
|
-
{{/each}}
|
|
94
|
-
]
|
|
95
|
-
},
|
|
96
|
-
"deployment": {
|
|
97
|
-
"strategy": "{{deploymentStrategy}}",
|
|
98
|
-
"slots": [
|
|
99
|
-
{{#each deploymentSlots}}
|
|
100
|
-
{
|
|
101
|
-
"name": "{{name}}",
|
|
102
|
-
"enabled": {{enabled}},
|
|
103
|
-
"percentage": {{percentage}}
|
|
104
|
-
}{{#unless @last}},{{/unless}}
|
|
105
|
-
{{/each}}
|
|
106
|
-
],
|
|
107
|
-
"rollbackEnabled": {{rollbackEnabled}},
|
|
108
|
-
"healthCheckUrl": "{{healthCheckUrl}}",
|
|
109
|
-
"warmupEnabled": {{warmupEnabled}},
|
|
110
|
-
"preDeploymentSteps": [
|
|
111
|
-
{{#each preDeploymentSteps}}
|
|
112
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
113
|
-
{{/each}}
|
|
114
|
-
],
|
|
115
|
-
"postDeploymentSteps": [
|
|
116
|
-
{{#each postDeploymentSteps}}
|
|
117
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
118
|
-
{{/each}}
|
|
119
|
-
]
|
|
120
|
-
},
|
|
121
|
-
"integrations": {
|
|
122
|
-
"keyVault": {
|
|
123
|
-
"enabled": {{keyVaultEnabled}},
|
|
124
|
-
"vaultUrl": "{{keyVaultUrl}}",
|
|
125
|
-
"secrets": [
|
|
126
|
-
{{#each keyVaultSecrets}}
|
|
127
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
128
|
-
{{/each}}
|
|
129
|
-
]
|
|
130
|
-
},
|
|
131
|
-
"servicebus": {
|
|
132
|
-
"enabled": {{serviceBusEnabled}},
|
|
133
|
-
"connectionString": "{{serviceBusConnectionString}}",
|
|
134
|
-
"queues": [
|
|
135
|
-
{{#each serviceBusQueues}}
|
|
136
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
137
|
-
{{/each}}
|
|
138
|
-
]
|
|
139
|
-
},
|
|
140
|
-
"storage": {
|
|
141
|
-
"enabled": {{storageEnabled}},
|
|
142
|
-
"accountName": "{{storageAccountName}}",
|
|
143
|
-
"containerName": "{{storageContainerName}}",
|
|
144
|
-
"enableStaticWebsite": {{enableStaticWebsite}}
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
"customSettings": {
|
|
148
|
-
{{#each customSettings}}
|
|
149
|
-
"{{@key}}": "{{this}}"{{#unless @last}},{{/unless}}
|
|
150
|
-
{{/each}}
|
|
151
|
-
},
|
|
152
|
-
"featureFlags": {
|
|
153
|
-
{{#each featureFlags}}
|
|
154
|
-
"{{@key}}": {{this}}{{#unless @last}},{{/unless}}
|
|
155
|
-
{{/each}}
|
|
156
|
-
},
|
|
157
|
-
"notifications": {
|
|
158
|
-
"deploymentSuccess": {
|
|
159
|
-
"enabled": true,
|
|
160
|
-
"channels": ["email", "teams"],
|
|
161
|
-
"recipients": [
|
|
162
|
-
{{#each notificationRecipients}}
|
|
163
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
164
|
-
{{/each}}
|
|
165
|
-
]
|
|
166
|
-
},
|
|
167
|
-
"deploymentFailure": {
|
|
168
|
-
"enabled": true,
|
|
169
|
-
"channels": ["email", "teams", "sms"],
|
|
170
|
-
"recipients": [
|
|
171
|
-
{{#each notificationRecipients}}
|
|
172
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
173
|
-
{{/each}}
|
|
174
|
-
]
|
|
175
|
-
},
|
|
176
|
-
"healthCheckFailure": {
|
|
177
|
-
"enabled": true,
|
|
178
|
-
"channels": ["email", "teams"],
|
|
179
|
-
"recipients": [
|
|
180
|
-
{{#each notificationRecipients}}
|
|
181
|
-
"{{this}}"{{#unless @last}},{{/unless}}
|
|
182
|
-
{{/each}}
|
|
183
|
-
]
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|