ProjectDataAccuracyUpdateThree.sql 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. DROP VIEW IF EXISTS ProjectDataAccuracyUpdateThree
  2. GO
  3. Create View ProjectDataAccuracyUpdateThree
  4. as
  5. SELECT
  6. c.CompanyID,
  7. c.ContractID,
  8. c.ContractCD,
  9. bAExec.AcctCD AS ExecutiveNumber,
  10. bAExec.AcctName AS ExecutiveName,
  11. execEmp.userID AS ExecutivePKID,
  12. manager.AcctCD AS ManagerNumber,
  13. manager.AcctName AS ManagerName,
  14. manEmp.userID AS managerPKID,
  15. br.BranchID AS BranchKey,
  16. br.BranchCD AS BranchCD,
  17. ba.AcctName AS BranchName,
  18. cust.BAccountID as CustomerID,
  19. cust.AcctCD as CustomerCD,
  20. cust.AcctName as CustomerName,
  21. c.CreatedDateTime,
  22. dbo.SumReleasedTransactions(c.CompanyID, c.ContractID, 1) as WIPActual ,
  23. -- Calculate RentalProject via join
  24. CASE
  25. WHEN CHARINDEX('rental', LOWER(d.Description)) > 0 THEN 1
  26. ELSE 0
  27. END AS RentalProject,
  28. TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)) AS NTE,
  29. TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, vnte.ValueString)) AS VNTE,
  30. nte.ValueString AS NTEAsText,
  31. vnte.ValueString AS VNTEAsText,
  32. d.description as JobCategory,
  33. jsd.description as JobStatus,
  34. -- Aggregated columns from PMBudget
  35. ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) AS RevisedExpenseBudgetSum,
  36. ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) AS RevisedIncomeBudgetSum,
  37. ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryActualAmount ELSE 0 END), 0) AS ActualExpenseAmount,
  38. -- Calculated fields using aggregated values
  39. CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) < 5 THEN 1 ELSE 0 END AS RevisedUnderFive,
  40. CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryActualAmount ELSE 0 END), 0) > ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) THEN 1 ELSE 0 END AS ActualExpenseOverBudget,
  41. CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryActualAmount ELSE 0 END), 0) > ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) THEN 1 ELSE 0 END AS ExpenseExceedsIncome,
  42. CASE
  43. WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  44. + ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) < 5
  45. THEN 1
  46. ELSE 0
  47. END AS BudgetIncomeAndNTEUnderFive,
  48. CASE
  49. WHEN ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) < 5
  50. AND ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) > 0
  51. THEN 1
  52. ELSE 0
  53. END AS NTEUnderFiveWithBudget,
  54. CASE
  55. WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) < 5
  56. AND ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) > 0
  57. THEN 1
  58. ELSE 0
  59. END AS BudgetUnderFiveWithNTE,
  60. ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  61. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) AS EstimatedMargin,
  62. ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  63. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  64. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 AS GrossMargin,
  65. -- Calculated fields from SecondLayer
  66. CASE WHEN
  67. ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  68. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  69. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 0
  70. THEN 1 ELSE 0 END AS BudgetedGMUnderZero,
  71. CASE WHEN
  72. ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  73. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  74. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 8
  75. THEN 1 ELSE 0 END AS BudgetedGMUnderEight,
  76. CASE WHEN d.Description NOT IN (
  77. 'Alarm Monitoring',
  78. 'Cleaning – Biohazard',
  79. 'Equipment Rental – Cooling',
  80. 'Equipment Rental – Heating',
  81. 'File Maintenance',
  82. 'Inspections',
  83. 'Vital Command Sensors'
  84. )
  85. AND
  86. ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  87. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  88. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 4.5
  89. THEN 1 ELSE 0 END AS BudgetedGMUnderFourFive,
  90. CASE
  91. WHEN
  92. CASE
  93. WHEN CHARINDEX('rental', LOWER(d.Description)) > 0 THEN 1
  94. ELSE 0
  95. END = 1
  96. AND ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  97. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  98. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 4.5 THEN 1
  99. WHEN
  100. CASE
  101. WHEN CHARINDEX('rental', LOWER(d.Description)) > 0 THEN 1
  102. ELSE 0
  103. END = 0
  104. AND ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  105. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  106. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 8.0 THEN 1
  107. ELSE 0
  108. END AS BudgetedGMUnderTargetCombined,
  109. CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  110. > ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) THEN 1 ELSE 0 END AS BudgetedIncomeOverNTE,
  111. -- Final calculation for ProjectProblemExists
  112. CASE WHEN
  113. (CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  114. > ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) THEN 1 ELSE 0 END) + -- BudgetedIncomeOverNTE
  115. (CASE
  116. WHEN
  117. CASE
  118. WHEN CHARINDEX('rental', LOWER(d.Description)) > 0 THEN 1
  119. ELSE 0
  120. END = 1
  121. AND ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  122. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  123. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 4.5 THEN 1
  124. WHEN
  125. CASE
  126. WHEN CHARINDEX('rental', LOWER(d.Description)) > 0 THEN 1
  127. ELSE 0
  128. END = 0
  129. AND ((ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  130. - ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0))
  131. / NULLIF(ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0), 0)) * 100 < 8.0 THEN 1
  132. ELSE 0
  133. END) + -- BudgetedGMUnderTargetCombined
  134. (CASE
  135. WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) < 5
  136. AND ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) > 0
  137. THEN 1
  138. ELSE 0
  139. END) + -- BudgetUnderFiveWithNTE
  140. (CASE
  141. WHEN ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) < 5
  142. AND ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) > 0
  143. THEN 1
  144. ELSE 0
  145. END) + -- NTEUnderFiveWithBudget
  146. (CASE
  147. WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0)
  148. + ISNULL(TRY_CONVERT(DECIMAL(18,2), TRY_CONVERT(MONEY, nte.ValueString)), 0) < 5
  149. THEN 1
  150. ELSE 0
  151. END) + -- BudgetIncomeAndNTEUnderFive
  152. (CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryActualAmount ELSE 0 END), 0)
  153. > ISNULL(SUM(CASE WHEN p.[TYPE] = 'I' THEN p.CuryRevisedAmount ELSE 0 END), 0) THEN 1 ELSE 0 END) + -- ExpenseExceedsIncome
  154. (CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryActualAmount ELSE 0 END), 0)
  155. > ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) THEN 1 ELSE 0 END) + -- ActualExpenseOverBudget
  156. (CASE WHEN ISNULL(SUM(CASE WHEN p.[TYPE] = 'E' THEN p.CuryRevisedAmount ELSE 0 END), 0) < 5 THEN 1 ELSE 0 END) -- RevisedUnderFive
  157. > 0 THEN 1 ELSE 0 END AS ProjectProblemExists
  158. FROM
  159. Contract c
  160. LEFT JOIN ContractKvExt nte
  161. ON nte.CompanyID = c.CompanyID
  162. AND nte.RecordID = c.NoteID
  163. AND nte.FieldName = 'AttributeNTE'
  164. LEFT JOIN ContractKvExt vnte
  165. ON vnte.CompanyID = c.CompanyID
  166. AND vnte.RecordID = c.NoteID
  167. AND vnte.FieldName = 'AttributeVNTE'
  168. LEFT JOIN ContractKvExt e
  169. ON e.CompanyID = c.CompanyID
  170. AND e.RecordID = c.NoteID
  171. AND e.FieldName = 'AttributeCATEGORY'
  172. LEFT JOIN CSAttributeDetail d
  173. ON d.CompanyID = e.CompanyID
  174. AND d.AttributeID = 'CATEGORY'
  175. AND e.ValueString = d.ValueID
  176. LEFT JOIN ContractKvExt js
  177. ON js.CompanyID = c.CompanyID
  178. AND js.RecordID = c.NoteID
  179. AND js.FieldName = 'AttributeJOBSTATUS'
  180. LEFT JOIN CSAttributeDetail jsd
  181. ON jsd.CompanyID = e.CompanyID
  182. AND jsd.AttributeID = 'JOBSTATUS'
  183. AND js.ValueString = jsd.ValueID
  184. LEFT JOIN PMBudget p
  185. ON p.CompanyID = c.CompanyID
  186. AND p.ProjectID = c.ContractID
  187. LEFT JOIN BAccount manager ON manager.CompanyID = c.CompanyID AND manager.DefContactID = c.OwnerID
  188. LEFT JOIN EPEmployee manEmp ON manager.CompanyID = manEmp.CompanyID AND manEmp.BAccountID = manager.BAccountID
  189. LEFT JOIN ContractKvExt execNote ON execNote.CompanyID = c.CompanyID AND execNote.RecordID = c.NoteID AND execNote.FieldName = 'AttributePROJECTEXE'
  190. LEFT JOIN BAccount bAExec ON bAExec.CompanyID = execNote.CompanyID AND bAExec.AcctCD = execNote.ValueString
  191. LEFT JOIN EPEmployee execEmp ON bAExec.CompanyID = execEmp.CompanyID AND bAExec.BAccountID = execEmp.BAccountID
  192. LEFT JOIN Branch br ON br.CompanyID = c.CompanyID AND br.BranchID = c.DefaultBranchID
  193. LEFT JOIN BAccount ba ON ba.CompanyID = br.CompanyID AND ba.BAccountID = br.BAccountID
  194. LEFT JOIN BAccount cust ON cust.CompanyID = c.CompanyID AND cust.BAccountID = c.CustomerID
  195. GROUP BY
  196. c.CompanyID,
  197. c.ContractID,
  198. c.ContractCD,
  199. d.Description,
  200. nte.ValueString,
  201. vnte.ValueString,
  202. d.description,
  203. bAExec.AcctCD,
  204. bAExec.AcctName,
  205. execEmp.userID,
  206. manager.AcctCD,
  207. manager.AcctName,
  208. manEmp.userID,
  209. br.BranchID,
  210. br.BranchCD,
  211. ba.AcctName,
  212. cust.BAccountID,
  213. cust.AcctCD,
  214. cust.AcctName,
  215. c.CreatedDateTime,
  216. jsd.description