All files / platform/modules/sale-report/src/Controllers/Http SystemBookingStaffSaleReportController.js

100% Statements 19/19
100% Branches 0/0
100% Functions 3/3
100% Lines 19/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112    1x 1x 1x       4x                               4x 4x 4x 4x 4x                                                                               4x 4x 4x 4x               4x 4x             1x                               1x     1x       1x  
'use strict';
 
const Config = use('Config');
const configs = Config.get('modules.saleReport.general');
const namespace = configs.namespace;
 
class SystemBookingStaffSaleReportController {
  static get inject() {
    return [
      `${namespace}/Services/BookingStaffSaleReportService`,
      `${namespace}/Services/PeriodService`,
      `${namespace}/Services/SystemService`,
      `${namespace}/Services/StaffService`,
      `${namespace}/Services/BookingService`,
    ];
  }
 
  constructor(
    bookingStaffSaleReportService,
    periodService,
    systemService,
    staffService,
    bookingService,
  ) {
    this.bookingStaffSaleReportService = bookingStaffSaleReportService;
    this.periodService = periodService;
    this.systemService = systemService;
    this.staffService = staffService;
    this.bookingService = bookingService;
  }
 
  /**
   * @swagger
   *
   * /api/v1/apps/{appId}/sale-reports/staff/{staffId}/bookings/{bookingId}:
   *   post:
   *     tags:
   *       - sale-reports
   *     operationId: 'addSystemBookingStaffSaleReport'
   *     summary: 'addSystemBookingStaffSaleReport'
   *     description: 'add system staff booking sale reports'
   *     parameters:
   *       - $ref: '#/components/parameters/AppIdParam'
   *       - $ref: '#/components/parameters/StaffIdParam'
   *       - $ref: '#/components/parameters/BookingIdParam'
   *     requestBody:
   *       content:
   *         application/json:
   *           schema:
   *             $ref: '#/components/schemas/SystemStaffBookingSaleReportBody'
   *     responses:
   *       201:
   *         description: ok
   *         content:
   *           application/json; charset=utf-8:
   *             schema:
   *               $ref: '#/components/schemas/SystemStaffBookingSaleReportCreatedResponse'
   *       401:
   *         $ref: '#/components/responses/Unauthorized'
   *       404:
   *         $ref: '#/components/responses/NotFound'
   *       422:
   *         $ref: '#/components/responses/BadData'
   *     deprecated: false
   *     security:
   *      - BasicAuth: []
   */
  async store({ request, response, transform }) {
    const systemId = request.params.appId;
    const staffId = request.params.staffId;
    const bookingId = request.params.bookingId;
    const { startDate, endDate, ...input } = request.only([
      'totalTreatmentSales',
      'staffSales',
      'startDate',
      'endDate',
      'extra',
    ]);
 
    const periodDate = { startDate, endDate };
    const [, staff, booking, period] = await Promise.all([
      this.systemService.findOrFail(systemId),
      this.staffService.findWithTrashOrFail(staffId),
      this.bookingService.findOrFail(bookingId),
      this.periodService.findOrCreate(periodDate, periodDate),
    ]);
 
    const saleReport = await this.bookingStaffSaleReportService.createOrUpdate(
      {
        periodId: period.id,
        bookingId: booking.id,
        staffId: staff.id,
        salonId: staff.salonId,
      },
      {
        ...input,
        periodId: period.id,
        bookingId: booking.id,
        staffId: staff.id,
        salonId: staff.salonId,
      },
    );
 
    const transformed = await transform
      .include('period')
      .item(saleReport, 'BookingStaffSaleReportTransformer');
    return response.success(transformed, 201);
  }
}
 
module.exports = SystemBookingStaffSaleReportController;