SalesService.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. const SalesRepository = require('../../repository/admin/SalesRepository.js');
  2. const HttpException = require('../../utils/HttpException.js');
  3. const { SearchFilter } = require('../../utils/SearchFilter.js');
  4. const timeLocal = require('../../utils/TimeLocal.js');
  5. const prisma = require('../../prisma/PrismaClient.js');
  6. const { createLog, updateLog, deleteLog } = require('../../utils/LogActivity.js');
  7. const { formatISOWithoutTimezone } = require('../../utils/FormatDate.js');
  8. exports.getAllSalesService = async ({ page, limit, search, sortBy, orderBy }) => {
  9. const skip = (page - 1) * limit;
  10. const where = {
  11. ...SearchFilter(search, ['username', 'user_areas.province.name'], ['user_areas']),
  12. deletedAt: null
  13. };
  14. const [sales, total] = await Promise.all([
  15. SalesRepository.UserRepository.findAll({ skip, take: limit, where, orderBy: { [sortBy]: orderBy } }),
  16. SalesRepository.UserRepository.countAll(where)
  17. ]);
  18. const formatted = sales.map(v => ({
  19. ...v,
  20. createdAt: formatISOWithoutTimezone(v.createdAt),
  21. updatedAt: formatISOWithoutTimezone(v.updatedAt),
  22. }));
  23. return { sales: formatted, total };
  24. };
  25. exports.showSalesService = async (id) => {
  26. const sales = await SalesRepository.UserRepository.findById(id);
  27. if (!sales) {
  28. throw new HttpException("Data sales not found", 404);
  29. }
  30. return {
  31. ...sales,
  32. createdAt: formatISOWithoutTimezone(sales.createdAt),
  33. updatedAt: formatISOWithoutTimezone(sales.updatedAt),
  34. };
  35. };
  36. exports.storeSalesService = async (userData, req) => {
  37. // Validasi province_ids
  38. if (userData.province_ids && userData.province_ids.length > 0) {
  39. const validProvinces = await prisma.province.findMany({
  40. where: { id: { in: userData.province_ids } },
  41. select: { id: true },
  42. });
  43. const validProvinceIds = validProvinces.map(p => p.id);
  44. const invalidProvinceIds = userData.province_ids.filter(id => !validProvinceIds.includes(id));
  45. if (invalidProvinceIds.length > 0) {
  46. throw new HttpException(
  47. `Province ID not found: ${invalidProvinceIds.join(', ')}`,
  48. 404
  49. );
  50. }
  51. }
  52. // Create user dan assign role
  53. const userId = await SalesRepository.KeycloakRepository.createUser(userData);
  54. await SalesRepository.KeycloakRepository.assignSalesRole(userId);
  55. const data = await SalesRepository.UserRepository.createUser(userId, userData);
  56. // Insert ke user_areas
  57. if (userData.province_ids && userData.province_ids.length > 0) {
  58. await SalesRepository.UserAreaRepository.createMany(userId, userData.province_ids);
  59. }
  60. await createLog(req, data);
  61. };
  62. exports.updateSalesService = async (userData, id, req) => {
  63. // const sales = await SalesRepository.UserRepository.findById(id);
  64. // if (!sales) throw new HttpException('Sales not found', 404);
  65. // await SalesRepository.KeycloakRepository.updateUser(id, userData);
  66. // const data = await SalesRepository.UserRepository.updateUser(id, userData);
  67. // if (userData.province_ids && userData.province_ids.length > 0) {
  68. // await SalesRepository.UserAreaRepository.deleteByUserId(id);
  69. // await SalesRepository.UserAreaRepository.createMany(id, userData.province_ids);
  70. // }
  71. // await updateLog(req, data);
  72. const sales = await SalesRepository.UserRepository.findById(id);
  73. if (!sales) throw new HttpException('Sales not found', 404);
  74. // Validasi province_ids
  75. if (userData.province_ids && userData.province_ids.length > 0) {
  76. const validProvinces = await prisma.province.findMany({
  77. where: { id: { in: userData.province_ids } },
  78. select: { id: true },
  79. });
  80. const validProvinceIds = validProvinces.map(p => p.id);
  81. const invalidProvinceIds = userData.province_ids.filter(id => !validProvinceIds.includes(id));
  82. if (invalidProvinceIds.length > 0) {
  83. throw new HttpException(
  84. `Province ID not found: ${invalidProvinceIds.join(', ')}`,
  85. 404
  86. );
  87. }
  88. }
  89. // Update ke Keycloak
  90. await SalesRepository.KeycloakRepository.updateUser(id, userData);
  91. // Update ke DB lokal
  92. const data = await SalesRepository.UserRepository.updateUser(id, userData);
  93. // Update relasi user_areas
  94. if (userData.province_ids && userData.province_ids.length > 0) {
  95. await SalesRepository.UserAreaRepository.deleteByUserId(id);
  96. await SalesRepository.UserAreaRepository.createMany(id, userData.province_ids);
  97. }
  98. await updateLog(req, data);
  99. };
  100. exports.deleteSalesService = async (id, req) => {
  101. const sales = await SalesRepository.UserRepository.findById(id);
  102. if (!sales) {
  103. throw new HttpException('Sales not found', 404);
  104. }
  105. await SalesRepository.KeycloakRepository.deleteUser(id);
  106. const data = await SalesRepository.UserRepository.deleteUser(id, { deletedAt: timeLocal.now().toDate() });
  107. await prisma.userArea.updateMany({
  108. where: { user_id: id },
  109. data: {
  110. deletedAt: timeLocal.now().toDate()
  111. }
  112. });
  113. await deleteLog(req, data);
  114. };