diff --git a/apps/web/dataconnect/connector/account/mutations.gql b/apps/web/dataconnect/connector/account/mutations.gql new file mode 100644 index 00000000..d8d55df4 --- /dev/null +++ b/apps/web/dataconnect/connector/account/mutations.gql @@ -0,0 +1,51 @@ +mutation createAccount( + $bank: String! + $type: AccountType! + $last4: String! + $isPrimary: Boolean + $ownerId: UUID! + $accountNumber: String + $routeNumber: String + $expiryTime: Timestamp +) @auth(level: USER) { + account_insert( + data: { + bank: $bank + type: $type + last4: $last4 + isPrimary: $isPrimary + ownerId: $ownerId + accountNumber: $accountNumber + routeNumber: $routeNumber + expiryTime: $expiryTime + } + ) +} + +mutation updateAccount( + $id: UUID! + $bank: String + $type: AccountType + $last4: String + $isPrimary: Boolean + $accountNumber: String + $routeNumber: String + $expiryTime: Timestamp +) @auth(level: USER) { + account_update( + id: $id + data: { + bank: $bank + type: $type + last4: $last4 + isPrimary: $isPrimary + accountNumber: $accountNumber + routeNumber: $routeNumber + expiryTime: $expiryTime + } + ) +} + +mutation deleteAccount($id: UUID!) @auth(level: USER) { + account_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/account/queries.gql b/apps/web/dataconnect/connector/account/queries.gql new file mode 100644 index 00000000..672211b6 --- /dev/null +++ b/apps/web/dataconnect/connector/account/queries.gql @@ -0,0 +1,70 @@ +query listAccounts @auth(level: USER) { + accounts { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query getAccountById($id: UUID!) @auth(level: USER) { + account(id: $id) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query getAccountsByOwnerId($ownerId: UUID!) @auth(level: USER) { + accounts(where: { ownerId: { eq: $ownerId } }) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query filterAccounts( + $bank: String + $type: AccountType + $isPrimary: Boolean + $ownerId: UUID +) @auth(level: USER) { + accounts( + where: { + bank: { eq: $bank } + type: { eq: $type } + isPrimary: { eq: $isPrimary } + ownerId: { eq: $ownerId } + } + ) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + expiryTime + routeNumber + } +} diff --git a/apps/web/dataconnect/connector/activityLog/mutations.gql b/apps/web/dataconnect/connector/activityLog/mutations.gql new file mode 100644 index 00000000..772cac1d --- /dev/null +++ b/apps/web/dataconnect/connector/activityLog/mutations.gql @@ -0,0 +1,96 @@ +mutation createActivityLog( + $userId: String! + + $date: Timestamp! + $hourStart: String + $hourEnd: String + $totalhours: String + $iconType: ActivityIconType + $iconColor: String + + $title: String! + $description: String! + $isRead: Boolean + $activityType: ActivityType! +) @auth(level: USER) { + activityLog_insert( + data: { + userId: $userId + + date: $date + hourStart: $hourStart + hourEnd: $hourEnd + totalhours: $totalhours + iconType: $iconType + iconColor: $iconColor + + title: $title + description: $description + isRead: $isRead + activityType: $activityType + } + ) +} + +mutation updateActivityLog( + $id: UUID! + + $userId: String + + $date: Timestamp + $hourStart: String + $hourEnd: String + $totalhours: String + $iconType: ActivityIconType + $iconColor: String + + $title: String + $description: String + $isRead: Boolean + $activityType: ActivityType +) @auth(level: USER) { + activityLog_update( + id: $id + data: { + userId: $userId + + date: $date + hourStart: $hourStart + hourEnd: $hourEnd + totalhours: $totalhours + iconType: $iconType + iconColor: $iconColor + + title: $title + description: $description + isRead: $isRead + activityType: $activityType + } + ) +} + +# ---------------------------------------------------------- +# MARK AS READ (single) +# ---------------------------------------------------------- +mutation markActivityLogAsRead($id: UUID!) @auth(level: USER) { + activityLog_update( + id: $id + data: { isRead: true } + ) +} + +# ---------------------------------------------------------- +# MARK MANY AS READ (correct op name in your DC) +# ---------------------------------------------------------- +mutation markActivityLogsAsRead( + $ids: [UUID!]! +) @auth(level: USER) { + activityLog_updateMany( + where: { id: { in: $ids } } + data: { isRead: true } + ) +} + +mutation deleteActivityLog($id: UUID!) @auth(level: USER) { + activityLog_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/activityLog/queries.gql b/apps/web/dataconnect/connector/activityLog/queries.gql new file mode 100644 index 00000000..f0267068 --- /dev/null +++ b/apps/web/dataconnect/connector/activityLog/queries.gql @@ -0,0 +1,175 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listActivityLogs( + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs(offset: $offset, limit: $limit) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getActivityLogById($id: UUID!) @auth(level: USER) { + activityLog(id: $id) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# LIST BY USER +# ---------------------------------------------------------- +query listActivityLogsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { userId: { eq: $userId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# LIST UNREAD BY USER (common for notifications UI) +# ---------------------------------------------------------- +query listUnreadActivityLogsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { + userId: { eq: $userId } + isRead: { eq: false } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# FILTER (user + date range + read status + type) +# NOTE: Timestamp filter uses ge/le (NOT gte/lte) +# ---------------------------------------------------------- +query filterActivityLogs( + $userId: String + $dateFrom: Timestamp + $dateTo: Timestamp + $isRead: Boolean + $activityType: ActivityType + $iconType: ActivityIconType + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { + userId: { eq: $userId } + date: { ge: $dateFrom, le: $dateTo } + isRead: { eq: $isRead } + activityType: { eq: $activityType } + iconType: { eq: $iconType } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/application/mutations.gql b/apps/web/dataconnect/connector/application/mutations.gql new file mode 100644 index 00000000..c978383d --- /dev/null +++ b/apps/web/dataconnect/connector/application/mutations.gql @@ -0,0 +1,47 @@ +mutation createApplication( + $shiftId: UUID! + $staffId: UUID! + $status: ApplicationStatus! + $checkInTime: Timestamp + $checkOutTime: Timestamp + $origin: ApplicationOrigin! + $roleId: UUID! +) @auth(level: USER) { + application_insert( + data: { + shiftId: $shiftId + staffId: $staffId + status: $status + checkInTime: $checkInTime + checkOutTime: $checkOutTime + origin: $origin + roleId: $roleId + } + ) +} + +mutation updateApplicationStatus( + $id: UUID! + $shiftId: UUID + $staffId: UUID + $status: ApplicationStatus + $checkInTime: Timestamp + $checkOutTime: Timestamp + $roleId: UUID! +) @auth(level: USER) { + application_update( + id: $id + data: { + shiftId: $shiftId + staffId: $staffId + status: $status + checkInTime: $checkInTime + checkOutTime: $checkOutTime + roleId: $roleId + } + ) +} + +mutation deleteApplication($id: UUID!) @auth(level: USER) { + application_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/application/queries.gql b/apps/web/dataconnect/connector/application/queries.gql new file mode 100644 index 00000000..dd0e0964 --- /dev/null +++ b/apps/web/dataconnect/connector/application/queries.gql @@ -0,0 +1,403 @@ +query listApplications @auth(level: USER) { + applications { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + location + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +query getApplicationById($id: UUID!) @auth(level: USER) { + application(id: $id) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + location + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +query getApplicationsByShiftId($shiftId: UUID!) @auth(level: USER) { + applications(where: { shiftId: { eq: $shiftId } }) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + location + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + + } +} + +query getApplicationsByShiftIdAndStatus( + $shiftId: UUID! + $status: ApplicationStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + shiftId: { eq: $shiftId } + status: { eq: $status } + } + offset: $offset + limit: $limit + ) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + location + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +query getApplicationsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + location + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + + } +} + +#getting staffs of an shiftrole ACCEPTED for orders view client +query listAcceptedApplicationsByShiftRoleKey( + $shiftId: UUID! + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + shiftId: { eq: $shiftId } + roleId: { eq: $roleId } + status: { eq: ACCEPTED } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + checkInTime + checkOutTime + staff { id fullName email phone photoUrl } + } +} + +#getting staffs of an shiftrole ACCEPTED for orders of the day view client +query listAcceptedApplicationsByBusinessForDay( + $businessId: UUID! + $dayStart: Timestamp! + $dayEnd: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + status: { eq: ACCEPTED } + shift: { + date: { ge: $dayStart, le: $dayEnd } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + shiftId + roleId + checkInTime + checkOutTime + appliedAt + staff { id fullName email phone photoUrl } + } +} + +#coverage list and today live +query listStaffsApplicationsByBusinessForDay( + $businessId: UUID! + $dayStart: Timestamp! + $dayEnd: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + status: {in: [ACCEPTED, CONFIRMED, CHECKED_IN, CHECKED_OUT, LATE]} + shift: { + date: { ge: $dayStart, le: $dayEnd } + order: { businessId: { eq: $businessId } } + #status: { eq: ACCEPTED } + } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + shiftId + roleId + checkInTime + checkOutTime + appliedAt + status + + shiftRole{ + shift{ + location + cost + } + count + assigned + + role{ + name + } + } + staff { id fullName email phone photoUrl } + } +} \ No newline at end of file diff --git a/apps/web/dataconnect/connector/assignment/mutations.gql b/apps/web/dataconnect/connector/assignment/mutations.gql new file mode 100644 index 00000000..69a14289 --- /dev/null +++ b/apps/web/dataconnect/connector/assignment/mutations.gql @@ -0,0 +1,71 @@ +mutation CreateAssignment( + $workforceId: UUID! + $title: String + $description: String + $instructions: String + $status: AssignmentStatus + $tipsAvailable: Boolean + $travelTime: Boolean + $mealProvided: Boolean + $parkingAvailable: Boolean + $gasCompensation: Boolean + $managers: [Any!] + $roleId: UUID! + $shiftId: UUID! +) @auth(level: USER) { + assignment_insert( + data: { + workforceId: $workforceId + title: $title + description: $description + instructions: $instructions + status: $status + tipsAvailable: $tipsAvailable + travelTime: $travelTime + mealProvided: $mealProvided + parkingAvailable: $parkingAvailable + gasCompensation: $gasCompensation + managers: $managers + roleId: $roleId + shiftId: $shiftId + } + ) +} + +mutation UpdateAssignment( + $id: UUID! + $title: String + $description: String + $instructions: String + $status: AssignmentStatus + $tipsAvailable: Boolean + $travelTime: Boolean + $mealProvided: Boolean + $parkingAvailable: Boolean + $gasCompensation: Boolean + $managers: [Any!] + $roleId: UUID! + $shiftId: UUID! +) @auth(level: USER) { + assignment_update( + id: $id + data: { + title: $title + description: $description + instructions: $instructions + status: $status + tipsAvailable: $tipsAvailable + travelTime: $travelTime + mealProvided: $mealProvided + parkingAvailable: $parkingAvailable + gasCompensation: $gasCompensation + managers: $managers + roleId: $roleId + shiftId: $shiftId + } + ) +} + +mutation DeleteAssignment($id: UUID!) @auth(level: USER) { + assignment_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/assignment/queries.gql b/apps/web/dataconnect/connector/assignment/queries.gql new file mode 100644 index 00000000..c65a8559 --- /dev/null +++ b/apps/web/dataconnect/connector/assignment/queries.gql @@ -0,0 +1,278 @@ +# ------------------------------------------------------------ +# LIST ALL ASSIGNMENTS (admin/debug) +# ------------------------------------------------------------ +query listAssignments( + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments(offset: $offset, limit: $limit) { + id + title + status + createdAt + + workforce { + id + workforceNumber + staff { id fullName } + } + + shiftRole { + id + count + assigned + startTime + endTime + hours + totalValue + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + latitude + longitude + status + + order { + id + eventName + business { id businessName email contactName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# GET ASSIGNMENT BY ID +# ------------------------------------------------------------ +query getAssignmentById($id: UUID!) @auth(level: USER) { + assignment(id: $id) { + id + title + description + instructions + status + tipsAvailable + travelTime + mealProvided + parkingAvailable + gasCompensation + managers + createdAt + updatedAt + createdBy + + workforce { + id + workforceNumber + status + staff { id fullName } + } + + shiftRole { + id + startTime + endTime + hours + totalValue + breakType + uniform + department + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + latitude + longitude + status + managers + + order { + id + eventName + orderType + business { id businessName email contactName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# MY ASSIGNMENTS (by workforceId) - Staff view +# ------------------------------------------------------------ +query listAssignmentsByWorkforceId( + $workforceId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { workforceId: { eq: $workforceId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + title + status + createdAt + + workforce { + id + workforceNumber + staff { id fullName } + } + + shiftRole { + id + startTime + endTime + hours + totalValue + role { id name costPerHour } + + shift { + id + title + date + location + status + + order { + id + eventName + business { id businessName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# ASSIGNMENTS FOR A VENDOR (Vendor dashboard) +# Approach: filter by workforce.vendorId (relation) +# If Data Connect can't filter nested, use 2-step: +# 1) listWorkforceByVendorId => workforce ids +# 2) assignments(where: { workforceId: { in: [...] } }) +# ------------------------------------------------------------ +query listAssignmentsByWorkforceIds( + $workforceIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { workforceId: { in: $workforceIds } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + title + status + createdAt + + workforce { id workforceNumber staff { id fullName } } + + shiftRole { + id + role { id name } + shift { + id + title + date + order { + id + eventName + business { id businessName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# ASSIGNMENTS BY SHIFT ROLE (useful for staffing) +# ------------------------------------------------------------ +query listAssignmentsByShiftRole( + $shiftId: UUID! + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { + shiftId: { eq: $shiftId } + roleId: { eq: $roleId } + } + offset: $offset + limit: $limit + ) { + id + title + status + createdAt + workforce { id workforceNumber staff { id fullName } } + } +} + +# ------------------------------------------------------------ + +# FILTER ASSIGNMENTS (status + date range) +# Date range is based on Shift.date through the relation (NOT filterable directly). +# +# Since ShiftRole uses a composite key (shiftId + roleId), +# Assignments must be filtered using BOTH fields. +# +# So the filtering flow is: +# 1) Get Shifts in the date range => shiftIds +# 2) Get ShiftRoles where shiftId IN shiftIds => (shiftId, roleId) pairs +# 3) Get Assignments where: +# - shiftId matches +# - roleId matches +# - status matches (optional) +# +# This query represents step 3. +# ------------------------------------------------------------ +query filterAssignments( + $shiftIds: [UUID!]! + $roleIds: [UUID!]! + $status: AssignmentStatus + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { + shiftId: { in: $shiftIds } + roleId: { in: $roleIds } + status: { eq: $status } + } + offset: $offset + limit: $limit + ) { + id + title + status + createdAt + + workforce { id workforceNumber staff { id fullName } } + + shiftRole { + id + role { id name } + shift { id title date location status } + } + } +} diff --git a/apps/web/dataconnect/connector/attireOption/mutations.gql b/apps/web/dataconnect/connector/attireOption/mutations.gql new file mode 100644 index 00000000..59f4f7f9 --- /dev/null +++ b/apps/web/dataconnect/connector/attireOption/mutations.gql @@ -0,0 +1,45 @@ +mutation createAttireOption( + $itemId: String! + $label: String! + $icon: String + $imageUrl: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOption_insert( + data: { + itemId: $itemId + label: $label + icon: $icon + imageUrl: $imageUrl + isMandatory: $isMandatory + vendorId: $vendorId + } + ) +} + +mutation updateAttireOption( + $id: UUID! + $itemId: String + $label: String + $icon: String + $imageUrl: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOption_update( + id: $id + data: { + itemId: $itemId + label: $label + icon: $icon + imageUrl: $imageUrl + isMandatory: $isMandatory + vendorId: $vendorId + } + ) +} + +mutation deleteAttireOption($id: UUID!) @auth(level: USER) { + attireOption_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/attireOption/queries.gql b/apps/web/dataconnect/connector/attireOption/queries.gql new file mode 100644 index 00000000..76ce2817 --- /dev/null +++ b/apps/web/dataconnect/connector/attireOption/queries.gql @@ -0,0 +1,47 @@ +query listAttireOptions @auth(level: USER) { + attireOptions { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + createdAt + } +} + +query getAttireOptionById($id: UUID!) @auth(level: USER) { + attireOption(id: $id) { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + createdAt + } +} + +query filterAttireOptions( + $itemId: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOptions( + where: { + itemId: { eq: $itemId } + isMandatory: { eq: $isMandatory } + vendorId: { eq: $vendorId } + } + ) { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + } +} diff --git a/apps/web/dataconnect/connector/benefitsData/mutations.gql b/apps/web/dataconnect/connector/benefitsData/mutations.gql new file mode 100644 index 00000000..bd554b01 --- /dev/null +++ b/apps/web/dataconnect/connector/benefitsData/mutations.gql @@ -0,0 +1,36 @@ + +mutation createBenefitsData( + $vendorBenefitPlanId: UUID! + $staffId: UUID! + $current: Int! +) @auth(level: USER) { + benefitsData_insert( + data: { + vendorBenefitPlanId: $vendorBenefitPlanId + staffId: $staffId + current: $current + } + ) +} + +mutation updateBenefitsData( + $staffId: UUID! + $vendorBenefitPlanId: UUID! + $current: Int +) @auth(level: USER) { + benefitsData_update( + key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId } + data: { + current: $current + } + ) +} + +mutation deleteBenefitsData( + $staffId: UUID! + $vendorBenefitPlanId: UUID! +) @auth(level: USER) { + benefitsData_delete( + key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId } + ) +} diff --git a/apps/web/dataconnect/connector/benefitsData/queries.gql b/apps/web/dataconnect/connector/benefitsData/queries.gql new file mode 100644 index 00000000..2bc60a37 --- /dev/null +++ b/apps/web/dataconnect/connector/benefitsData/queries.gql @@ -0,0 +1,165 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listBenefitsData( + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas(offset: $offset, limit: $limit) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (staffId + vendorBenefitPlanId) ✅ (replaces getById in practice) +# ---------------------------------------------------------- +query getBenefitsDataByKey( + $staffId: UUID! + $vendorBenefitPlanId: UUID! +) @auth(level: USER) { + benefitsData(key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId }) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY STAFF +# ---------------------------------------------------------- +query listBenefitsDataByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR BENEFIT PLAN +# ---------------------------------------------------------- +query listBenefitsDataByVendorBenefitPlanId( + $vendorBenefitPlanId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { vendorBenefitPlanId: { eq: $vendorBenefitPlanId } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR (2-step helper: planIds -> benefitsDatas IN) +# ---------------------------------------------------------- +query listBenefitsDataByVendorBenefitPlanIds( + $vendorBenefitPlanIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { vendorBenefitPlanId: { in: $vendorBenefitPlanIds } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} diff --git a/apps/web/dataconnect/connector/business/mutations.gql b/apps/web/dataconnect/connector/business/mutations.gql new file mode 100644 index 00000000..437527d6 --- /dev/null +++ b/apps/web/dataconnect/connector/business/mutations.gql @@ -0,0 +1,75 @@ +mutation createBusiness( + $businessName: String!, + $contactName: String, + $userId: String!, + $companyLogoUrl: String, + $phone: String, + $email: String, + $hubBuilding: String, + $address: String, + $city: String, + $area: BusinessArea, + $sector: BusinessSector, + $rateGroup: BusinessRateGroup!, + $status: BusinessStatus!, + $notes: String +) @auth(level: USER) { + business_insert( + data: { + businessName: $businessName, + contactName: $contactName, + userId: $userId, + companyLogoUrl: $companyLogoUrl, + phone: $phone, + email: $email, + hubBuilding: $hubBuilding, + address: $address, + city: $city, + area: $area, + sector: $sector, + rateGroup: $rateGroup, + status: $status, + notes: $notes + } + ) +} + +mutation updateBusiness( + $id: UUID!, + $businessName: String, + $contactName: String, + $companyLogoUrl: String, + $phone: String, + $email: String, + $hubBuilding: String, + $address: String, + $city: String, + $area: BusinessArea, + $sector: BusinessSector, + $rateGroup: BusinessRateGroup, + $status: BusinessStatus, + $notes: String +) @auth(level: USER) { + business_update( + id: $id, + data: { + businessName: $businessName, + contactName: $contactName, + companyLogoUrl: $companyLogoUrl, + phone: $phone, + email: $email, + hubBuilding: $hubBuilding, + address: $address, + city: $city, + area: $area, + sector: $sector, + rateGroup: $rateGroup, + status: $status, + notes: $notes + } + ) +} + +mutation deleteBusiness($id: UUID!) @auth(level: USER) { + business_delete(id: $id) +} \ No newline at end of file diff --git a/apps/web/dataconnect/connector/business/queries.gql b/apps/web/dataconnect/connector/business/queries.gql new file mode 100644 index 00000000..8484fce0 --- /dev/null +++ b/apps/web/dataconnect/connector/business/queries.gql @@ -0,0 +1,65 @@ +query listBusinesses @auth(level: USER) { + businesses { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} + +query getBusinessesByUserId($userId: String!) @auth(level: USER) { + businesses(where: { userId: { eq: $userId } }) { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} + +query getBusinessById($id: UUID!) @auth(level: USER) { + business(id: $id) { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} \ No newline at end of file diff --git a/apps/web/dataconnect/connector/category/mutations.gql b/apps/web/dataconnect/connector/category/mutations.gql new file mode 100644 index 00000000..f143f01f --- /dev/null +++ b/apps/web/dataconnect/connector/category/mutations.gql @@ -0,0 +1,34 @@ +mutation createCategory( + $categoryId: String! + $label: String! + $icon: String +) @auth(level: USER) { + category_insert( + data: { + categoryId: $categoryId + label: $label + icon: $icon + } + ) +} + +mutation updateCategory( + $id: UUID! + $categoryId: String + $label: String + $icon: String +) @auth(level: USER) { + category_update( + id: $id + data: { + categoryId: $categoryId + label: $label + icon: $icon + } + ) +} + + +mutation deleteCategory($id: UUID!) @auth(level: USER) { + category_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/category/queries.gql b/apps/web/dataconnect/connector/category/queries.gql new file mode 100644 index 00000000..3a4b2d02 --- /dev/null +++ b/apps/web/dataconnect/connector/category/queries.gql @@ -0,0 +1,43 @@ +query listCategories @auth(level: USER) { + categories { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} + +query getCategoryById($id: UUID!) @auth(level: USER) { + category(id: $id) { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} + +query filterCategories( + $categoryId: String + $label: String +) @auth(level: USER) { + categories( + where: { + categoryId: { eq: $categoryId } + label: { eq: $label } + } + ) { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/certificate/mutations.gql b/apps/web/dataconnect/connector/certificate/mutations.gql new file mode 100644 index 00000000..6fc8128a --- /dev/null +++ b/apps/web/dataconnect/connector/certificate/mutations.gql @@ -0,0 +1,65 @@ +mutation CreateCertificate( + $name: String! + $description: String + $expiry: Timestamp + $status: CertificateStatus! + $fileUrl: String + $icon: String + $certificationType: ComplianceType + $issuer: String + $staffId: UUID! + $validationStatus: ValidationStatus + $certificateNumber: String +) @auth(level: USER) { + certificate_insert( + data: { + name: $name + description: $description + expiry: $expiry + status: $status + fileUrl: $fileUrl + icon: $icon + staffId: $staffId + certificationType: $certificationType + issuer: $issuer + validationStatus: $validationStatus + certificateNumber: $certificateNumber + } + ) +} + +mutation UpdateCertificate( + $id: UUID! + $name: String + $description: String + $expiry: Timestamp + $status: CertificateStatus + $fileUrl: String + $icon: String + $staffId: UUID + $certificationType: ComplianceType + $issuer: String + $validationStatus: ValidationStatus + $certificateNumber: String +) @auth(level: USER) { + certificate_update( + id: $id + data: { + name: $name + description: $description + expiry: $expiry + status: $status + fileUrl: $fileUrl + icon: $icon + staffId: $staffId + certificationType: $certificationType + issuer: $issuer + validationStatus: $validationStatus + certificateNumber: $certificateNumber + } + ) +} + +mutation DeleteCertificate($id: UUID!) @auth(level: USER) { + certificate_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/certificate/queries.gql b/apps/web/dataconnect/connector/certificate/queries.gql new file mode 100644 index 00000000..f154e34b --- /dev/null +++ b/apps/web/dataconnect/connector/certificate/queries.gql @@ -0,0 +1,72 @@ +query listCertificates @auth(level: USER) { + certificates { + id + name + description + expiry + status + fileUrl + icon + staffId + certificationType + issuer + validationStatus + certificateNumber + createdAt + + staff { + id + fullName + } + + } +} + +query getCertificateById($id: UUID!) @auth(level: USER) { + certificate(id: $id) { + id + name + description + expiry + status + fileUrl + icon + certificationType + issuer + staffId + validationStatus + certificateNumber + updatedAt + + staff { + id + fullName + } + + } +} + +query listCertificatesByStaffId($staffId: UUID!) @auth(level: USER) { + certificates(where: { staffId: { eq: $staffId } }) { + id + name + description + expiry + status + fileUrl + icon + staffId + certificationType + issuer + validationStatus + certificateNumber + createdAt + + staff { + id + fullName + } + + } +} + diff --git a/apps/web/dataconnect/connector/clientFeedback/mutations.gql b/apps/web/dataconnect/connector/clientFeedback/mutations.gql new file mode 100644 index 00000000..c9c2e63b --- /dev/null +++ b/apps/web/dataconnect/connector/clientFeedback/mutations.gql @@ -0,0 +1,43 @@ +mutation createClientFeedback( + $businessId: UUID! + $vendorId: UUID! + $rating: Int + $comment: String + $date: Timestamp + $createdBy: String +) @auth(level: USER) { + clientFeedback_insert( + data: { + businessId: $businessId + vendorId: $vendorId + rating: $rating + comment: $comment + date: $date + } + ) +} + +mutation updateClientFeedback( + $id: UUID! + $businessId: UUID + $vendorId: UUID + $rating: Int + $comment: String + $date: Timestamp + $createdBy: String +) @auth(level: USER) { + clientFeedback_update( + id: $id + data: { + businessId: $businessId + vendorId: $vendorId + rating: $rating + comment: $comment + date: $date + } + ) +} + +mutation deleteClientFeedback($id: UUID!) @auth(level: USER) { + clientFeedback_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/clientFeedback/queries.gql b/apps/web/dataconnect/connector/clientFeedback/queries.gql new file mode 100644 index 00000000..9a8702ba --- /dev/null +++ b/apps/web/dataconnect/connector/clientFeedback/queries.gql @@ -0,0 +1,185 @@ +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listClientFeedbacks( + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks(offset: $offset, limit: $limit) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getClientFeedbackById($id: UUID!) @auth(level: USER) { + clientFeedback(id: $id) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS +# ---------------------------------------------------------- +query listClientFeedbacksByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR +# ---------------------------------------------------------- +query listClientFeedbacksByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS + VENDOR (pair) +# ---------------------------------------------------------- +query listClientFeedbacksByBusinessAndVendor( + $businessId: UUID! + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { + businessId: { eq: $businessId } + vendorId: { eq: $vendorId } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# FILTER (rating + date range) +# NOTE: using Timestamp ops: ge/le +# ---------------------------------------------------------- +query filterClientFeedbacks( + $businessId: UUID + $vendorId: UUID + $ratingMin: Int + $ratingMax: Int + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { + businessId: { eq: $businessId } + vendorId: { eq: $vendorId } + rating: { ge: $ratingMin, le: $ratingMax } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# QUICK KPI: average rating for a vendor (client-side aggregate) +# You fetch rows; Flutter/web computes avg. +# ---------------------------------------------------------- +query listClientFeedbackRatingsByVendorId( + $vendorId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp +) @auth(level: USER) { + clientFeedbacks( + where: { + vendorId: { eq: $vendorId } + date: { ge: $dateFrom, le: $dateTo } + } + orderBy: { date: DESC } + ) { + id + rating + comment + date + business { id businessName } + vendor { id companyName } + } +} diff --git a/apps/web/dataconnect/connector/connector.yaml b/apps/web/dataconnect/connector/connector.yaml new file mode 100644 index 00000000..1cf85dcd --- /dev/null +++ b/apps/web/dataconnect/connector/connector.yaml @@ -0,0 +1,5 @@ +connectorId: example +generate: + dartSdk: + - outputDir: ../../../apps/mobile/packages/data_connect/lib/src/dataconnect_generated + package: dataconnect_generated/generated.dart diff --git a/apps/web/dataconnect/connector/conversation/mutations.gql b/apps/web/dataconnect/connector/conversation/mutations.gql new file mode 100644 index 00000000..304aa37f --- /dev/null +++ b/apps/web/dataconnect/connector/conversation/mutations.gql @@ -0,0 +1,69 @@ + +mutation createConversation( + $subject: String + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $groupName: String + $lastMessage: String + $lastMessageAt: Timestamp +) @auth(level: USER) { + conversation_insert( + data: { + subject: $subject + status: $status + conversationType: $conversationType + isGroup: $isGroup + groupName: $groupName + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +mutation updateConversation( + $id: UUID! + + $subject: String + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $groupName: String + $lastMessage: String + $lastMessageAt: Timestamp + +) @auth(level: USER) { + conversation_update( + id: $id + data: { + subject: $subject + status: $status + conversationType: $conversationType + isGroup: $isGroup + groupName: $groupName + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +# ---------------------------------------------------------- +# UPDATE LAST MESSAGE +# ---------------------------------------------------------- +mutation updateConversationLastMessage( + $id: UUID! + $lastMessage: String + $lastMessageAt: Timestamp +) @auth(level: USER) { + conversation_update( + id: $id + data: { + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +mutation deleteConversation($id: UUID!) @auth(level: USER) { + conversation_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/conversation/queries.gql b/apps/web/dataconnect/connector/conversation/queries.gql new file mode 100644 index 00000000..e45cf6b6 --- /dev/null +++ b/apps/web/dataconnect/connector/conversation/queries.gql @@ -0,0 +1,125 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listConversations( + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations(offset: $offset, limit: $limit, orderBy: { updatedAt: DESC }) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getConversationById($id: UUID!) @auth(level: USER) { + conversation(id: $id) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY TYPE (CLIENT_VENDOR / GROUP_STAFF) +# ---------------------------------------------------------- +query listConversationsByType( + $conversationType: ConversationType! + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { conversationType: { eq: $conversationType } } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY STATUS (ACTIVE) +# ---------------------------------------------------------- +query listConversationsByStatus( + $status: ConversationStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# FILTER (dashboard/debug) +# Supports searching by multiple optional fields +# ---------------------------------------------------------- +query filterConversations( + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $lastMessageAfter: Timestamp + $lastMessageBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { + status: { eq: $status } + conversationType: { eq: $conversationType } + isGroup: { eq: $isGroup } + lastMessageAt: { ge: $lastMessageAfter, le: $lastMessageBefore } + } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} diff --git a/apps/web/dataconnect/connector/course/mutations.gql b/apps/web/dataconnect/connector/course/mutations.gql new file mode 100644 index 00000000..71423710 --- /dev/null +++ b/apps/web/dataconnect/connector/course/mutations.gql @@ -0,0 +1,53 @@ +mutation createCourse( + $title: String + $description: String + $thumbnailUrl: String + $durationMinutes: Int + $xpReward: Int + $categoryId: UUID! + $levelRequired: String + $isCertification: Boolean +) @auth(level: USER) { + course_insert( + data: { + title: $title + description: $description + thumbnailUrl: $thumbnailUrl + durationMinutes: $durationMinutes + xpReward: $xpReward + categoryId: $categoryId + levelRequired: $levelRequired + isCertification: $isCertification + } + ) +} + +mutation updateCourse( + $id: UUID! + $title: String + $description: String + $thumbnailUrl: String + $durationMinutes: Int + $xpReward: Int + $categoryId: UUID! + $levelRequired: String + $isCertification: Boolean +) @auth(level: USER) { + course_update( + id: $id + data: { + title: $title + description: $description + thumbnailUrl: $thumbnailUrl + durationMinutes: $durationMinutes + xpReward: $xpReward + categoryId: $categoryId + levelRequired: $levelRequired + isCertification: $isCertification + } + ) +} + +mutation deleteCourse($id: UUID!) @auth(level: USER) { + course_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/course/queries.gql b/apps/web/dataconnect/connector/course/queries.gql new file mode 100644 index 00000000..2e6d8552 --- /dev/null +++ b/apps/web/dataconnect/connector/course/queries.gql @@ -0,0 +1,68 @@ +query listCourses @auth(level: USER) { + courses { + id + title + description + thumbnailUrl + durationMinutes + xpReward + categoryId + levelRequired + isCertification + createdAt + + category{ + id + label + } + + } +} + +query getCourseById($id: UUID!) @auth(level: USER) { + course(id: $id) { + id + title + description + thumbnailUrl + durationMinutes + xpReward + categoryId + levelRequired + isCertification + createdAt + + category{ + id + label + } + + } +} + +query filterCourses( + $categoryId: UUID + $isCertification: Boolean + $levelRequired: String + $completed: Boolean +) @auth(level: USER) { + courses( + where: { + categoryId: { eq: $categoryId } + isCertification: { eq: $isCertification } + levelRequired: { eq: $levelRequired } + } + ) { + id + title + categoryId + levelRequired + isCertification + + category{ + id + label + } + + } +} diff --git a/apps/web/dataconnect/connector/customRateCard/mutations.gql b/apps/web/dataconnect/connector/customRateCard/mutations.gql new file mode 100644 index 00000000..4b212962 --- /dev/null +++ b/apps/web/dataconnect/connector/customRateCard/mutations.gql @@ -0,0 +1,37 @@ +mutation createCustomRateCard( + $name: String!, + $baseBook: String, + $discount: Float, + $isDefault: Boolean +) @auth(level: USER) { + customRateCard_insert( + data: { + name: $name, + baseBook: $baseBook, + discount: $discount, + isDefault: $isDefault + } + ) +} + +mutation updateCustomRateCard( + $id: UUID!, + $name: String, + $baseBook: String, + $discount: Float, + $isDefault: Boolean +) @auth(level: USER) { + customRateCard_update( + id: $id, + data: { + name: $name, + baseBook: $baseBook, + discount: $discount, + isDefault: $isDefault + } + ) +} + +mutation deleteCustomRateCard($id: UUID!) @auth(level: USER) { + customRateCard_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/customRateCard/queries.gql b/apps/web/dataconnect/connector/customRateCard/queries.gql new file mode 100644 index 00000000..e110c349 --- /dev/null +++ b/apps/web/dataconnect/connector/customRateCard/queries.gql @@ -0,0 +1,23 @@ +query listCustomRateCards @auth(level: USER) { + customRateCards { + id + name + baseBook + discount + isDefault + createdAt + updatedAt + } +} + +query getCustomRateCardById($id: UUID!) @auth(level: USER) { + customRateCard(id: $id) { + id + name + baseBook + discount + isDefault + createdAt + updatedAt + } +} diff --git a/apps/web/dataconnect/connector/document/mutations.gql b/apps/web/dataconnect/connector/document/mutations.gql new file mode 100644 index 00000000..74055a4e --- /dev/null +++ b/apps/web/dataconnect/connector/document/mutations.gql @@ -0,0 +1,33 @@ +mutation createDocument( + $documentType: DocumentType! + $name: String! + $description: String +) @auth(level: USER) { + document_insert( + data: { + documentType: $documentType + name: $name + description: $description + } + ) +} + +mutation updateDocument( + $id: UUID! + $documentType: DocumentType + $name: String + $description: String +) @auth(level: USER) { + document_update( + id: $id + data: { + documentType: $documentType + name: $name + description: $description + } + ) +} + +mutation deleteDocument($id: UUID!) @auth(level: USER) { + document_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/document/queries.gql b/apps/web/dataconnect/connector/document/queries.gql new file mode 100644 index 00000000..b44c1ce3 --- /dev/null +++ b/apps/web/dataconnect/connector/document/queries.gql @@ -0,0 +1,35 @@ +query listDocuments @auth(level: USER) { + documents { + id + documentType + name + description + createdAt + } +} + +query getDocumentById($id: UUID!) @auth(level: USER) { + document(id: $id) { + id + documentType + name + description + createdAt + } +} + +query filterDocuments( + $documentType: DocumentType +) @auth(level: USER) { + documents( + where: { + documentType: { eq: $documentType } + } + ) { + id + documentType + name + description + createdAt + } +} diff --git a/apps/web/dataconnect/connector/emergencyContact/mutations.gql b/apps/web/dataconnect/connector/emergencyContact/mutations.gql new file mode 100644 index 00000000..9148f685 --- /dev/null +++ b/apps/web/dataconnect/connector/emergencyContact/mutations.gql @@ -0,0 +1,35 @@ +mutation createEmergencyContact( + $name: String! + $phone: String! + $relationship: RelationshipType! + $staffId: UUID! +) @auth(level: USER) { + emergencyContact_insert( + data: { + name: $name + phone: $phone + relationship: $relationship + staffId: $staffId + } + ) +} + +mutation updateEmergencyContact( + $id: UUID! + $name: String + $phone: String + $relationship: RelationshipType +) @auth(level: USER) { + emergencyContact_update( + id: $id + data: { + name: $name + phone: $phone + relationship: $relationship + } + ) +} + +mutation deleteEmergencyContact($id: UUID!) @auth(level: USER) { + emergencyContact_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/emergencyContact/queries.gql b/apps/web/dataconnect/connector/emergencyContact/queries.gql new file mode 100644 index 00000000..65777051 --- /dev/null +++ b/apps/web/dataconnect/connector/emergencyContact/queries.gql @@ -0,0 +1,38 @@ +query listEmergencyContacts @auth(level: USER) { + emergencyContacts { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} + +query getEmergencyContactById($id: UUID!) @auth(level: USER) { + emergencyContact(id: $id) { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} + +query getEmergencyContactsByStaffId($staffId: UUID!) @auth(level: USER) { + emergencyContacts(where: { staffId: { eq: $staffId } }) { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/faqData/mutations.gql b/apps/web/dataconnect/connector/faqData/mutations.gql new file mode 100644 index 00000000..720be3c3 --- /dev/null +++ b/apps/web/dataconnect/connector/faqData/mutations.gql @@ -0,0 +1,29 @@ +mutation createFaqData( + $category: String! + $questions: [Any!] +) @auth(level: USER) { + faqData_insert( + data: { + category: $category + questions: $questions + } + ) +} + +mutation updateFaqData( + $id: UUID! + $category: String + $questions: [Any!] +) @auth(level: USER) { + faqData_update( + id: $id + data: { + category: $category + questions: $questions + } + ) +} + +mutation deleteFaqData($id: UUID!) @auth(level: USER) { + faqData_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/faqData/queries.gql b/apps/web/dataconnect/connector/faqData/queries.gql new file mode 100644 index 00000000..3a3c77d3 --- /dev/null +++ b/apps/web/dataconnect/connector/faqData/queries.gql @@ -0,0 +1,29 @@ +query listFaqDatas @auth(level: USER) { + faqDatas { + id + category + questions + createdAt + updatedAt + createdBy + } +} + +query getFaqDataById($id: UUID!) @auth(level: USER) { + faqData(id: $id) { + id + category + questions + createdAt + updatedAt + createdBy + } +} + +query filterFaqDatas($category: String) @auth(level: USER) { + faqDatas(where: { category: { eq: $category } }) { + id + category + questions + } +} diff --git a/apps/web/dataconnect/connector/hub/mutations.gql b/apps/web/dataconnect/connector/hub/mutations.gql new file mode 100644 index 00000000..bf7b0c18 --- /dev/null +++ b/apps/web/dataconnect/connector/hub/mutations.gql @@ -0,0 +1,41 @@ +mutation createHub( + $name: String! + $locationName: String + $address: String + $nfcTagId: String + $ownerId: UUID! +) @auth(level: USER) { + hub_insert( + data: { + name: $name + locationName: $locationName + address: $address + nfcTagId: $nfcTagId + ownerId: $ownerId + } + ) +} + +mutation updateHub( + $id: UUID! + $name: String + $locationName: String + $address: String + $nfcTagId: String + $ownerId: UUID +) @auth(level: USER) { + hub_update( + id: $id + data: { + name: $name + locationName: $locationName + address: $address + nfcTagId: $nfcTagId + ownerId: $ownerId + } + ) +} + +mutation deleteHub($id: UUID!) @auth(level: USER) { + hub_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/hub/queries.gql b/apps/web/dataconnect/connector/hub/queries.gql new file mode 100644 index 00000000..dc2a69c9 --- /dev/null +++ b/apps/web/dataconnect/connector/hub/queries.gql @@ -0,0 +1,62 @@ +query listHubs @auth(level: USER) { + hubs { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query getHubById($id: UUID!) @auth(level: USER) { + hub(id: $id) { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query getHubsByOwnerId($ownerId: UUID!) @auth(level: USER) { + hubs(where: { ownerId: { eq: $ownerId } }) { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query filterHubs( + $ownerId: UUID + $name: String + $nfcTagId: String +) @auth(level: USER) { + hubs( + where: { + ownerId: { eq: $ownerId } + name: { eq: $name } + nfcTagId: { eq: $nfcTagId } + } + ) { + id + name + locationName + address + nfcTagId + ownerId + } +} diff --git a/apps/web/dataconnect/connector/invoice/mutations.gql b/apps/web/dataconnect/connector/invoice/mutations.gql new file mode 100644 index 00000000..53af2552 --- /dev/null +++ b/apps/web/dataconnect/connector/invoice/mutations.gql @@ -0,0 +1,123 @@ + +mutation createInvoice( + $status: InvoiceStatus! + + $vendorId: UUID! + $businessId: UUID! + $orderId: UUID! + + $paymentTerms: InovicePaymentTerms + $invoiceNumber: String! + $issueDate: Timestamp! + $dueDate: Timestamp! + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float! + $notes: String + + $staffCount: Int + $chargesCount: Int + +) @auth(level: USER) { + invoice_insert( + data: { + status: $status + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + + } + ) +} + +mutation updateInvoice( + $id: UUID! + + $status: InvoiceStatus + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTerms + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int + + + $disputedItems: Any + $disputeReason: String + $disputeDetails: String +) @auth(level: USER) { + invoice_update( + id: $id + data: { + status: $status + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + + disputedItems: $disputedItems + disputeReason: $disputeReason + disputeDetails: $disputeDetails + + } + ) +} + +mutation deleteInvoice($id: UUID!) @auth(level: USER) { + invoice_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/invoice/queries.gql b/apps/web/dataconnect/connector/invoice/queries.gql new file mode 100644 index 00000000..deaf4c3a --- /dev/null +++ b/apps/web/dataconnect/connector/invoice/queries.gql @@ -0,0 +1,520 @@ + +# ------------------------------------------------------------ +# LIST ALL INVOICES (admin/debug) +# ------------------------------------------------------------ +query listInvoices( + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices(offset: $offset, limit: $limit) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# GET INVOICE BY ID +# ------------------------------------------------------------ +query getInvoiceById($id: UUID!) @auth(level: USER) { + invoice(id: $id) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY VENDOR +# ------------------------------------------------------------ +query listInvoicesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY BUSINESS +# ------------------------------------------------------------ +query listInvoicesByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY ORDER +# ------------------------------------------------------------ +query listInvoicesByOrderId( + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { orderId: { eq: $orderId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY STATUS +# ------------------------------------------------------------ +query listInvoicesByStatus( + $status: InvoiceStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { dueDate: ASC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# FILTER INVOICES (multi filters) +# NOTE: Timestamp filters use ge/le (NOT gte/lte) +# ------------------------------------------------------------ +query filterInvoices( + $vendorId: UUID + $businessId: UUID + $orderId: UUID + $status: InvoiceStatus + + $issueDateFrom: Timestamp + $issueDateTo: Timestamp + + $dueDateFrom: Timestamp + $dueDateTo: Timestamp + + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { + vendorId: { eq: $vendorId } + businessId: { eq: $businessId } + orderId: { eq: $orderId } + status: { eq: $status } + + issueDate: { ge: $issueDateFrom, le: $issueDateTo } + dueDate: { ge: $dueDateFrom, le: $dueDateTo } + } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} + +# ------------------------------------------------------------ +# OVERDUE INVOICES (dueDate < now and not PAID) +# NOTE: request.time works in @default; for filters, pass $now from client +# ------------------------------------------------------------ +query listOverdueInvoices( + $now: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { + dueDate: { lt: $now } + status: { ne: PAID } + } + offset: $offset + limit: $limit + orderBy: { dueDate: ASC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + hub + deparment + poReference + } + } +} diff --git a/apps/web/dataconnect/connector/invoiceTemplate/mutations.gql b/apps/web/dataconnect/connector/invoiceTemplate/mutations.gql new file mode 100644 index 00000000..3bf87c49 --- /dev/null +++ b/apps/web/dataconnect/connector/invoiceTemplate/mutations.gql @@ -0,0 +1,115 @@ + +mutation createInvoiceTemplate( + $name: String! + $ownerId: UUID! + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTermsTemp + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int +) @auth(level: USER) { + invoiceTemplate_insert( + data: { + name: $name + ownerId: $ownerId + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + } + ) +} + +mutation updateInvoiceTemplate( + $id: UUID! + + $name: String + $ownerId: UUID + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTermsTemp + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int +) @auth(level: USER) { + invoiceTemplate_update( + id: $id + data: { + name: $name + ownerId: $ownerId + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + } + ) +} + +mutation deleteInvoiceTemplate($id: UUID!) @auth(level: USER) { + invoiceTemplate_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/invoiceTemplate/queries.gql b/apps/web/dataconnect/connector/invoiceTemplate/queries.gql new file mode 100644 index 00000000..907ad1d2 --- /dev/null +++ b/apps/web/dataconnect/connector/invoiceTemplate/queries.gql @@ -0,0 +1,325 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listInvoiceTemplates( + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates(offset: $offset, limit: $limit) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getInvoiceTemplateById($id: UUID!) @auth(level: USER) { + invoiceTemplate(id: $id) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY OWNER (my templates) +# ---------------------------------------------------------- +query listInvoiceTemplatesByOwnerId( + $ownerId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { ownerId: { eq: $ownerId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR (templates tied to a vendor) +# ---------------------------------------------------------- +query listInvoiceTemplatesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS (templates tied to a business) +# ---------------------------------------------------------- +query listInvoiceTemplatesByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY ORDER (templates tied to a specific order) +# ---------------------------------------------------------- +query listInvoiceTemplatesByOrderId( + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { orderId: { eq: $orderId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# SEARCH (by name) within an owner +# ---------------------------------------------------------- +query searchInvoiceTemplatesByOwnerAndName( + $ownerId: UUID! + $name: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { + ownerId: { eq: $ownerId } + name: { eq: $name } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} diff --git a/apps/web/dataconnect/connector/level/mutations.gql b/apps/web/dataconnect/connector/level/mutations.gql new file mode 100644 index 00000000..4c5b978c --- /dev/null +++ b/apps/web/dataconnect/connector/level/mutations.gql @@ -0,0 +1,37 @@ +mutation createLevel( + $name: String! + $xpRequired: Int! + $icon: String + $colors: Any +) @auth(level: USER) { + level_insert( + data: { + name: $name + xpRequired: $xpRequired + icon: $icon + colors: $colors + } + ) +} + +mutation updateLevel( + $id: UUID! + $name: String + $xpRequired: Int + $icon: String + $colors: Any +) @auth(level: USER) { + level_update( + id: $id + data: { + name: $name + xpRequired: $xpRequired + icon: $icon + colors: $colors + } + ) +} + +mutation deleteLevel($id: UUID!) @auth(level: USER) { + level_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/level/queries.gql b/apps/web/dataconnect/connector/level/queries.gql new file mode 100644 index 00000000..42026e24 --- /dev/null +++ b/apps/web/dataconnect/connector/level/queries.gql @@ -0,0 +1,44 @@ +query listLevels @auth(level: USER) { + levels { + id + name + xpRequired + icon + colors + createdAt + updatedAt + createdBy + } +} + +query getLevelById($id: UUID!) @auth(level: USER) { + level(id: $id) { + id + name + xpRequired + icon + colors + createdAt + updatedAt + createdBy + } +} + +query filterLevels( + $name: String + $xpRequired: Int +) @auth(level: USER) { + levels( + where: { + name: { eq: $name } + xpRequired: { eq: $xpRequired } + } + ) { + id + name + xpRequired + icon + colors + } +} + diff --git a/apps/web/dataconnect/connector/memberTask/mutations.gql b/apps/web/dataconnect/connector/memberTask/mutations.gql new file mode 100644 index 00000000..d8690742 --- /dev/null +++ b/apps/web/dataconnect/connector/memberTask/mutations.gql @@ -0,0 +1,21 @@ + +mutation createMemberTask( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask_insert( + data: { + teamMemberId: $teamMemberId + taskId: $taskId + } + ) +} + +mutation deleteMemberTask( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask_delete( + key: { teamMemberId: $teamMemberId, taskId: $taskId } + ) +} diff --git a/apps/web/dataconnect/connector/memberTask/queries.gql b/apps/web/dataconnect/connector/memberTask/queries.gql new file mode 100644 index 00000000..0213ea2c --- /dev/null +++ b/apps/web/dataconnect/connector/memberTask/queries.gql @@ -0,0 +1,77 @@ + +query getMyTasks($teamMemberId: UUID!) @auth(level: USER) { + memberTasks(where: { teamMemberId: { eq: $teamMemberId } }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +#before named getMemberTaskByIdKey +query getMemberTaskByIdKey( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask(key: { teamMemberId: $teamMemberId, taskId: $taskId }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + } +} + +query getMemberTasksByTaskId($taskId: UUID!) @auth(level: USER) { + memberTasks(where: { taskId: { eq: $taskId } }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + } +} diff --git a/apps/web/dataconnect/connector/message/mutations.gql b/apps/web/dataconnect/connector/message/mutations.gql new file mode 100644 index 00000000..883c06cf --- /dev/null +++ b/apps/web/dataconnect/connector/message/mutations.gql @@ -0,0 +1,37 @@ +mutation createMessage( + $conversationId: UUID!, + $senderId: String!, + $content: String!, + $isSystem: Boolean +) @auth(level: USER) { + message_insert( + data: { + conversationId: $conversationId, + senderId: $senderId, + content: $content, + isSystem: $isSystem + } + ) +} + +mutation updateMessage( + $id: UUID!, + $conversationId: UUID, + $senderId: String, + $content: String, + $isSystem: Boolean +) @auth(level: USER) { + message_update( + id: $id, + data: { + conversationId: $conversationId, + senderId: $senderId, + content: $content, + isSystem: $isSystem + } + ) +} + +mutation deleteMessage($id: UUID!) @auth(level: USER) { + message_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/message/queries.gql b/apps/web/dataconnect/connector/message/queries.gql new file mode 100644 index 00000000..770bdafe --- /dev/null +++ b/apps/web/dataconnect/connector/message/queries.gql @@ -0,0 +1,41 @@ +query listMessages @auth(level: USER) { + messages { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} + +query getMessageById($id: UUID!) @auth(level: USER) { + message(id: $id) { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} + +query getMessagesByConversationId($conversationId: UUID!) @auth(level: USER) { + messages(where: { conversationId: { eq: $conversationId } }) { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} diff --git a/apps/web/dataconnect/connector/order/mutations.gql b/apps/web/dataconnect/connector/order/mutations.gql new file mode 100644 index 00000000..be3ec3f6 --- /dev/null +++ b/apps/web/dataconnect/connector/order/mutations.gql @@ -0,0 +1,100 @@ +mutation createOrder( + $vendorId: UUID + $businessId: UUID! + $orderType: OrderType! + $location: String + $status: OrderStatus + $date: Timestamp + $startDate: Timestamp + $endDate: Timestamp + $duration: OrderDuration + $lunchBreak: Int + $total: Float + $eventName: String + $assignedStaff: Any + $shifts: Any + $requested: Int + $hub: String + $recurringDays: Any + $permanentStartDate: Timestamp + $permanentDays: Any + $notes: String + $detectedConflicts: Any + $poReference: String +) @auth(level: USER) { + order_insert( + data: { + vendorId: $vendorId + businessId: $businessId + orderType: $orderType + location: $location + status: $status + date: $date + startDate: $startDate + endDate: $endDate + duration: $duration + lunchBreak: $lunchBreak + total: $total + eventName: $eventName + assignedStaff: $assignedStaff + shifts: $shifts + requested: $requested + hub: $hub + recurringDays: $recurringDays + permanentDays: $permanentDays + notes: $notes + detectedConflicts: $detectedConflicts + poReference: $poReference + } + ) +} + +mutation updateOrder( + $id: UUID! + $vendorId: UUID + $businessId: UUID + $location: String + $status: OrderStatus + $date: Timestamp + $startDate: Timestamp + $endDate: Timestamp + $total: Float + $eventName: String + $assignedStaff: Any + $shifts: Any + $requested: Int + $hub: String + $recurringDays: Any + $permanentDays: Any + $notes: String + $detectedConflicts: Any + $poReference: String +) @auth(level: USER) { + order_update( + id: $id + data: { + vendorId: $vendorId + businessId: $businessId + location: $location + status: $status + date: $date + startDate: $startDate + endDate: $endDate + total: $total + eventName: $eventName + assignedStaff: $assignedStaff + shifts: $shifts + requested: $requested + hub: $hub + recurringDays: $recurringDays + permanentDays: $permanentDays + notes: $notes + detectedConflicts: $detectedConflicts + poReference: $poReference + } + ) +} + +mutation deleteOrder($id: UUID!) @auth(level: USER) { + order_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/order/queries.gql b/apps/web/dataconnect/connector/order/queries.gql new file mode 100644 index 00000000..cad68e39 --- /dev/null +++ b/apps/web/dataconnect/connector/order/queries.gql @@ -0,0 +1,352 @@ +# ------------------------------------------------------------ +# LIST ALL ORDERS +# ------------------------------------------------------------ +query listOrders( + $offset: Int + $limit: Int +) @auth(level: USER) { + orders(offset: $offset, limit: $limit) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET ORDER BY ID +# ------------------------------------------------------------ +query getOrderById($id: UUID!) @auth(level: USER) { + order(id: $id) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY BUSINESS +# ------------------------------------------------------------ +query getOrdersByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY VENDOR +# ------------------------------------------------------------ +query getOrdersByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY STATUS +# ------------------------------------------------------------ +query getOrdersByStatus( + $status: OrderStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY DATE RANGE +# ------------------------------------------------------------ +query getOrdersByDateRange( + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { + date: { ge: $start, le: $end } + } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} + +# ------------------------------------------------------------ +# GET RAPID ORDERS +# ------------------------------------------------------------ +query getRapidOrders( + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { orderType: { eq: RAPID } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + hub + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + } +} diff --git a/apps/web/dataconnect/connector/recentPayment/mutations.gql b/apps/web/dataconnect/connector/recentPayment/mutations.gql new file mode 100644 index 00000000..109e4ee2 --- /dev/null +++ b/apps/web/dataconnect/connector/recentPayment/mutations.gql @@ -0,0 +1,41 @@ +mutation createRecentPayment( + $workedTime: String + $status: RecentPaymentStatus + $staffId: UUID! + $applicationId: UUID! + $invoiceId: UUID! +) @auth(level: USER) { + recentPayment_insert( + data: { + workedTime: $workedTime + status: $status + staffId: $staffId + applicationId: $applicationId + invoiceId: $invoiceId + } + ) +} + +mutation updateRecentPayment( + $id: UUID! + $workedTime: String + $status: RecentPaymentStatus + $staffId: UUID + $applicationId: UUID + $invoiceId: UUID +) @auth(level: USER) { + recentPayment_update( + id: $id + data: { + workedTime: $workedTime + status: $status + staffId: $staffId + applicationId: $applicationId + invoiceId: $invoiceId + } + ) +} + +mutation deleteRecentPayment($id: UUID!) @auth(level: USER) { + recentPayment_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/recentPayment/queries.gql b/apps/web/dataconnect/connector/recentPayment/queries.gql new file mode 100644 index 00000000..2e4487f5 --- /dev/null +++ b/apps/web/dataconnect/connector/recentPayment/queries.gql @@ -0,0 +1,417 @@ +# ------------------------------------------------------------ +# LIST ALL (admin/debug) +# ------------------------------------------------------------ +query listRecentPayments( + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments(offset: $offset, limit: $limit) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + checkInTime + checkOutTime + + shiftRole { + hours + totalValue + startTime + endTime + + role { + name + costPerHour + } + + shift { + title + date + location + locationAddress + description + } + } + } + + invoice { + status + invoiceNumber + issueDate + + business { id businessName } + vendor { id companyName } + order { id eventName } + } + } +} + +# ------------------------------------------------------------ +# GET BY ID +# ------------------------------------------------------------ +query getRecentPaymentById($id: UUID!) @auth(level: USER) { + recentPayment(id: $id) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + checkInTime + checkOutTime + + shiftRole { + hours + totalValue + startTime + endTime + + role { + name + costPerHour + } + + shift { + title + date + location + locationAddress + description + } + } + } + + invoice { + status + invoiceNumber + issueDate + + business { id businessName } + vendor { id companyName } + order { id eventName } + } + } +} + +# ------------------------------------------------------------ +# LIST BY STAFF (Staff view) +# ------------------------------------------------------------ +query listRecentPaymentsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + status + shiftRole { + startTime + endTime + hours + totalValue + + role { id name costPerHour } + + shift { + id + title + date + locationAddress + } + } + } + + invoice { + id + invoiceNumber + status + issueDate + dueDate + amount + + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} + +# ------------------------------------------------------------ +# LIST BY APPLICATION (debug / trace) +# ------------------------------------------------------------ +query listRecentPaymentsByApplicationId( + $applicationId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { applicationId: { eq: $applicationId } } + offset: $offset + limit: $limit + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + status + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} + +# ------------------------------------------------------------ +# LIST BY INVOICE (Vendor/Business can see all payments for invoice) +# ------------------------------------------------------------ +query listRecentPaymentsByInvoiceId( + $invoiceId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { invoiceId: { eq: $invoiceId } } + offset: $offset + limit: $limit + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + staffId + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} + +# ------------------------------------------------------------ +# FILTER BY STATUS (common) +# ------------------------------------------------------------ +query listRecentPaymentsByStatus( + $status: RecentPaymentStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} + +# ------------------------------------------------------------ +# BY BUSINESS (2-step) +# Step 2: pass invoiceIds (from query: listInvoicesByBusinessId) +# ------------------------------------------------------------ +query listRecentPaymentsByInvoiceIds( + $invoiceIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { invoiceId: { in: $invoiceIds } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} + +# ------------------------------------------------------------ +# LIST BY BUSINESS ID (direct) +# ------------------------------------------------------------ +query listRecentPaymentsByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { + invoice: { + businessId: { eq: $businessId } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + staffId + checkInTime + checkOutTime + shiftRole { + startTime + endTime + hours + totalValue + + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + description + } + } + } + + invoice { + id + invoiceNumber + status + issueDate + dueDate + amount + + business { id businessName } + vendor { id companyName } + order { id eventName location } + } + } +} diff --git a/apps/web/dataconnect/connector/reports/queries.gql b/apps/web/dataconnect/connector/reports/queries.gql new file mode 100644 index 00000000..10bceae5 --- /dev/null +++ b/apps/web/dataconnect/connector/reports/queries.gql @@ -0,0 +1,455 @@ +# ========================================================== +# Reports Connector - For MVP +# ========================================================== +# This file exposes SOURCE-DATA queries for all report screens. +# All aggregation (group by day/week, percentages, averages) +# is intentionally done on the client (Flutter). +# +# Entities used: +# - Shift +# - Application +# - Staff +# - Invoice +# - TimeSheet +# +# NOTE: +# Data Connect does NOT support custom root resolvers. +# These queries return raw rows from @table entities. +# ========================================================== + + +# ========================================================== +# 1) COVERAGE REPORT (Next 7 days) +# ========================================================== +# Coverage definition: +# - Needed: sum(Shift.workersNeeded) grouped by date +# - Confirmed: count(Application) where status IN (...) +# +# Client groups by Shift.date and calculates: +# coveragePercentage = confirmed / needed * 100 +# ========================================================== + +query listShiftsForCoverage( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + filled + status + } +} + +#I comment here because I have an error en sdk +query listApplicationsForCoverage( + $shiftIds: [UUID!]! + #$statuses: [ApplicationStatus!]! +) @auth(level: USER) { + applications( + where: { + shiftId: { in: $shiftIds } + #status: { in: $statuses } + } + ) { + id + shiftId + staffId + status + } +} + + +# ========================================================== +# 2) DAILY OPS REPORT (Single day) +# ========================================================== +# Metrics derived on client: +# - scheduledShifts = shifts.length +# - workersConfirmed = confirmedApps / totalNeeded +# - inProgressShifts = status == IN_PROGRESS +# - completedShifts = status == COMPLETED +# ========================================================== + +query listShiftsForDailyOpsByBusiness( + $businessId: UUID! + $date: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { eq: $date } + } + orderBy: { startTime: ASC } + ) { + id + title + location + startTime + endTime + workersNeeded + filled + status + } +} + +query listShiftsForDailyOpsByVendor( + $vendorId: UUID! + $date: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { eq: $date } + } + orderBy: { startTime: ASC } + ) { + id + title + location + startTime + endTime + workersNeeded + filled + status + } +} + +query listApplicationsForDailyOps( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + checkInTime + checkOutTime + } +} + + +# ========================================================== +# 3) FORECAST REPORT (Next N weeks) +# ========================================================== +# Projected spend formula (client): +# projectedCost = workersNeeded * hours * hourlyRate +# ========================================================== + +query listShiftsForForecastByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + hours + cost + status + } +} + +query listShiftsForForecastByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + hours + cost + status + } +} + +# ========================================================== +# 4) NO-SHOW REPORT (Historical range) +# ========================================================== +# Now fully supported because ApplicationStatus includes NO_SHOW. +# +# Metrics: +# - totalNoShows = count(status == NO_SHOW) +# - noShowRate = noShows / totalApplications +# - breakdown by staff +# ========================================================== + +query listShiftsForNoShowRangeByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + ) { + id + date + } +} + +query listShiftsForNoShowRangeByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + } + ) { + id + date + } +} + + +query listApplicationsForNoShowRange( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + } +} + +query listStaffForNoShowReport( + $staffIds: [UUID!]! +) @auth(level: USER) { + staffs(where: { id: { in: $staffIds } }) { + id + fullName + noShowCount + reliabilityScore + } +} + + +# ========================================================== +# 5) SPEND REPORT (Financial) +# ========================================================== +# Uses Invoice as source of truth for money. +# Filter is now based on: +# - businessId (business dashboard) +# - vendorId (vendor dashboard) +# since Invoice no longer has ownerId. +# ========================================================== + +query listInvoicesForSpendByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + businessId: { eq: $businessId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +query listInvoicesForSpendByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + vendorId: { eq: $vendorId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +# Optional: Spend by Order (if you need it) +query listInvoicesForSpendByOrder( + $orderId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + orderId: { eq: $orderId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +query listTimesheetsForSpend( + $startTime: Timestamp! + $endTime: Timestamp! +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $startTime, le: $endTime } + } + } + ) { + id + hours + totalValue + + shift{ + title + location + status + date + + order{ + business{ + businessName + } + } + } + + role{ + costPerHour + } + + } +} + + +# ========================================================== +# 6) PERFORMANCE REPORT (Historical KPIs) +# ========================================================== +# Metrics derivable: +# - fillRate +# - completionRate +# - onTimeRate +# - avgFillTimeHours (NOW POSSIBLE 🎉) +# +# avgFillTimeHours formula: +# (filledAt - createdAt) averaged across FILLED shifts +# ========================================================== + +query listShiftsForPerformanceByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + filledAt: { isNull: false } + } + ) { + id + workersNeeded + filled + status + createdAt + filledAt + } +} + +query listShiftsForPerformanceByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + filledAt: { isNull: false } + } + ) { + id + workersNeeded + filled + status + createdAt + filledAt + } +} + +query listApplicationsForPerformance( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + checkInTime + checkOutTime + } +} + +query listStaffForPerformance( + $staffIds: [UUID!]! +) @auth(level: USER) { + staffs(where: { id: { in: $staffIds } }) { + id + averageRating + onTimeRate + noShowCount + reliabilityScore + } +} diff --git a/apps/web/dataconnect/connector/role/mutations.gql b/apps/web/dataconnect/connector/role/mutations.gql new file mode 100644 index 00000000..f13bba25 --- /dev/null +++ b/apps/web/dataconnect/connector/role/mutations.gql @@ -0,0 +1,36 @@ +mutation createRole( + $name: String! + $costPerHour: Float! + $vendorId: UUID! + $roleCategoryId: UUID! +) @auth(level: USER) { + role_insert( + data: { + name: $name + costPerHour: $costPerHour + vendorId: $vendorId + roleCategoryId: $roleCategoryId + } + ) +} + + +mutation updateRole( + $id: UUID! + $name: String + $costPerHour: Float + $roleCategoryId: UUID! +) @auth(level: USER) { + role_update( + id: $id + data: { + name: $name + costPerHour: $costPerHour + roleCategoryId: $roleCategoryId + } + ) +} + +mutation deleteRole($id: UUID!) @auth(level: USER) { + role_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/role/queries.gql b/apps/web/dataconnect/connector/role/queries.gql new file mode 100644 index 00000000..3cd66ace --- /dev/null +++ b/apps/web/dataconnect/connector/role/queries.gql @@ -0,0 +1,43 @@ +query listRoles @auth(level: USER) { + roles { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query getRoleById($id: UUID!) @auth(level: USER) { + role(id: $id) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query listRolesByVendorId($vendorId: UUID!) @auth(level: USER) { + roles(where: { vendorId: { eq: $vendorId } }) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query listRolesByroleCategoryId($roleCategoryId: UUID!) @auth(level: USER) { + roles(where: { roleCategoryId: { eq: $roleCategoryId } }) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} diff --git a/apps/web/dataconnect/connector/roleCategory/mutations.gql b/apps/web/dataconnect/connector/roleCategory/mutations.gql new file mode 100644 index 00000000..d09d9c03 --- /dev/null +++ b/apps/web/dataconnect/connector/roleCategory/mutations.gql @@ -0,0 +1,29 @@ +mutation createRoleCategory( + $roleName: String!, + $category: RoleCategoryType! +) @auth(level: USER) { + roleCategory_insert( + data: { + roleName: $roleName, + category: $category + } + ) +} + +mutation updateRoleCategory( + $id: UUID!, + $roleName: String, + $category: RoleCategoryType +) @auth(level: USER) { + roleCategory_update( + id: $id, + data: { + roleName: $roleName, + category: $category + } + ) +} + +mutation deleteRoleCategory($id: UUID!) @auth(level: USER) { + roleCategory_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/roleCategory/queries.gql b/apps/web/dataconnect/connector/roleCategory/queries.gql new file mode 100644 index 00000000..10e2a84a --- /dev/null +++ b/apps/web/dataconnect/connector/roleCategory/queries.gql @@ -0,0 +1,27 @@ +query listRoleCategories @auth(level: USER) { + roleCategories { + id + roleName + category + createdAt + updatedAt + } +} + +query getRoleCategoryById($id: UUID!) @auth(level: USER) { + roleCategory(id: $id) { + id + roleName + category + createdAt + updatedAt + } +} + +query getRoleCategoriesByCategory($category: RoleCategoryType!) @auth(level: USER) { + roleCategories(where: { category: { eq: $category } }) { + id + roleName + category + } +} diff --git a/apps/web/dataconnect/connector/shift/mutations.gql b/apps/web/dataconnect/connector/shift/mutations.gql new file mode 100644 index 00000000..3d275639 --- /dev/null +++ b/apps/web/dataconnect/connector/shift/mutations.gql @@ -0,0 +1,114 @@ + +mutation createShift( + $title: String! + $orderId: UUID! + + $date: Timestamp + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $cost: Float + + $location: String + $locationAddress: String + $latitude: Float + $longitude: Float + $description: String + + $status: ShiftStatus + $workersNeeded: Int + $filled: Int + $filledAt: Timestamp + + $managers: [Any!] + $durationDays: Int + + $createdBy: String +) @auth(level: USER) { + shift_insert( + data: { + title: $title + orderId: $orderId + + date: $date + startTime: $startTime + endTime: $endTime + hours: $hours + cost: $cost + + location: $location + locationAddress: $locationAddress + latitude: $latitude + longitude: $longitude + description: $description + + status: $status + workersNeeded: $workersNeeded + filled: $filled + filledAt: $filledAt + + managers: $managers + durationDays: $durationDays + } + ) +} + +mutation updateShift( + $id: UUID! + $title: String + $orderId: UUID + + $date: Timestamp + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $cost: Float + + $location: String + $locationAddress: String + $latitude: Float + $longitude: Float + $description: String + + $status: ShiftStatus + $workersNeeded: Int + $filled: Int + $filledAt: Timestamp + + $managers: [Any!] + $durationDays: Int + +) @auth(level: USER) { + shift_update( + id: $id + data: { + title: $title + orderId: $orderId + + date: $date + startTime: $startTime + endTime: $endTime + hours: $hours + cost: $cost + + location: $location + locationAddress: $locationAddress + latitude: $latitude + longitude: $longitude + description: $description + + status: $status + workersNeeded: $workersNeeded + filled: $filled + filledAt: $filledAt + + managers: $managers + durationDays: $durationDays + + } + ) +} + +mutation deleteShift($id: UUID!) @auth(level: USER) { + shift_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/shift/queries.gql b/apps/web/dataconnect/connector/shift/queries.gql new file mode 100644 index 00000000..43c461df --- /dev/null +++ b/apps/web/dataconnect/connector/shift/queries.gql @@ -0,0 +1,282 @@ + +# ------------------------------------------------------------ +# LIST SHIFTS (paginated) +# ------------------------------------------------------------ +query listShifts( + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts(offset: $offset, limit: $limit) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# GET SHIFT BY ID +# ------------------------------------------------------------ +query getShiftById($id: UUID!) @auth(level: USER) { + shift(id: $id) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# FILTER SHIFTS (by status/orderId/date range) +# NOTE: Timestamp filters use ge/le (not gte/lte) +# ------------------------------------------------------------ +query filterShifts( + $status: ShiftStatus + $orderId: UUID + + $dateFrom: Timestamp + $dateTo: Timestamp + + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + status: { eq: $status } + orderId: { eq: $orderId } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# BUSINESS: GET SHIFTS FOR A BUSINESS (via order.businessId) +# ------------------------------------------------------------ +query getShiftsByBusinessId( + $businessId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# VENDOR: GET SHIFTS FOR A VENDOR (via order.vendorId) +# ------------------------------------------------------------ +query getShiftsByVendorId( + $vendorId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} diff --git a/apps/web/dataconnect/connector/shiftRole/mutations.gql b/apps/web/dataconnect/connector/shiftRole/mutations.gql new file mode 100644 index 00000000..d7225ef8 --- /dev/null +++ b/apps/web/dataconnect/connector/shiftRole/mutations.gql @@ -0,0 +1,65 @@ +mutation createShiftRole( + $shiftId: UUID! + $roleId: UUID! + $count: Int! + $assigned: Int + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $department: String + $uniform: String + $breakType: BreakDuration + $totalValue: Float +) @auth(level: USER) { + shiftRole_insert( + data: { + shiftId: $shiftId + roleId: $roleId + count: $count + assigned: $assigned + startTime: $startTime + endTime: $endTime + hours: $hours + department: $department + uniform: $uniform + breakType: $breakType + totalValue: $totalValue + } + ) +} + +mutation updateShiftRole( + $shiftId: UUID! + $roleId: UUID! + $count: Int + $assigned: Int + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $department: String + $uniform: String + $breakType: BreakDuration + $totalValue: Float +) @auth(level: USER) { + shiftRole_update( + key: { shiftId: $shiftId, roleId: $roleId } + data: { + count: $count + assigned: $assigned + startTime: $startTime + endTime: $endTime + hours: $hours + department: $department + uniform: $uniform + breakType: $breakType + totalValue: $totalValue + } + ) +} + +mutation deleteShiftRole( + $shiftId: UUID! + $roleId: UUID! +) @auth(level: USER) { + shiftRole_delete(key: { shiftId: $shiftId, roleId: $roleId }) +} diff --git a/apps/web/dataconnect/connector/shiftRole/queries.gql b/apps/web/dataconnect/connector/shiftRole/queries.gql new file mode 100644 index 00000000..d2d23a8d --- /dev/null +++ b/apps/web/dataconnect/connector/shiftRole/queries.gql @@ -0,0 +1,526 @@ + +query getShiftRoleById( + $shiftId: UUID! + $roleId: UUID! + ) @auth(level: USER) { + shiftRole(key: { shiftId: $shiftId, roleId: $roleId }) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + } +} + +query listShiftRolesByShiftId( + $shiftId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { shiftId: { eq: $shiftId } } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + } +} + +query listShiftRolesByRoleId( + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { roleId: { eq: $roleId } } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + + } +} + +query listShiftRolesByShiftIdAndTimeRange( + $shiftId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shiftId: { eq: $shiftId } + startTime: { ge: $start } + endTime: { le: $end } + } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + + } +} + +# ------------------------------------------------------------ +# LIST SHIFT ROLES BY VENDOR (via Shift -> Order) +# ------------------------------------------------------------ +query listShiftRolesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + order: { + vendorId: { eq: $vendorId } + } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift { + id + title + date + location + locationAddress + description + orderId + + order { + id + eventName + vendorId + businessId + orderType + status + date + recurringDays + permanentDays + notes + + business { id businessName } + vendor { id companyName } + } + } + } +} + +#orders view client +query listShiftRolesByBusinessAndDateRange( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int + $status: ShiftStatus +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + order: { businessId: { eq: $businessId } } + status: { eq: $status } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + shiftId + roleId + count + assigned + hours + startTime + endTime + totalValue + role { id name } + shift { + id + date + location + locationAddress + title + status + order { id } + } + } +} + +#list shiftsroles for update order in client app +query listShiftRolesByBusinessAndOrder( + $businessId: UUID! + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + orderId: { eq: $orderId } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + breakType + totalValue + createdAt + + role { id name costPerHour } + + shift { + id + title + date + orderId + location + locationAddress + + order{ + vendorId + date + location + } + } + } +} + +#reorder get list by businessId +query listShiftRolesByBusinessDateRangeCompletedOrders( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + order: { + businessId: { eq: $businessId } + status: { eq: COMPLETED } + } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + shiftId + roleId + count + assigned + hours + startTime + endTime + totalValue + + role { + id + name + costPerHour + } + + shift { + id + date + location + locationAddress + title + status + + order { + id + orderType + } + } + } +} + +#view for billing period +query listShiftRolesByBusinessAndDatesSummary( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + status: { eq: COMPLETED } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + roleId + hours + totalValue + role { id name } + } +} + +# ------------------------------------------------------------ +# BUSINESS: GET COMPLETED SHIFTS FOR A BUSINESS (via order.businessId) +# ------------------------------------------------------------ +#for spending insights in home view +query getCompletedShiftsByBusinessId( + $businessId: UUID! + $dateFrom: Timestamp! + $dateTo: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + status: {in: [IN_PROGRESS, CONFIRMED, COMPLETED, OPEN]} + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + #title + + #orderId + + date + startTime + endTime + hours + cost + + #location + #locationAddress + #latitude + #longitude + #description + + #status + workersNeeded + filled + #filledAt + + #managers + #durationDays + + createdAt + + order { + #id + #eventName + status + #orderType + #businessId + #vendorId + #business { id businessName email contactName } + #vendor { id companyName } + } + } +} diff --git a/apps/web/dataconnect/connector/staff/mutations.gql b/apps/web/dataconnect/connector/staff/mutations.gql new file mode 100644 index 00000000..17e2e25e --- /dev/null +++ b/apps/web/dataconnect/connector/staff/mutations.gql @@ -0,0 +1,184 @@ +mutation CreateStaff( + $userId: String! + $fullName: String! + $level: String + $role: String + $phone: String + $email: String + $photoUrl: String + + $totalShifts: Int + $averageRating: Float + $onTimeRate: Int + $noShowCount: Int + $cancellationCount: Int + $reliabilityScore: Int + + $bio: String + $skills: [String!] + $industries: [String!] + $preferredLocations: [String!] + $maxDistanceMiles: Int + $languages: Any + $itemsAttire: Any + + $xp: Int + $badges: Any + $isRecommended: Boolean + + $ownerId: UUID + $department: DepartmentType + $hubId: UUID + $manager: UUID + $english: EnglishProficiency + + + + $backgroundCheckStatus: BackgroundCheckStatus + $employmentType: EmploymentType + $initial: String + $englishRequired: Boolean + $city: String + $addres: String +) @auth(level: USER) { + staff_insert( + data: { + userId: $userId + fullName: $fullName + level: $level + role: $role + phone: $phone + email: $email + photoUrl: $photoUrl + + totalShifts: $totalShifts + averageRating: $averageRating + onTimeRate: $onTimeRate + noShowCount: $noShowCount + cancellationCount: $cancellationCount + reliabilityScore: $reliabilityScore + + bio: $bio + skills: $skills + industries: $industries + preferredLocations: $preferredLocations + maxDistanceMiles: $maxDistanceMiles + languages: $languages + itemsAttire: $itemsAttire + + xp: $xp + badges: $badges + isRecommended: $isRecommended + + ownerId: $ownerId + department: $department + hubId: $hubId + manager: $manager + english: $english + + backgroundCheckStatus: $backgroundCheckStatus + employmentType: $employmentType + initial: $initial + englishRequired: $englishRequired + city: $city + addres: $addres + + } + ) +} + +mutation UpdateStaff( + $id: UUID! + + $userId: String + $fullName: String + $level: String + $role: String + $phone: String + $email: String + $photoUrl: String + + $totalShifts: Int + $averageRating: Float + $onTimeRate: Int + $noShowCount: Int + $cancellationCount: Int + $reliabilityScore: Int + + $bio: String + $skills: [String!] + $industries: [String!] + $preferredLocations: [String!] + $maxDistanceMiles: Int + $languages: Any + $itemsAttire: Any + + $xp: Int + $badges: Any + $isRecommended: Boolean + + $ownerId: UUID + $department: DepartmentType + $hubId: UUID + $manager: UUID + $english: EnglishProficiency + + + + $backgroundCheckStatus: BackgroundCheckStatus + $employmentType: EmploymentType + $initial: String + $englishRequired: Boolean + $city: String + $addres: String +) @auth(level: USER) { + staff_update( + id: $id + data: { + userId: $userId + fullName: $fullName + level: $level + role: $role + phone: $phone + email: $email + photoUrl: $photoUrl + + totalShifts: $totalShifts + averageRating: $averageRating + onTimeRate: $onTimeRate + noShowCount: $noShowCount + cancellationCount: $cancellationCount + reliabilityScore: $reliabilityScore + + bio: $bio + skills: $skills + industries: $industries + preferredLocations: $preferredLocations + maxDistanceMiles: $maxDistanceMiles + languages: $languages + itemsAttire: $itemsAttire + + xp: $xp + badges: $badges + isRecommended: $isRecommended + + ownerId: $ownerId + department: $department + hubId: $hubId + manager: $manager + english: $english + + backgroundCheckStatus: $backgroundCheckStatus + employmentType: $employmentType + initial: $initial + englishRequired: $englishRequired + city: $city + addres: $addres + + } + ) +} + +mutation DeleteStaff($id: UUID!) @auth(level: USER) { + staff_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/staff/queries.gql b/apps/web/dataconnect/connector/staff/queries.gql new file mode 100644 index 00000000..bc56c2ca --- /dev/null +++ b/apps/web/dataconnect/connector/staff/queries.gql @@ -0,0 +1,175 @@ +query listStaff @auth(level: USER) { + staffs { + id + userId + fullName + level + role + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + updatedAt + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query getStaffById($id: UUID!) @auth(level: USER) { + staff(id: $id) { + id + userId + fullName + role + level + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + updatedAt + createdBy + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query getStaffByUserId($userId: String!) @auth(level: USER) { + staffs(where: { userId: { eq: $userId } }) { + id + userId + fullName + level + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + updatedAt + createdBy + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query filterStaff( + $ownerId: UUID + $fullName: String + $level: String + $email: String +) @auth(level: USER) { + staffs( + where: { + ownerId: { eq: $ownerId } + fullName: { eq: $fullName } + level: { eq: $level } + email: { eq: $email } + } + ) { + id + userId + fullName + level + phone + email + photoUrl + averageRating + reliabilityScore + totalShifts + ownerId + isRecommended + skills + industries + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} diff --git a/apps/web/dataconnect/connector/staffAvailability/mutations.gql b/apps/web/dataconnect/connector/staffAvailability/mutations.gql new file mode 100644 index 00000000..91f95a5e --- /dev/null +++ b/apps/web/dataconnect/connector/staffAvailability/mutations.gql @@ -0,0 +1,44 @@ + +mutation createStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! + $status: AvailabilityStatus + $notes: String +) @auth(level: USER) { + staffAvailability_insert( + data: { + staffId: $staffId + day: $day + slot: $slot + status: $status + notes: $notes + } + ) +} + +mutation updateStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! + $status: AvailabilityStatus + $notes: String +) @auth(level: USER) { + staffAvailability_update( + key: { staffId: $staffId, day: $day, slot: $slot } + data: { + status: $status + notes: $notes + } + ) +} + +mutation deleteStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! +) @auth(level: USER) { + staffAvailability_delete( + key: { staffId: $staffId, day: $day, slot: $slot } + ) +} diff --git a/apps/web/dataconnect/connector/staffAvailability/queries.gql b/apps/web/dataconnect/connector/staffAvailability/queries.gql new file mode 100644 index 00000000..e9d5ef11 --- /dev/null +++ b/apps/web/dataconnect/connector/staffAvailability/queries.gql @@ -0,0 +1,87 @@ + +query listStaffAvailabilities( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities(offset: $offset, limit: $limit) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query listStaffAvailabilitiesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query getStaffAvailabilityByKey( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! +) @auth(level: USER) { + staffAvailability(key: { staffId: $staffId, day: $day, slot: $slot }) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query listStaffAvailabilitiesByDay( + $day: DayOfWeek! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities( + where: { day: { eq: $day } } + offset: $offset + limit: $limit + ) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} diff --git a/apps/web/dataconnect/connector/staffAvailabilityStats/mutations.gql b/apps/web/dataconnect/connector/staffAvailabilityStats/mutations.gql new file mode 100644 index 00000000..25d3926d --- /dev/null +++ b/apps/web/dataconnect/connector/staffAvailabilityStats/mutations.gql @@ -0,0 +1,54 @@ + +mutation createStaffAvailabilityStats( + $staffId: UUID! + $needWorkIndex: Int + $utilizationPercentage: Int + $predictedAvailabilityScore: Int + $scheduledHoursThisPeriod: Int + $desiredHoursThisPeriod: Int + $lastShiftDate: Timestamp + $acceptanceRate: Int +) @auth(level: USER) { + staffAvailabilityStats_insert( + data: { + staffId: $staffId + needWorkIndex: $needWorkIndex + utilizationPercentage: $utilizationPercentage + predictedAvailabilityScore: $predictedAvailabilityScore + scheduledHoursThisPeriod: $scheduledHoursThisPeriod + desiredHoursThisPeriod: $desiredHoursThisPeriod + lastShiftDate: $lastShiftDate + acceptanceRate: $acceptanceRate + } + ) +} + +mutation updateStaffAvailabilityStats( + $staffId: UUID! + $needWorkIndex: Int + $utilizationPercentage: Int + $predictedAvailabilityScore: Int + $scheduledHoursThisPeriod: Int + $desiredHoursThisPeriod: Int + $lastShiftDate: Timestamp + $acceptanceRate: Int +) @auth(level: USER) { + staffAvailabilityStats_update( + key: { staffId: $staffId } + data: { + needWorkIndex: $needWorkIndex + utilizationPercentage: $utilizationPercentage + predictedAvailabilityScore: $predictedAvailabilityScore + scheduledHoursThisPeriod: $scheduledHoursThisPeriod + desiredHoursThisPeriod: $desiredHoursThisPeriod + lastShiftDate: $lastShiftDate + acceptanceRate: $acceptanceRate + } + ) +} + +mutation deleteStaffAvailabilityStats( + $staffId: UUID! +) @auth(level: USER) { + staffAvailabilityStats_delete(key: { staffId: $staffId }) +} diff --git a/apps/web/dataconnect/connector/staffAvailabilityStats/queries.gql b/apps/web/dataconnect/connector/staffAvailabilityStats/queries.gql new file mode 100644 index 00000000..a1d658ca --- /dev/null +++ b/apps/web/dataconnect/connector/staffAvailabilityStats/queries.gql @@ -0,0 +1,109 @@ +# ========================================================== +# StaffAvailabilityStats - QUERIES +# ========================================================== +# Notes: +# - Entity key is composite: key: ["staffId"] +# - So the single-record lookup is: staffAvailabilityStats(key: { staffId: ... }) +# - There is no Query.staffAvailabilityStat(id: ...) unless you defined id as the key. +# ========================================================== + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listStaffAvailabilityStats( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilityStatss(offset: $offset, limit: $limit) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (staffId) +# ---------------------------------------------------------- +query getStaffAvailabilityStatsByStaffId( + $staffId: UUID! +) @auth(level: USER) { + staffAvailabilityStats(key: { staffId: $staffId }) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} + +# ---------------------------------------------------------- +# FILTER (optional) - useful for dashboards +# NOTE: Data Connect filter ops are typically: eq, ne, gt, ge, lt, le, in, isNull +# ---------------------------------------------------------- +query filterStaffAvailabilityStats( + $needWorkIndexMin: Int + $needWorkIndexMax: Int + $utilizationMin: Int + $utilizationMax: Int + $acceptanceRateMin: Int + $acceptanceRateMax: Int + $lastShiftAfter: Timestamp + $lastShiftBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilityStatss( + where: { + needWorkIndex: { ge: $needWorkIndexMin, le: $needWorkIndexMax } + utilizationPercentage: { ge: $utilizationMin, le: $utilizationMax } + acceptanceRate: { ge: $acceptanceRateMin, le: $acceptanceRateMax } + lastShiftDate: { ge: $lastShiftAfter, le: $lastShiftBefore } + } + offset: $offset + limit: $limit + ) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} diff --git a/apps/web/dataconnect/connector/staffCourse/mutations.gql b/apps/web/dataconnect/connector/staffCourse/mutations.gql new file mode 100644 index 00000000..90801b9b --- /dev/null +++ b/apps/web/dataconnect/connector/staffCourse/mutations.gql @@ -0,0 +1,47 @@ +# Mutations for StaffCourse + +mutation createStaffCourse( + $staffId: UUID! + $courseId: UUID! + $progressPercent: Int + $completed: Boolean + $completedAt: Timestamp + $startedAt: Timestamp + $lastAccessedAt: Timestamp +) @auth(level: USER) { + staffCourse_insert( + data: { + staffId: $staffId + courseId: $courseId + progressPercent: $progressPercent + completed: $completed + completedAt: $completedAt + startedAt: $startedAt + lastAccessedAt: $lastAccessedAt + } + ) +} + +mutation updateStaffCourse( + $id: UUID! + $progressPercent: Int + $completed: Boolean + $completedAt: Timestamp + $startedAt: Timestamp + $lastAccessedAt: Timestamp +) @auth(level: USER) { + staffCourse_update( + id: $id + data: { + progressPercent: $progressPercent + completed: $completed + completedAt: $completedAt + startedAt: $startedAt + lastAccessedAt: $lastAccessedAt + } + ) +} + +mutation deleteStaffCourse($id: UUID!) @auth(level: USER) { + staffCourse_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/staffCourse/queries.gql b/apps/web/dataconnect/connector/staffCourse/queries.gql new file mode 100644 index 00000000..91c6e738 --- /dev/null +++ b/apps/web/dataconnect/connector/staffCourse/queries.gql @@ -0,0 +1,85 @@ +query getStaffCourseById($id: UUID!) @auth(level: USER) { + staffCourse(id: $id) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query listStaffCoursesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffCourses( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query listStaffCoursesByCourseId( + $courseId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffCourses( + where: { courseId: { eq: $courseId } } + offset: $offset + limit: $limit + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query getStaffCourseByStaffAndCourse( + $staffId: UUID! + $courseId: UUID! +) @auth(level: USER) { + staffCourses( + where: { + staffId: { eq: $staffId } + courseId: { eq: $courseId } + } + limit: 1 + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + diff --git a/apps/web/dataconnect/connector/staffDocument/mutations.gql b/apps/web/dataconnect/connector/staffDocument/mutations.gql new file mode 100644 index 00000000..8877dd02 --- /dev/null +++ b/apps/web/dataconnect/connector/staffDocument/mutations.gql @@ -0,0 +1,43 @@ + +mutation createStaffDocument( + $staffId: UUID! + $staffName: String! + $documentId: UUID! + $status: DocumentStatus! + $documentUrl: String + $expiryDate: Timestamp +) @auth(level: USER) { + staffDocument_insert( + data: { + staffId: $staffId + staffName: $staffName + documentId: $documentId + status: $status + documentUrl: $documentUrl + expiryDate: $expiryDate + } + ) +} + +mutation updateStaffDocument( + $staffId: UUID! + $documentId: UUID! + $status: DocumentStatus + $documentUrl: String + $expiryDate: Timestamp +) @auth(level: USER) { + staffDocument_update( + key: { staffId: $staffId, documentId: $documentId } + data: { + status: $status + documentUrl: $documentUrl + } + ) +} + +mutation deleteStaffDocument( + $staffId: UUID! + $documentId: UUID! +) @auth(level: USER) { + staffDocument_delete(key: { staffId: $staffId, documentId: $documentId }) +} diff --git a/apps/web/dataconnect/connector/staffDocument/queries.gql b/apps/web/dataconnect/connector/staffDocument/queries.gql new file mode 100644 index 00000000..77e6cc6f --- /dev/null +++ b/apps/web/dataconnect/connector/staffDocument/queries.gql @@ -0,0 +1,100 @@ + +query getStaffDocumentByKey( + $staffId: UUID! + $documentId: UUID! +) @auth(level: USER) { + staffDocument(key: { staffId: $staffId, documentId: $documentId }) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + createdAt + updatedAt + document { + id + name + documentType + description + } + } +} + +query listStaffDocumentsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + createdAt + updatedAt + document { + id + name + documentType + } + } +} + +query listStaffDocumentsByDocumentType( + $documentType: DocumentType! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { document: { documentType: { eq: $documentType } } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + document { + id + name + documentType + } + } +} + +query listStaffDocumentsByStatus( + $status: DocumentStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + document { + id + name + documentType + } + } +} diff --git a/apps/web/dataconnect/connector/staffRole/mutations.gql b/apps/web/dataconnect/connector/staffRole/mutations.gql new file mode 100644 index 00000000..a2857979 --- /dev/null +++ b/apps/web/dataconnect/connector/staffRole/mutations.gql @@ -0,0 +1,22 @@ +mutation createStaffRole( + $staffId: UUID! + $roleId: UUID! + $roleType: RoleType +) @auth(level: USER) { + staffRole_insert( + data: { + staffId: $staffId + roleId: $roleId + roleType: $roleType + } + ) +} + +mutation deleteStaffRole( + $staffId: UUID! + $roleId: UUID! +) @auth(level: USER) { + staffRole_delete( + key: { staffId: $staffId, roleId: $roleId } + ) +} diff --git a/apps/web/dataconnect/connector/staffRole/queries.gql b/apps/web/dataconnect/connector/staffRole/queries.gql new file mode 100644 index 00000000..560cbf56 --- /dev/null +++ b/apps/web/dataconnect/connector/staffRole/queries.gql @@ -0,0 +1,142 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listStaffRoles( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles(offset: $offset, limit: $limit) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# GET BY COMPOSITE KEY (staffId + roleId) +# ---------------------------------------------------------- +query getStaffRoleByKey( + $staffId: UUID! + $roleId: UUID! +) @auth(level: USER) { + staffRole(key: { staffId: $staffId, roleId: $roleId }) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# LIST BY STAFF (most common) +# ---------------------------------------------------------- +query listStaffRolesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# LIST BY ROLE (who has this skill) +# ---------------------------------------------------------- +query listStaffRolesByRoleId( + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { roleId: { eq: $roleId } } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + } +} + +# ---------------------------------------------------------- +# FILTER (optional) +# Useful when you want both conditions without using key lookup +# ---------------------------------------------------------- +query filterStaffRoles( + $staffId: UUID + $roleId: UUID + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { + staffId: { eq: $staffId } + roleId: { eq: $roleId } + } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + } +} \ No newline at end of file diff --git a/apps/web/dataconnect/connector/task/mutations.gql b/apps/web/dataconnect/connector/task/mutations.gql new file mode 100644 index 00000000..a9c1040e --- /dev/null +++ b/apps/web/dataconnect/connector/task/mutations.gql @@ -0,0 +1,64 @@ +mutation createTask( + $taskName: String! + $description: String + $priority: TaskPriority! + $status: TaskStatus! + $dueDate: Timestamp + $progress: Int + $orderIndex: Int + $commentCount: Int + $attachmentCount: Int + $files: Any + $ownerId:UUID! +) @auth(level: USER) { + task_insert( + data: { + taskName: $taskName + description: $description + priority: $priority + status: $status + dueDate: $dueDate + progress: $progress + orderIndex: $orderIndex + commentCount: $commentCount + attachmentCount: $attachmentCount + files: $files + ownerId:$ownerId + } + ) +} + +mutation updateTask( + $id: UUID! + $taskName: String + $description: String + $priority: TaskPriority + $status: TaskStatus + $dueDate: Timestamp + $progress: Int + $assignedMembers: Any + $orderIndex: Int + $commentCount: Int + $attachmentCount: Int + $files: Any +) @auth(level: USER) { + task_update( + id: $id + data: { + taskName: $taskName + description: $description + priority: $priority + status: $status + dueDate: $dueDate + progress: $progress + orderIndex: $orderIndex + commentCount: $commentCount + attachmentCount: $attachmentCount + files: $files + } + ) +} + +mutation deleteTask($id: UUID!) @auth(level: USER) { + task_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/task/queries.gql b/apps/web/dataconnect/connector/task/queries.gql new file mode 100644 index 00000000..bc315e0d --- /dev/null +++ b/apps/web/dataconnect/connector/task/queries.gql @@ -0,0 +1,83 @@ +query listTasks @auth(level: USER) { + tasks { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query getTaskById($id: UUID!) @auth(level: USER) { + task(id: $id) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query getTasksByOwnerId($ownerId: UUID!) @auth(level: USER) { + tasks(where: { ownerId: { eq: $ownerId } }) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query filterTasks( + $status: TaskStatus + $priority: TaskPriority +) @auth(level: USER) { + tasks( + where: { + status: { eq: $status } + priority: { eq: $priority } + } + ) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/task_comment/mutations.gql b/apps/web/dataconnect/connector/task_comment/mutations.gql new file mode 100644 index 00000000..432cab97 --- /dev/null +++ b/apps/web/dataconnect/connector/task_comment/mutations.gql @@ -0,0 +1,33 @@ +mutation createTaskComment( + $taskId: UUID! + $teamMemberId: UUID! + $comment: String! + $isSystem: Boolean +) @auth(level: USER) { + taskComment_insert( + data: { + taskId: $taskId + teamMemberId: $teamMemberId + comment: $comment + isSystem: $isSystem + } + ) +} + +mutation updateTaskComment( + $id: UUID! + $comment: String + $isSystem: Boolean +) @auth(level: USER) { + taskComment_update( + id: $id + data: { + comment: $comment + isSystem: $isSystem + } + ) +} + +mutation deleteTaskComment($id: UUID!) @auth(level: USER) { + taskComment_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/task_comment/queries.gql b/apps/web/dataconnect/connector/task_comment/queries.gql new file mode 100644 index 00000000..48afc3f9 --- /dev/null +++ b/apps/web/dataconnect/connector/task_comment/queries.gql @@ -0,0 +1,62 @@ +query listTaskComments @auth(level: USER) { + taskComments { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +query getTaskCommentById($id: UUID!) @auth(level: USER) { + taskComment(id: $id) { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +query getTaskCommentsByTaskId($taskId: UUID!) @auth(level: USER) { + taskComments(where: { taskId: { eq: $taskId } }) { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} diff --git a/apps/web/dataconnect/connector/taxForm/mutations.gql b/apps/web/dataconnect/connector/taxForm/mutations.gql new file mode 100644 index 00000000..d7798b35 --- /dev/null +++ b/apps/web/dataconnect/connector/taxForm/mutations.gql @@ -0,0 +1,45 @@ +mutation createTaxForm( + $formType: TaxFormType! + $title: String! + $subtitle: String + $description: String + $status: TaxFormStatus + $staffId: UUID! + $formData: Any +) @auth(level: USER) { + taxForm_insert( + data: { + formType: $formType + title: $title + subtitle: $subtitle + description: $description + status: $status + staffId: $staffId + formData: $formData + } + ) +} + +mutation updateTaxForm( + $id: UUID! + $status: TaxFormStatus + $formData: Any + $title: String + $subtitle: String + $description: String +) @auth(level: USER) { + taxForm_update( + id: $id + data: { + status: $status + formData: $formData + title: $title + subtitle: $subtitle + description: $description + } + ) +} + +mutation deleteTaxForm($id: UUID!) @auth(level: USER) { + taxForm_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/taxForm/queries.gql b/apps/web/dataconnect/connector/taxForm/queries.gql new file mode 100644 index 00000000..e7d65579 --- /dev/null +++ b/apps/web/dataconnect/connector/taxForm/queries.gql @@ -0,0 +1,67 @@ +query listTaxForms @auth(level: USER) { + taxForms { + id + formType + title + subtitle + description + status + staffId + formData + createdAt + updatedAt + createdBy + } +} + +query getTaxFormById($id: UUID!) @auth(level: USER) { + taxForm(id: $id) { + id + formType + title + subtitle + description + status + staffId + formData + createdAt + updatedAt + createdBy + } +} + +query getTaxFormsBystaffId($staffId: UUID!) @auth(level: USER) { + taxForms(where: { staffId: { eq: $staffId } }) { + id + formType + title + subtitle + description + status + staffId + formData + createdAt + updatedAt + createdBy + } +} + +query filterTaxForms( + $formType: TaxFormType + $status: TaxFormStatus + $staffId: UUID +) @auth(level: USER) { + taxForms( + where: { + formType: { eq: $formType } + status: { eq: $status } + staffId: { eq: $staffId } + } + ) { + id + formType + title + status + staffId + } +} diff --git a/apps/web/dataconnect/connector/team/mutations.gql b/apps/web/dataconnect/connector/team/mutations.gql new file mode 100644 index 00000000..70c87e5a --- /dev/null +++ b/apps/web/dataconnect/connector/team/mutations.gql @@ -0,0 +1,73 @@ +mutation createTeam( + $teamName: String! + $ownerId: UUID! + $ownerName: String! + $ownerRole: String! + $email: String + $companyLogo: String + $totalMembers: Int + $activeMembers: Int + $totalHubs: Int + $departments: Any + $favoriteStaffCount: Int + $blockedStaffCount: Int + $favoriteStaff: Any + $blockedStaff: Any +) @auth(level: USER) { + team_insert( + data: { + teamName: $teamName + ownerId: $ownerId + ownerName: $ownerName + ownerRole: $ownerRole + email: $email + companyLogo: $companyLogo + totalMembers: $totalMembers + activeMembers: $activeMembers + totalHubs: $totalHubs + departments: $departments + favoriteStaffCount: $favoriteStaffCount + blockedStaffCount: $blockedStaffCount + favoriteStaff: $favoriteStaff + blockedStaff: $blockedStaff + } + ) +} + +mutation updateTeam( + $id: UUID! + $teamName: String + $ownerName: String + $ownerRole: String + $companyLogo: String + $totalMembers: Int + $activeMembers: Int + $totalHubs: Int + $departments: Any + $favoriteStaffCount: Int + $blockedStaffCount: Int + $favoriteStaff: Any + $blockedStaff: Any +) @auth(level: USER) { + team_update( + id: $id + data: { + teamName: $teamName + ownerName: $ownerName + ownerRole: $ownerRole + companyLogo: $companyLogo + totalMembers: $totalMembers + activeMembers: $activeMembers + totalHubs: $totalHubs + departments: $departments + favoriteStaffCount: $favoriteStaffCount + blockedStaffCount: $blockedStaffCount + favoriteStaff: $favoriteStaff + blockedStaff: $blockedStaff + } + ) +} + +mutation deleteTeam($id: UUID!) @auth(level: USER) { + team_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/team/queries.gql b/apps/web/dataconnect/connector/team/queries.gql new file mode 100644 index 00000000..85ac4764 --- /dev/null +++ b/apps/web/dataconnect/connector/team/queries.gql @@ -0,0 +1,68 @@ +query listTeams @auth(level: USER) { + teams { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} + +query getTeamById($id: UUID!) @auth(level: USER) { + team(id: $id) { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} + +query getTeamsByOwnerId($ownerId: UUID!) @auth(level: USER) { + teams(where: { ownerId: { eq: $ownerId } }) { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/teamHub/mutations.gql b/apps/web/dataconnect/connector/teamHub/mutations.gql new file mode 100644 index 00000000..38542c35 --- /dev/null +++ b/apps/web/dataconnect/connector/teamHub/mutations.gql @@ -0,0 +1,55 @@ +mutation createTeamHub( + $teamId: UUID! + $hubName: String! + $address: String! + $city: String + $state: String + $zipCode: String + $managerName: String + $isActive: Boolean + $departments: Any +) @auth(level: USER) { + teamHub_insert( + data: { + teamId: $teamId + hubName: $hubName + address: $address + city: $city + state: $state + zipCode: $zipCode + managerName: $managerName + isActive: $isActive + departments: $departments + } + ) +} + +mutation updateTeamHub( + $id: UUID! + $hubName: String + $address: String + $city: String + $state: String + $zipCode: String + $managerName: String + $isActive: Boolean + $departments: Any +) @auth(level: USER) { + teamHub_update( + id: $id + data: { + hubName: $hubName + address: $address + city: $city + state: $state + zipCode: $zipCode + managerName: $managerName + isActive: $isActive + departments: $departments + } + ) +} + +mutation deleteTeamHub($id: UUID!) @auth(level: USER) { + teamHub_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/teamHub/queries.gql b/apps/web/dataconnect/connector/teamHub/queries.gql new file mode 100644 index 00000000..697b50c3 --- /dev/null +++ b/apps/web/dataconnect/connector/teamHub/queries.gql @@ -0,0 +1,80 @@ +query listTeamHubs @auth(level: USER) { + teamHubs { + id + teamId + hubName + address + city + state + zipCode + managerName + isActive + departments + createdAt + updatedAt + createdBy + } +} + +query getTeamHubById($id: UUID!) @auth(level: USER) { + teamHub(id: $id) { + id + teamId + hubName + address + city + state + zipCode + managerName + isActive + departments + createdAt + updatedAt + createdBy + } +} + +query getTeamHubsByTeamId($teamId: UUID!) @auth(level: USER) { + teamHubs(where: { teamId: { eq: $teamId } }) { + id + teamId + hubName + address + city + state + zipCode + managerName + isActive + departments + createdAt + updatedAt + createdBy + } +} + +# ------------------------------------------------------------ +# LIST TEAM HUBS BY OWNER (Vendor/Business) +# ------------------------------------------------------------ +query listTeamHubsByOwnerId( + $ownerId: UUID! +) @auth(level: USER) { + teamHubs( + where: { + team: { + ownerId: { eq: $ownerId } + } + } + ) { + id + teamId + hubName + address + city + state + zipCode + managerName + isActive + departments + createdAt + } +} \ No newline at end of file diff --git a/apps/web/dataconnect/connector/teamHudDeparment/mutations.gql b/apps/web/dataconnect/connector/teamHudDeparment/mutations.gql new file mode 100644 index 00000000..b2e9b176 --- /dev/null +++ b/apps/web/dataconnect/connector/teamHudDeparment/mutations.gql @@ -0,0 +1,35 @@ + +mutation createTeamHudDepartment( + $name: String! + $costCenter: String + $teamHubId: UUID! +) @auth(level: USER) { + teamHudDepartment_insert( + data: { + name: $name + costCenter: $costCenter + teamHubId: $teamHubId + } + ) +} + +mutation updateTeamHudDepartment( + $id: UUID! + + $name: String + $costCenter: String + $teamHubId: UUID +) @auth(level: USER) { + teamHudDepartment_update( + id: $id + data: { + name: $name + costCenter: $costCenter + teamHubId: $teamHubId + } + ) +} + +mutation deleteTeamHudDepartment($id: UUID!) @auth(level: USER) { + teamHudDepartment_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/teamHudDeparment/queries.gql b/apps/web/dataconnect/connector/teamHudDeparment/queries.gql new file mode 100644 index 00000000..3d2a85a2 --- /dev/null +++ b/apps/web/dataconnect/connector/teamHudDeparment/queries.gql @@ -0,0 +1,68 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listTeamHudDepartments( + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHudDepartments(offset: $offset, limit: $limit) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getTeamHudDepartmentById($id: UUID!) @auth(level: USER) { + teamHudDepartment(id: $id) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY TEAM HUB ID +# ---------------------------------------------------------- +query listTeamHudDepartmentsByTeamHubId( + $teamHubId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHudDepartments( + where: { teamHubId: { eq: $teamHubId } } + offset: $offset + limit: $limit + ) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} diff --git a/apps/web/dataconnect/connector/teamMember/mutations.gql b/apps/web/dataconnect/connector/teamMember/mutations.gql new file mode 100644 index 00000000..c271c2f8 --- /dev/null +++ b/apps/web/dataconnect/connector/teamMember/mutations.gql @@ -0,0 +1,92 @@ +mutation createTeamMember( + $teamId: UUID! + $role: TeamMemberRole! + $title: String + $department: String + $teamHubId: UUID + $isActive: Boolean + $userId: String! + $inviteStatus: TeamMemberInviteStatus +) @auth(level: USER) { + teamMember_insert( + data: { + teamId: $teamId + role: $role + title: $title + department: $department + teamHubId: $teamHubId + isActive: $isActive + userId: $userId + inviteStatus: $inviteStatus + } + ) +} + +mutation updateTeamMember( + $id: UUID! + $role: TeamMemberRole + $title: String + $department: String + $teamHubId: UUID + $isActive: Boolean + $inviteStatus: TeamMemberInviteStatus +) @auth(level: USER) { + teamMember_update( + id: $id + data: { + role: $role + title: $title + department: $department + teamHubId: $teamHubId + isActive: $isActive + inviteStatus: $inviteStatus + } + ) +} + +mutation updateTeamMemberInviteStatus( + $id: UUID! + $inviteStatus: TeamMemberInviteStatus! +) @auth(level: USER) { + teamMember_update( + id: $id + data: { + inviteStatus: $inviteStatus + } + ) +} + +mutation acceptInviteByCode( + $inviteCode: UUID! +) @auth(level: USER) { + teamMember_updateMany( + where: { + inviteCode: { eq: $inviteCode } + inviteStatus: { eq: PENDING } + } + data: { + inviteStatus: ACCEPTED + isActive: true + } + ) +} + +mutation cancelInviteByCode( + $inviteCode: UUID! +) @auth(level: USER) { + teamMember_updateMany( + where: { + inviteCode: { eq: $inviteCode } + inviteStatus: { eq: PENDING } + } + data: { + inviteStatus: CANCELLED + isActive: false + } + ) +} + + +mutation deleteTeamMember($id: UUID!) @auth(level: USER) { + teamMember_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/teamMember/queries.gql b/apps/web/dataconnect/connector/teamMember/queries.gql new file mode 100644 index 00000000..4415f16d --- /dev/null +++ b/apps/web/dataconnect/connector/teamMember/queries.gql @@ -0,0 +1,66 @@ +query listTeamMembers @auth(level: USER) { + teamMembers { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + + } +} + +query getTeamMemberById($id: UUID!) @auth(level: USER) { + teamMember(id: $id) { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + } +} + +query getTeamMembersByTeamId($teamId: UUID!) @auth(level: USER) { + teamMembers(where: { teamId: { eq: $teamId } }) { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + } +} diff --git a/apps/web/dataconnect/connector/user/mutations.gql b/apps/web/dataconnect/connector/user/mutations.gql new file mode 100644 index 00000000..05e233b6 --- /dev/null +++ b/apps/web/dataconnect/connector/user/mutations.gql @@ -0,0 +1,45 @@ +mutation CreateUser( + $id: String!, # Firebase UID + $email: String, + $fullName: String, + $role: UserBaseRole!, + $userRole: String, + $photoUrl: String +) @auth(level: USER) { + user_insert( + data: { + id: $id + email: $email + fullName: $fullName + role: $role + userRole: $userRole + photoUrl: $photoUrl + } + ) +} + +mutation UpdateUser( + $id: String!, + $email: String, + $fullName: String, + $role: UserBaseRole, + $userRole: String, + $photoUrl: String +) @auth(level: USER) { + user_update( + id: $id, + data: { + email: $email + fullName: $fullName + role: $role + userRole: $userRole + photoUrl: $photoUrl + } + ) +} + +mutation DeleteUser( + $id: String! +) @auth(level: USER) { + user_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/user/queries.gql b/apps/web/dataconnect/connector/user/queries.gql new file mode 100644 index 00000000..044abebf --- /dev/null +++ b/apps/web/dataconnect/connector/user/queries.gql @@ -0,0 +1,48 @@ +query listUsers @auth(level: USER) { + users { + id + email + fullName + role + userRole + photoUrl + createdDate + updatedDate + } +} + +query getUserById( + $id: String! +) @auth(level: USER) { + user(id: $id) { + id + email + fullName + role + userRole + photoUrl + } +} + +query filterUsers( + $id: String, + $email: String, + $role: UserBaseRole, + $userRole: String +) @auth(level: USER) { + users( + where: { + id: { eq: $id } + email: { eq: $email } + role: { eq: $role } + userRole: { eq: $userRole } + } + ) { + id + email + fullName + role + userRole + photoUrl + } +} diff --git a/apps/web/dataconnect/connector/userConversation/mutations.gql b/apps/web/dataconnect/connector/userConversation/mutations.gql new file mode 100644 index 00000000..53e4e945 --- /dev/null +++ b/apps/web/dataconnect/connector/userConversation/mutations.gql @@ -0,0 +1,74 @@ + +mutation createUserConversation( + $conversationId: UUID! + $userId: String! + $unreadCount: Int + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_insert( + data: { + conversationId: $conversationId + userId: $userId + unreadCount: $unreadCount + lastReadAt: $lastReadAt + } + ) +} + +mutation updateUserConversation( + $conversationId: UUID! + $userId: String! + $unreadCount: Int + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { + unreadCount: $unreadCount + lastReadAt: $lastReadAt + } + ) +} + +# ---------------------------------------------------------- +# MARK AS READ (sets unreadCount=0 + lastReadAt=now) +# Note: request.time is valid in schema defaults; in mutations +# you can pass Timestamp from client. If you want "now" server-side, +# you'd typically pass null and have logic elsewhere. +# ---------------------------------------------------------- +mutation markConversationAsRead( + $conversationId: UUID! + $userId: String! + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { + unreadCount: 0 + lastReadAt: $lastReadAt + } + ) +} + +# ---------------------------------------------------------- +# INCREMENT UNREAD (common after sending message) +# ---------------------------------------------------------- +mutation incrementUnreadForUser( + $conversationId: UUID! + $userId: String! + $unreadCount: Int! +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { unreadCount: $unreadCount } + ) +} + +mutation deleteUserConversation( + $conversationId: UUID! + $userId: String! +) @auth(level: USER) { + userConversation_delete( + key: { conversationId: $conversationId, userId: $userId } + ) +} diff --git a/apps/web/dataconnect/connector/userConversation/queries.gql b/apps/web/dataconnect/connector/userConversation/queries.gql new file mode 100644 index 00000000..99a1a2e4 --- /dev/null +++ b/apps/web/dataconnect/connector/userConversation/queries.gql @@ -0,0 +1,230 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listUserConversations( + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations(offset: $offset, limit: $limit) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (conversationId + userId) +# ---------------------------------------------------------- +query getUserConversationByKey( + $conversationId: UUID! + $userId: String! +) @auth(level: USER) { + userConversation(key: { conversationId: $conversationId, userId: $userId }) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# LIST BY USER (My inbox) ✅ +# Order by most recent activity (Conversation.lastMessageAt) +# NOTE: If your DC version doesn't allow orderBy on nested fields, +# just orderBy createdAt/updatedAt on user_conversations. +# ---------------------------------------------------------- +query listUserConversationsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { userId: { eq: $userId } } + offset: $offset + limit: $limit + # If supported: + # orderBy: { conversation: { lastMessageAt: DESC } } + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + updatedAt + createdBy + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# LIST UNREAD BY USER (badge, notifications) +# ---------------------------------------------------------- +query listUnreadUserConversationsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { + userId: { eq: $userId } + unreadCount: { gt: 0 } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + } + } +} + +# ---------------------------------------------------------- +# LIST BY CONVERSATION (participants view) +# ---------------------------------------------------------- +query listUserConversationsByConversationId( + $conversationId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { conversationId: { eq: $conversationId } } + offset: $offset + limit: $limit + orderBy: { createdAt: ASC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# FILTER (dashboard/debug) +# ---------------------------------------------------------- +query filterUserConversations( + $userId: String + $conversationId: UUID + $unreadMin: Int + $unreadMax: Int + $lastReadAfter: Timestamp + $lastReadBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { + userId: { eq: $userId } + conversationId: { eq: $conversationId } + unreadCount: { ge: $unreadMin, le: $unreadMax } + lastReadAt: { ge: $lastReadAfter, le: $lastReadBefore } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + user { id fullName photoUrl } + } +} diff --git a/apps/web/dataconnect/connector/vendor/mutations.gql b/apps/web/dataconnect/connector/vendor/mutations.gql new file mode 100644 index 00000000..5f0b72cf --- /dev/null +++ b/apps/web/dataconnect/connector/vendor/mutations.gql @@ -0,0 +1,99 @@ +mutation createVendor( + $userId: String! + $companyName: String! + $email: String + $phone: String + $photoUrl: String + $address: String + $billingAddress: String + $timezone: String + $legalName: String + $doingBusinessAs: String + $region: String + $state: String + $city: String + $serviceSpecialty: String + $approvalStatus: ApprovalStatus + $isActive: Boolean + $markup: Float + $fee: Float + $csat: Float + $tier: VendorTier +) @auth(level: USER) { + vendor_insert( + data: { + userId: $userId + companyName: $companyName + email: $email + phone: $phone + photoUrl: $photoUrl + address: $address + billingAddress: $billingAddress + timezone: $timezone + legalName: $legalName + doingBusinessAs: $doingBusinessAs + region: $region + state: $state + city: $city + serviceSpecialty: $serviceSpecialty + approvalStatus: $approvalStatus + isActive: $isActive + markup: $markup + fee: $fee + csat: $csat + tier: $tier + } + ) +} + +mutation updateVendor( + $id: UUID! + $companyName: String + $email: String + $phone: String + $photoUrl: String + $address: String + $billingAddress: String + $timezone: String + $legalName: String + $doingBusinessAs: String + $region: String + $state: String + $city: String + $serviceSpecialty: String + $approvalStatus: ApprovalStatus + $isActive: Boolean + $markup: Float + $fee: Float + $csat: Float + $tier: VendorTier +) @auth(level: USER) { + vendor_update( + id: $id + data: { + companyName: $companyName + email: $email + phone: $phone + photoUrl: $photoUrl + address: $address + billingAddress: $billingAddress + timezone: $timezone + legalName: $legalName + doingBusinessAs: $doingBusinessAs + region: $region + state: $state + city: $city + serviceSpecialty: $serviceSpecialty + approvalStatus: $approvalStatus + isActive: $isActive + markup: $markup + fee: $fee + csat: $csat + tier: $tier + } + ) +} + +mutation deleteVendor($id: UUID!) @auth(level: USER) { + vendor_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/vendor/queries.gql b/apps/web/dataconnect/connector/vendor/queries.gql new file mode 100644 index 00000000..76c69b03 --- /dev/null +++ b/apps/web/dataconnect/connector/vendor/queries.gql @@ -0,0 +1,86 @@ +query getVendorById($id: UUID!) @auth(level: USER) { + vendor(id: $id) { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} + +query getVendorByUserId($userId: String!) @auth(level: USER) { + vendors(where: { userId: { eq: $userId } }) { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} + +query listVendors @auth(level: USER) { + vendors { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} diff --git a/apps/web/dataconnect/connector/vendorBenefitPlan/mutations.gql b/apps/web/dataconnect/connector/vendorBenefitPlan/mutations.gql new file mode 100644 index 00000000..2f3fdf63 --- /dev/null +++ b/apps/web/dataconnect/connector/vendorBenefitPlan/mutations.gql @@ -0,0 +1,48 @@ + +mutation createVendorBenefitPlan( + $vendorId: UUID! + $title: String! + $description: String + $requestLabel: String + $total: Int + $isActive: Boolean + $createdBy: String +) @auth(level: USER) { + vendorBenefitPlan_insert( + data: { + vendorId: $vendorId + title: $title + description: $description + requestLabel: $requestLabel + total: $total + isActive: $isActive + } + ) +} + +mutation updateVendorBenefitPlan( + $id: UUID! + $vendorId: UUID + $title: String + $description: String + $requestLabel: String + $total: Int + $isActive: Boolean + $createdBy: String +) @auth(level: USER) { + vendorBenefitPlan_update( + id: $id + data: { + vendorId: $vendorId + title: $title + description: $description + requestLabel: $requestLabel + total: $total + isActive: $isActive + } + ) +} + +mutation deleteVendorBenefitPlan($id: UUID!) @auth(level: USER) { + vendorBenefitPlan_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/vendorBenefitPlan/queries.gql b/apps/web/dataconnect/connector/vendorBenefitPlan/queries.gql new file mode 100644 index 00000000..59068553 --- /dev/null +++ b/apps/web/dataconnect/connector/vendorBenefitPlan/queries.gql @@ -0,0 +1,149 @@ +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listVendorBenefitPlans( + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getVendorBenefitPlanById($id: UUID!) @auth(level: USER) { + vendorBenefitPlan(id: $id) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR +# ---------------------------------------------------------- +query listVendorBenefitPlansByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# LIST ACTIVE PLANS BY VENDOR +# ---------------------------------------------------------- +query listActiveVendorBenefitPlansByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { + vendorId: { eq: $vendorId } + isActive: { eq: true } + } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# FILTER (vendorId + title + isActive) +# - Useful for "does this plan already exist?" +# ---------------------------------------------------------- +query filterVendorBenefitPlans( + $vendorId: UUID + $title: String + $isActive: Boolean + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { + vendorId: { eq: $vendorId } + title: { eq: $title } + isActive: { eq: $isActive } + } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} diff --git a/apps/web/dataconnect/connector/vendorRate/mutations.gql b/apps/web/dataconnect/connector/vendorRate/mutations.gql new file mode 100644 index 00000000..0479e75c --- /dev/null +++ b/apps/web/dataconnect/connector/vendorRate/mutations.gql @@ -0,0 +1,57 @@ +mutation createVendorRate( + $vendorId: UUID!, + $roleName: String, + $category: CategoryType, + $clientRate: Float, + $employeeWage: Float, + $markupPercentage: Float, + $vendorFeePercentage: Float, + $isActive: Boolean, + $notes: String +) @auth(level: USER) { + vendorRate_insert( + data: { + vendorId: $vendorId, + roleName: $roleName, + category: $category, + clientRate: $clientRate, + employeeWage: $employeeWage, + markupPercentage: $markupPercentage, + vendorFeePercentage: $vendorFeePercentage, + isActive: $isActive, + notes: $notes, + } + ) +} + +mutation updateVendorRate( + $id: UUID!, + $vendorId: UUID, + $roleName: String, + $category: CategoryType, + $clientRate: Float, + $employeeWage: Float, + $markupPercentage: Float, + $vendorFeePercentage: Float, + $isActive: Boolean, + $notes: String, +) @auth(level: USER) { + vendorRate_update( + id: $id, + data: { + vendorId: $vendorId, + roleName: $roleName, + category: $category, + clientRate: $clientRate, + employeeWage: $employeeWage, + markupPercentage: $markupPercentage, + vendorFeePercentage: $vendorFeePercentage, + isActive: $isActive, + notes: $notes, + } + ) +} + +mutation deleteVendorRate($id: UUID!) @auth(level: USER) { + vendorRate_delete(id: $id) +} diff --git a/apps/web/dataconnect/connector/vendorRate/queries.gql b/apps/web/dataconnect/connector/vendorRate/queries.gql new file mode 100644 index 00000000..3e2df738 --- /dev/null +++ b/apps/web/dataconnect/connector/vendorRate/queries.gql @@ -0,0 +1,42 @@ +query listVendorRates @auth(level: USER) { + vendorRates { + id + vendorId + roleName + category + clientRate + employeeWage + markupPercentage + vendorFeePercentage + isActive + notes + createdAt + + vendor{ + companyName + region + } + + } +} + +query getVendorRateById($id: UUID!) @auth(level: USER) { + vendorRate(id: $id) { + id + vendorId + roleName + category + clientRate + employeeWage + markupPercentage + vendorFeePercentage + isActive + notes + createdAt + + vendor{ + companyName + region + } + } +} diff --git a/apps/web/dataconnect/connector/workForce/mutations.gql b/apps/web/dataconnect/connector/workForce/mutations.gql new file mode 100644 index 00000000..489ab55f --- /dev/null +++ b/apps/web/dataconnect/connector/workForce/mutations.gql @@ -0,0 +1,41 @@ +mutation createWorkforce( + $vendorId: UUID! + $staffId: UUID! + $workforceNumber: String! + $employmentType: WorkforceEmploymentType +) @auth(level: USER) { + workforce_insert( + data: { + vendorId: $vendorId + staffId: $staffId + workforceNumber: $workforceNumber + employmentType: $employmentType + status: ACTIVE + } + ) +} + +mutation updateWorkforce( + $id: UUID! + $workforceNumber: String + $employmentType: WorkforceEmploymentType + $status: WorkforceStatus +) @auth(level: USER) { + workforce_update( + id: $id + data: { + workforceNumber: $workforceNumber + employmentType: $employmentType + status: $status + } + ) +} + +mutation deactivateWorkforce( + $id: UUID! +) @auth(level: USER) { + workforce_update( + id: $id + data: { status: INACTIVE } + ) +} diff --git a/apps/web/dataconnect/connector/workForce/queries.gql b/apps/web/dataconnect/connector/workForce/queries.gql new file mode 100644 index 00000000..453bc5db --- /dev/null +++ b/apps/web/dataconnect/connector/workForce/queries.gql @@ -0,0 +1,116 @@ +# ------------------------------------------------------------ +# GET Workforce by ID +# ------------------------------------------------------------ +query getWorkforceById($id: UUID!) @auth(level: USER) { + workforce(id: $id) { + id + vendorId + staffId + workforceNumber + employmentType + status + createdAt + updatedAt + + staff { id fullName } + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# GET Workforce by Vendor + Staff (was "by key") +# ------------------------------------------------------------ +query getWorkforceByVendorAndStaff( + $vendorId: UUID! + $staffId: UUID! +) @auth(level: USER) { + workforces( + where: { + vendorId: { eq: $vendorId } + staffId: { eq: $staffId } + } + limit: 1 + ) { + id + vendorId + staffId + workforceNumber + employmentType + status + createdAt + updatedAt + + staff { id fullName } + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# LIST Workforce by Vendor +# ------------------------------------------------------------ +query listWorkforceByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + workforces( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + staffId + workforceNumber + employmentType + status + createdAt + + staff { id fullName } + } +} + +# ------------------------------------------------------------ +# LIST Workforce by Staff +# ------------------------------------------------------------ +query listWorkforceByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + workforces( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + vendorId + workforceNumber + employmentType + status + createdAt + updatedAt + + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# CHECK workforceNumber uniqueness within a Vendor (optional) +# ------------------------------------------------------------ +query getWorkforceByVendorAndNumber( + $vendorId: UUID! + $workforceNumber: String! +) @auth(level: USER) { + workforces( + where: { + vendorId: { eq: $vendorId } + workforceNumber: { eq: $workforceNumber } + } + limit: 1 + ) { + id + staffId + workforceNumber + status + } +} diff --git a/apps/web/dataconnect/schema/ShiftRole.gql b/apps/web/dataconnect/schema/ShiftRole.gql new file mode 100644 index 00000000..1b3598d3 --- /dev/null +++ b/apps/web/dataconnect/schema/ShiftRole.gql @@ -0,0 +1,32 @@ +enum BreakDuration { + MIN_15 + MIN_30 + NO_BREAK +} + +#this is position, timesheet and schedule in staff app +type ShiftRole @table(name: "shift_roles", key: ["shiftId", "roleId"]) { + id: UUID! @default(expr: "uuidV4()") + + shiftId: UUID! + shift: Shift! @ref(fields: "shiftId", references: "id") + + roleId: UUID! + role: Role! @ref(fields: "roleId", references: "id") + + # demand / requirements + count: Int! + assigned: Int @default(expr: "0") + + startTime: Timestamp + endTime: Timestamp + hours: Float + + department: String + uniform: String + breakType: BreakDuration + totalValue: Float + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") +} diff --git a/apps/web/dataconnect/schema/VendorBenefitPlan.gql b/apps/web/dataconnect/schema/VendorBenefitPlan.gql new file mode 100644 index 00000000..e58868df --- /dev/null +++ b/apps/web/dataconnect/schema/VendorBenefitPlan.gql @@ -0,0 +1,17 @@ +type VendorBenefitPlan @table(name: "vendor_benefit_plans") { + id: UUID! @default(expr: "uuidV4()") + + vendorId: UUID! + vendor: Vendor! @ref(fields: "vendorId", references: "id") + + title: String! + description: String + requestLabel: String + + total: Int + isActive: Boolean @default(expr: "true") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/account.gql b/apps/web/dataconnect/schema/account.gql new file mode 100644 index 00000000..f0422c15 --- /dev/null +++ b/apps/web/dataconnect/schema/account.gql @@ -0,0 +1,20 @@ + +enum AccountType { + CHECKING + SAVINGS +} + +type Account @table(name: "accounts") { + id: UUID! @default(expr: "uuidV4()") + bank: String! + type: AccountType! + last4: String! + isPrimary: Boolean + accountNumber: String + routeNumber: String + ownerId: UUID! #staff/business + expiryTime: Timestamp + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/activityLog.gql b/apps/web/dataconnect/schema/activityLog.gql new file mode 100644 index 00000000..f7b16658 --- /dev/null +++ b/apps/web/dataconnect/schema/activityLog.gql @@ -0,0 +1,39 @@ +enum ActivityIconType { + INVOICE + CHECK + ALERT + MESSAGE + CALENDAR +} + +enum ActivityType { + ORDER_CREATED + SHIFT_UPDATE + COMPLIANCE_ALERT + MESSAGE_RECEIVED + SYSTEM_UPDATE +} + +type ActivityLog @table(name: "activity_logs") { + id: UUID! @default(expr: "uuidV4()") + + userId: String! + + #app + date: Timestamp! + hourStart: String + hourEnd: String + totalhours: String + iconType: ActivityIconType + iconColor: String + + #web + title: String! + description: String! + isRead: Boolean @default(expr: "false") + activityType: ActivityType! + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/application.gql b/apps/web/dataconnect/schema/application.gql new file mode 100644 index 00000000..ed5294fc --- /dev/null +++ b/apps/web/dataconnect/schema/application.gql @@ -0,0 +1,42 @@ +enum ApplicationStatus { + PENDING + ACCEPTED + REJECTED + CONFIRMED + CHECKED_IN + CHECKED_OUT + LATE + NO_SHOW +} + +enum ApplicationOrigin { + STAFF + EMPLOYER #like vendor +} + +#position +type Application @table(name: "applications") { + id: UUID! @default(expr: "uuidV4()") + + shiftId: UUID! + shift: Shift! @ref(fields: "shiftId", references: "id") + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + roleId: UUID! + shiftRole: ShiftRole! @ref( + fields: ["shiftId", "roleId"], + references: ["shiftId", "roleId"] + ) + + status: ApplicationStatus! + appliedAt: Timestamp @default(expr: "request.time") + checkInTime: Timestamp + checkOutTime: Timestamp + origin: ApplicationOrigin! + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/assignment.gql b/apps/web/dataconnect/schema/assignment.gql new file mode 100644 index 00000000..0b692553 --- /dev/null +++ b/apps/web/dataconnect/schema/assignment.gql @@ -0,0 +1,46 @@ +enum AssignmentStatus { + PENDING + CONFIRMED + OPEN + COMPLETED + CANCELED + ACTIVE +} + +type Assignment @table(name: "assignments") { + id: UUID! @default(expr: "uuidV4()") + + # Who is doing the assignment + workforceId: UUID! + workforce: Workforce! @ref(fields: "workforceId", references: "id") + + # What exact shift + role this assignment is for + roleId: UUID! + shiftId: UUID! + + shiftRole: ShiftRole! @ref( + fields: ["shiftId", "roleId"], + references: ["shiftId", "roleId"] + ) + + # --- task info --- + title: String + description: String + instructions: String + + status: AssignmentStatus @default(expr: "'PENDING'") + + # flags / perks + tipsAvailable: Boolean + travelTime: Boolean + mealProvided: Boolean + parkingAvailable: Boolean + gasCompensation: Boolean + + # Optional managers list (still ok as json) + managers: [Any!] + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String @default(expr: "auth.uid") +} \ No newline at end of file diff --git a/apps/web/dataconnect/schema/attireOption.gql b/apps/web/dataconnect/schema/attireOption.gql new file mode 100644 index 00000000..2c09a410 --- /dev/null +++ b/apps/web/dataconnect/schema/attireOption.gql @@ -0,0 +1,15 @@ +type AttireOption @table(name: "attire_options") { + id: UUID! @default(expr: "uuidV4()") + itemId: String! + label: String! + icon: String + imageUrl: String + isMandatory: Boolean + + # Relations / ownership + vendorId: UUID + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/benefitsData.gql b/apps/web/dataconnect/schema/benefitsData.gql new file mode 100644 index 00000000..397d80f3 --- /dev/null +++ b/apps/web/dataconnect/schema/benefitsData.gql @@ -0,0 +1,15 @@ +type BenefitsData @table(name: "benefits_data", key: ["staffId", "vendorBenefitPlanId"]) { + id: UUID! @default(expr: "uuidV4()") + + vendorBenefitPlanId: UUID! + vendorBenefitPlan: VendorBenefitPlan! @ref( fields: "vendorBenefitPlanId", references: "id" ) + + current: Int! + + staffId: UUID! + staff: Staff! @ref( fields: "staffId", references: "id" ) + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/business.gql b/apps/web/dataconnect/schema/business.gql new file mode 100644 index 00000000..fcc1df9a --- /dev/null +++ b/apps/web/dataconnect/schema/business.gql @@ -0,0 +1,53 @@ +enum BusinessArea { + BAY_AREA + SOUTHERN_CALIFORNIA + NORTHERN_CALIFORNIA + CENTRAL_VALLEY + OTHER +} + +enum BusinessSector { + BON_APPETIT + EUREST + ARAMARK + EPICUREAN_GROUP + CHARTWELLS + OTHER +} + +enum BusinessRateGroup { + STANDARD + PREMIUM + ENTERPRISE + CUSTOM +} + +enum BusinessStatus { + ACTIVE + INACTIVE + PENDING +} + +type Business @table(name: "businesses") { + id: UUID! @default(expr: "uuidV4()") + businessName: String! + contactName: String + userId: String! + + companyLogoUrl: String + phone: String + email: String + hubBuilding: String + address: String + city: String + area: BusinessArea + sector: BusinessSector + rateGroup: BusinessRateGroup! + status: BusinessStatus! + notes: String + + # --- TIMESTAMPS --- + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/category.gql b/apps/web/dataconnect/schema/category.gql new file mode 100644 index 00000000..905e9837 --- /dev/null +++ b/apps/web/dataconnect/schema/category.gql @@ -0,0 +1,10 @@ +#courses categories +type Category @table(name: "categories") { + id: UUID! @default(expr: "uuidV4()") + categoryId: String! + label: String! + icon: String + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/certificate.gql b/apps/web/dataconnect/schema/certificate.gql new file mode 100644 index 00000000..4f91b2f6 --- /dev/null +++ b/apps/web/dataconnect/schema/certificate.gql @@ -0,0 +1,54 @@ +enum ComplianceType { + BACKGROUND_CHECK + FOOD_HANDLER + RBS + LEGAL + OPERATIONAL + SAFETY + TRAINING + LICENSE + OTHER +} + +enum CertificateStatus { + CURRENT + EXPIRING_SOON + COMPLETED + PENDING + EXPIRED + EXPIRING + NOT_STARTED +} + +enum ValidationStatus { + APPROVED + PENDING_EXPERT_REVIEW + REJECTED + AI_VERIFIED + AI_FLAGGED + MANUAL_REVIEW_NEEDED +} + + +type Certificate @table(name: "certificates") { + id: UUID! @default(expr: "uuidV4()") + + name: String! + description: String + expiry: Timestamp + status: CertificateStatus! + fileUrl: String + icon: String + certificationType: ComplianceType + issuer: String #Issuing Authority + certificateNumber: String + + validationStatus: ValidationStatus + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/clientFeedback.gql b/apps/web/dataconnect/schema/clientFeedback.gql new file mode 100644 index 00000000..70a34bc6 --- /dev/null +++ b/apps/web/dataconnect/schema/clientFeedback.gql @@ -0,0 +1,17 @@ +type ClientFeedback @table(name: "client_feedbacks") { + id: UUID! @default(expr: "uuidV4()") + + businessId: UUID! + business: Business! @ref(fields: "businessId", references: "id") + + vendorId: UUID! + vendor: Vendor! @ref(fields: "vendorId", references: "id") + + rating: Int + comment: String + date: Timestamp + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/conversation.gql b/apps/web/dataconnect/schema/conversation.gql new file mode 100644 index 00000000..36bd0eab --- /dev/null +++ b/apps/web/dataconnect/schema/conversation.gql @@ -0,0 +1,29 @@ +enum ConversationStatus { + ACTIVE +} + +enum ConversationType { + CLIENT_VENDOR + GROUP_STAFF + STAFF_CLIENT + STAFF_ADMIN + VENDOR_ADMIN + CLIENT_ADMIN + GROUP_ORDER_STAFF +} + +type Conversation @table(name: "conversations") { + id: UUID! @default(expr: "uuidV4()") + + subject: String + status: ConversationStatus + conversationType: ConversationType + isGroup: Boolean + groupName: String + lastMessage: String + lastMessageAt: Timestamp #lastTime + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/course.gql b/apps/web/dataconnect/schema/course.gql new file mode 100644 index 00000000..91e791d5 --- /dev/null +++ b/apps/web/dataconnect/schema/course.gql @@ -0,0 +1,18 @@ +type Course @table(name: "courses") { + id: UUID! @default(expr: "uuidV4()") + + title: String + description: String + thumbnailUrl: String + durationMinutes: Int + xpReward: Int + categoryId: UUID! + category: Category! @ref(fields: "categoryId", references: "id") + + levelRequired: String + isCertification: Boolean + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/customRateCard.gql b/apps/web/dataconnect/schema/customRateCard.gql new file mode 100644 index 00000000..c38a6cda --- /dev/null +++ b/apps/web/dataconnect/schema/customRateCard.gql @@ -0,0 +1,10 @@ +type CustomRateCard @table(name: "custom_rate_cards") { + id: UUID! @default(expr: "uuidV4()") + name: String! + baseBook: String + discount: Float + isDefault: Boolean + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/document.gql b/apps/web/dataconnect/schema/document.gql new file mode 100644 index 00000000..b0657b10 --- /dev/null +++ b/apps/web/dataconnect/schema/document.gql @@ -0,0 +1,20 @@ + +enum DocumentType { + W4_FORM + I9_FORM + STATE_TAX_FORM + DIRECT_DEPOSIT + ID_COPY + SSN_CARD + WORK_PERMIT +} + +type Document @table(name: "documents") { + id: UUID! @default(expr: "uuidV4()") + name: String! + description: String + documentType: DocumentType! + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/emergencyContact.gql b/apps/web/dataconnect/schema/emergencyContact.gql new file mode 100644 index 00000000..fdcd7268 --- /dev/null +++ b/apps/web/dataconnect/schema/emergencyContact.gql @@ -0,0 +1,17 @@ +enum RelationshipType { + FAMILY + SPOUSE + FRIEND + OTHER +} + +type EmergencyContact @table(name: "emergecyContacts") { + id: UUID! @default(expr: "uuidV4()") + name: String! + phone: String! + relationship: RelationshipType! + staffId: UUID! + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/faqData.gql b/apps/web/dataconnect/schema/faqData.gql new file mode 100644 index 00000000..e5fb8974 --- /dev/null +++ b/apps/web/dataconnect/schema/faqData.gql @@ -0,0 +1,8 @@ +type FaqData @table(name: "faq_data") { + id: UUID! @default(expr: "uuidV4()") + category: String! + questions: [Any!] + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/hub.gql b/apps/web/dataconnect/schema/hub.gql new file mode 100644 index 00000000..98a6f5b3 --- /dev/null +++ b/apps/web/dataconnect/schema/hub.gql @@ -0,0 +1,11 @@ +type Hub @table(name: "hubs") { + id: UUID! @default(expr: "uuidV4()") + name: String! + locationName: String + address: String + nfcTagId: String + ownerId: UUID! + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/invoice.gql b/apps/web/dataconnect/schema/invoice.gql new file mode 100644 index 00000000..89306cab --- /dev/null +++ b/apps/web/dataconnect/schema/invoice.gql @@ -0,0 +1,60 @@ +enum InvoiceStatus { + PAID + PENDING + OVERDUE + PENDING_REVIEW + APPROVED + DISPUTED + DRAFT +} + +enum InovicePaymentTerms{ + NET_30 + NET_45 + NET_60 +} + +type Invoice @table(name: "invoices") { + id: UUID! @default(expr: "uuidV4()") + + status: InvoiceStatus! + + #vendor poner companyName + vendorId: UUID! + vendor: Vendor! @ref(fields: "vendorId", references: "id") + + #businnes poner businessName + businessId: UUID! + business: Business! @ref(fields: "businessId", references: "id") + + #order poner eventName + orderId: UUID! + order: Order! @ref(fields: "orderId", references: "id") + + #web + paymentTerms: InovicePaymentTerms + invoiceNumber: String! + issueDate: Timestamp! + dueDate: Timestamp! + hub: String + managerName: String + vendorNumber: String + roles: Any #here is for staff + charges: Any + otherCharges: Float + subtotal: Float + amount: Float! + notes: String + + staffCount: Int + chargesCount: Int + + #DISPUTED + disputedItems: Any @col(dataType: "jsonb") + disputeReason: String + disputeDetails: String + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/invoiceTemplate.gql b/apps/web/dataconnect/schema/invoiceTemplate.gql new file mode 100644 index 00000000..07040154 --- /dev/null +++ b/apps/web/dataconnect/schema/invoiceTemplate.gql @@ -0,0 +1,47 @@ + +enum InovicePaymentTermsTemp{ + NET_30 + NET_45 + NET_60 +} + +type InvoiceTemplate @table(name: "invoice_templates") { + id: UUID! @default(expr: "uuidV4()") + name: String! + + ownerId: UUID!#vendor/business + + #vendor poner companyName + vendorId: UUID + vendor: Vendor @ref(fields: "vendorId", references: "id") + + #businnes poner businessName + businessId: UUID + business: Business @ref(fields: "businessId", references: "id") + + #order poner eventName + orderId: UUID + order: Order @ref(fields: "orderId", references: "id") + + #web + paymentTerms: InovicePaymentTermsTemp + invoiceNumber: String + issueDate: Timestamp + dueDate: Timestamp + hub: String + managerName: String + vendorNumber: String + roles: Any #here is for staff + charges: Any + otherCharges: Float + subtotal: Float + amount: Float + notes: String + + staffCount: Int + chargesCount: Int + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/level.gql b/apps/web/dataconnect/schema/level.gql new file mode 100644 index 00000000..fe64dbd6 --- /dev/null +++ b/apps/web/dataconnect/schema/level.gql @@ -0,0 +1,10 @@ +type Level @table(name: "levels") { + id: UUID! @default(expr: "uuidV4()") + name: String! + xpRequired: Int! + icon: String + colors: Any + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/memberTask.gql b/apps/web/dataconnect/schema/memberTask.gql new file mode 100644 index 00000000..0e66bfcc --- /dev/null +++ b/apps/web/dataconnect/schema/memberTask.gql @@ -0,0 +1,13 @@ + +type MemberTask @table(name: "member_tasks", key: ["teamMemberId", "taskId"]) { + id: UUID! @default(expr: "uuidV4()") + + teamMemberId: UUID! + teamMember: TeamMember! @ref(fields: "teamMemberId", references: "id") + + taskId: UUID! + task: Task! @ref(fields: "taskId", references: "id") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") +} diff --git a/apps/web/dataconnect/schema/message.gql b/apps/web/dataconnect/schema/message.gql new file mode 100644 index 00000000..2afe899e --- /dev/null +++ b/apps/web/dataconnect/schema/message.gql @@ -0,0 +1,16 @@ +type Message @table(name: "messages") { + id: UUID! @default(expr: "uuidV4()") + + conversationId: UUID! + + senderId: String! #userId + #senderName: String + user: User! @ref(fields: "senderId", references: "id") + + content: String! + isSystem: Boolean + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/order.gql b/apps/web/dataconnect/schema/order.gql new file mode 100644 index 00000000..c0db5d79 --- /dev/null +++ b/apps/web/dataconnect/schema/order.gql @@ -0,0 +1,65 @@ +enum OrderType { + ONE_TIME + PERMANENT + RECURRING + RAPID +} + +enum OrderStatus { + DRAFT + POSTED + FILLED + COMPLETED + CANCELLED + PENDING + FULLY_STAFFED + PARTIAL_STAFFED +} + +enum OrderDuration { + WEEKLY + MONTHLY +} + +#events +type Order @table(name: "orders") { + id: UUID! @default(expr: "uuidV4()") + eventName: String + + vendorId: UUID + vendor: Vendor @ref(fields: "vendorId", references: "id") + + businessId: UUID! + business: Business! @ref(fields: "businessId", references: "id") + + orderType: OrderType! + location: String + status: OrderStatus! @default(expr: "'DRAFT'") + duration: OrderDuration + lunchBreak: Int + total: Float + deparment: String + + assignedStaff: Any @col(dataType: "jsonb") + shifts: Any @col(dataType: "jsonb") + + requested: Int + hub: String + + date: Timestamp + + startDate: Timestamp #for recurring and permanent + endDate: Timestamp #for recurring and permanent + + recurringDays: Any @col(dataType: "jsonb") + poReference: String + + permanentDays: Any @col(dataType: "jsonb") + + detectedConflicts: Any @col(dataType:"jsonb") + notes: String + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/recentPayment.gql b/apps/web/dataconnect/schema/recentPayment.gql new file mode 100644 index 00000000..2ebd37b9 --- /dev/null +++ b/apps/web/dataconnect/schema/recentPayment.gql @@ -0,0 +1,39 @@ +enum RecentPaymentStatus { + PAID + PENDING + FAILED +} + +type RecentPayment @table(name: "recent_payments") { + id: UUID! @default(expr: "uuidV4()") + + workedTime: String + + status: RecentPaymentStatus + + staffId: UUID! + applicationId: UUID! + application: Application! @ref(fields: "applicationId", references: "id") + + #title: String poner en queries ,dentro de application esta shiftrole que tiene shift adentro, que tiene title + #date: Timestamp poner en queries ,dentro de application esta shiftrole que tiene shift adentro, que tiene date + #address: String poner en queries ,dentro de application esta shiftrole que tiene shift adentro, que tiene locationAddress + + #hours: Float poner en queries ,dentro de application esta shiftrole, dentro de shiftrole esta hours + #rate: Float poner en queries ,dentro de application esta shiftrole, dentro de shiftrole esta role que tiene costPerHours + #rolename: Float poner en queries ,dentro de application esta shiftrole, dentro de shiftrole esta role que tiene name + #amount: Float poner en queries ,dentro de application esta shiftrole que tiene totalValue + #startTime poner en queries ,dentro de application esta shiftrole que tiene startTime + #endTime poner en queries ,dentro de application esta shiftrole que tiene endTime + + invoiceId: UUID! + invoice: Invoice! @ref(fields: "invoiceId", references: "id") + #poner en queries q salga una busuqeda por businessId que tiene business que esta en invoice, tmbn por vendor + + #location: String oner en queries, esto esta dentro de order que tiene invoce, location + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} + diff --git a/apps/web/dataconnect/schema/role.gql b/apps/web/dataconnect/schema/role.gql new file mode 100644 index 00000000..fb3f6772 --- /dev/null +++ b/apps/web/dataconnect/schema/role.gql @@ -0,0 +1,13 @@ +type Role @table(name: "roles") { + id: UUID! @default(expr: "uuidV4()") + name: String! + + vendorId: UUID! + + roleCategoryId: UUID! + + costPerHour: Float! + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/roleCategory.gql b/apps/web/dataconnect/schema/roleCategory.gql new file mode 100644 index 00000000..2168f1f2 --- /dev/null +++ b/apps/web/dataconnect/schema/roleCategory.gql @@ -0,0 +1,20 @@ +enum RoleCategoryType { + KITCHEN_AND_CULINARY + CONCESSIONS + FACILITIES + BARTENDING + SECURITY + EVENT_STAFF + MANAGEMENT + TECHNICAL + OTHER +} + +type RoleCategory @table(name: "role_categories") { + id: UUID! @default(expr: "uuidV4()") + roleName: String! + category: RoleCategoryType! + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/shift.gql b/apps/web/dataconnect/schema/shift.gql new file mode 100644 index 00000000..30c7dd9c --- /dev/null +++ b/apps/web/dataconnect/schema/shift.gql @@ -0,0 +1,47 @@ +enum ShiftStatus { + DRAFT + FILLED + PENDING + ASSIGNED + CONFIRMED + OPEN + IN_PROGRESS + COMPLETED + CANCELED +} + +type Shift @table(name: "shifts") { + id: UUID! @default(expr: "uuidV4()") + + title: String! + + orderId: UUID! + order: Order! @ref(fields: "orderId", references: "id") + + date: Timestamp + startTime: Timestamp + endTime: Timestamp + hours: Float + cost: Float + + location: String + locationAddress: String + latitude: Float + longitude: Float + description: String + + status: ShiftStatus + workersNeeded: Int + filled: Int + filledAt: Timestamp + + # JSON list of managers (e.g. [{name, phone, avatar}, ...]) + managers: [Any!] + + durationDays: Int + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} + diff --git a/apps/web/dataconnect/schema/staff.gql b/apps/web/dataconnect/schema/staff.gql new file mode 100644 index 00000000..c098bd21 --- /dev/null +++ b/apps/web/dataconnect/schema/staff.gql @@ -0,0 +1,93 @@ + +enum BackgroundCheckStatus { + PENDING + CLEARED + FAILED + EXPIRED + NOT_REQUIRED +} + +enum EmploymentType { + FULL_TIME + PART_TIME + ON_CALL + WEEKENDS + SPECIFIC_DAYS + SEASONAL + MEDICAL_LEAVE +} + +enum DepartmentType { + OPERATIONS + SALES + HR + FINANCE + IT + MARKETING + CUSTOMER_SERVICE + LOGISTICS +} + +enum EnglishProficiency { + FLUENT + INTERMEDIATE + BASIC + NONE +} + +type Staff @table(name: "staffs") { + id: UUID! @default(expr: "uuidV4()") + userId: String! + + # Identity + fullName: String! + level: String + role: String + phone: String + email: String + photoUrl: String + + # Metrics + totalShifts: Int + averageRating: Float + onTimeRate: Int + noShowCount: Int + cancellationCount: Int + reliabilityScore: Int + + # Gamification + xp: Int @default(expr: "0") + badges: Any + + # Profile + bio: String + skills: [String] #changed it for staffRole + industries: [String] + preferredLocations: [String] + maxDistanceMiles: Int + languages: Any + itemsAttire: Any + + # Recommendation + isRecommended: Boolean @default(expr: "false") + + # Relations / ownership + ownerId: UUID #vendor/business + + # web + department: DepartmentType + hubId: UUID + manager: UUID + english: EnglishProficiency + + backgroundCheckStatus: BackgroundCheckStatus + employmentType: EmploymentType + initial: String + englishRequired: Boolean @default(expr: "false") + city: String + addres: String + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/staffAvailability.gql b/apps/web/dataconnect/schema/staffAvailability.gql new file mode 100644 index 00000000..0c6787e3 --- /dev/null +++ b/apps/web/dataconnect/schema/staffAvailability.gql @@ -0,0 +1,42 @@ + +enum DayOfWeek { + SUNDAY + MONDAY + TUESDAY + WEDNESDAY + THURSDAY + FRIDAY + SATURDAY +} + +enum AvailabilitySlot { + MORNING + AFTERNOON + EVENING +} + +enum AvailabilityStatus { + CONFIRMED_AVAILABLE + UNKNOWN + BLOCKED +} + +#3 in day, its good? + +type StaffAvailability @table(name: "staff_availabilities", key: ["staffId", "day", "slot"]) { + id: UUID! @default(expr: "uuidV4()") + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + day: DayOfWeek! + slot: AvailabilitySlot! + + status: AvailabilityStatus! @default(expr: "'CONFIRMED_AVAILABLE'") + + notes: String + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String @default(expr: "auth.uid") +} \ No newline at end of file diff --git a/apps/web/dataconnect/schema/staffAvailabilityStats.gql b/apps/web/dataconnect/schema/staffAvailabilityStats.gql new file mode 100644 index 00000000..2e2cca47 --- /dev/null +++ b/apps/web/dataconnect/schema/staffAvailabilityStats.gql @@ -0,0 +1,18 @@ +type StaffAvailabilityStats @table(name: "staff_availability_stats", key: ["staffId"]) { + id: UUID! @default(expr: "uuidV4()") + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + needWorkIndex: Int + utilizationPercentage: Int + predictedAvailabilityScore: Int + scheduledHoursThisPeriod: Int + desiredHoursThisPeriod: Int + lastShiftDate: Timestamp + acceptanceRate: Int + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String @default(expr: "auth.uid") +} \ No newline at end of file diff --git a/apps/web/dataconnect/schema/staffCourse.gql b/apps/web/dataconnect/schema/staffCourse.gql new file mode 100644 index 00000000..9b321087 --- /dev/null +++ b/apps/web/dataconnect/schema/staffCourse.gql @@ -0,0 +1,15 @@ +type StaffCourse @table(name: "staff_courses") { + id: UUID! @default(expr: "uuidV4()") + + staffId: UUID! + courseId: UUID! + + progressPercent: Int @default(expr: "0") + completed: Boolean @default(expr: "false") + completedAt: Timestamp + startedAt: Timestamp + lastAccessedAt: Timestamp + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") +} diff --git a/apps/web/dataconnect/schema/staffDocument.gql b/apps/web/dataconnect/schema/staffDocument.gql new file mode 100644 index 00000000..65c26058 --- /dev/null +++ b/apps/web/dataconnect/schema/staffDocument.gql @@ -0,0 +1,21 @@ +enum DocumentStatus { + UPLOADED + PENDING + EXPIRING + MISSING + VERIFIED +} + +type StaffDocument @table(name: "staff_documents", key: ["staffId", "documentId"]) { + id: UUID! @default(expr: "uuidV4()") + staffId: UUID! + staffName: String! + documentId: UUID! + document: Document! @ref(fields: "documentId", references: "id") + status: DocumentStatus! + documentUrl: String + expiryDate: Timestamp + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/staffRole.gql b/apps/web/dataconnect/schema/staffRole.gql new file mode 100644 index 00000000..8ca84cfa --- /dev/null +++ b/apps/web/dataconnect/schema/staffRole.gql @@ -0,0 +1,24 @@ + + +enum RoleType { + SKILLED + BEGINNER + CROSS_TRAINED +} + +#this is skills of staff +type StaffRole @table(name: "staff_roles", key: ["staffId", "roleId"]) { + id: UUID! @default(expr: "uuidV4()") + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + roleId: UUID! + role: Role! @ref(fields: "roleId", references: "id") + + roleType: RoleType + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/task.gql b/apps/web/dataconnect/schema/task.gql new file mode 100644 index 00000000..37cd3b12 --- /dev/null +++ b/apps/web/dataconnect/schema/task.gql @@ -0,0 +1,32 @@ +enum TaskStatus { + PENDING + IN_PROGRESS + COMPLETED +} + +enum TaskPriority { + LOW + NORMAL + HIGH +} + +type Task @table(name: "tasks") { + + id: UUID! @default(expr: "uuidV4()") + + taskName: String! #task identifier + description: String + priority: TaskPriority! + status: TaskStatus! + dueDate: Timestamp + progress: Int + orderIndex: Int + commentCount: Int + attachmentCount: Int + files: Any + ownerId:UUID! #client/vendor + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/task_comment.gql b/apps/web/dataconnect/schema/task_comment.gql new file mode 100644 index 00000000..ea64af3d --- /dev/null +++ b/apps/web/dataconnect/schema/task_comment.gql @@ -0,0 +1,15 @@ +type TaskComment @table(name: "task_comments") { + id: UUID! @default(expr: "uuidV4()") + + taskId: UUID! + + teamMemberId: UUID! + teamMember: TeamMember! @ref(fields: "teamMemberId", references: "id") + + comment: String! + isSystem: Boolean! @default(expr: "false") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/taxForm.gql b/apps/web/dataconnect/schema/taxForm.gql new file mode 100644 index 00000000..35a36462 --- /dev/null +++ b/apps/web/dataconnect/schema/taxForm.gql @@ -0,0 +1,27 @@ +enum TaxFormStatus { + NOT_STARTED + DRAFT + SUBMITTED + APPROVED + REJECTED +} + +enum TaxFormType { + I9 + W4 +} + +type TaxForm @table(name: "tax_forms") { + id: UUID! @default(expr: "uuidV4()") + formType: TaxFormType! + title: String! + subtitle: String + description: String + status: TaxFormStatus! + staffId: UUID! + formData: Any + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/team.gql b/apps/web/dataconnect/schema/team.gql new file mode 100644 index 00000000..ccfb2d8a --- /dev/null +++ b/apps/web/dataconnect/schema/team.gql @@ -0,0 +1,25 @@ +type Team @table(name: "teams") { + + id: UUID! @default(expr: "uuidV4()") + teamName: String! + + ownerId: UUID! #vendor/business + ownerName: String! + ownerRole: String! + email: String + companyLogo: String + + totalMembers: Int + activeMembers: Int + totalHubs: Int + departments: Any + + favoriteStaffCount: Int + blockedStaffCount: Int + favoriteStaff: Any + blockedStaff: Any + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/teamHub.gql b/apps/web/dataconnect/schema/teamHub.gql new file mode 100644 index 00000000..a206a6fd --- /dev/null +++ b/apps/web/dataconnect/schema/teamHub.gql @@ -0,0 +1,19 @@ +type TeamHub @table(name: "team_hubs") { + id: UUID! @default(expr: "uuidV4()") + + teamId: UUID! + team: Team! @ref(fields: "teamId", references: "id") + + hubName: String! + address: String! + city: String + state: String + zipCode: String + managerName: String + isActive: Boolean! @default(expr: "true") + departments: Any + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/teamHudDeparment.gql b/apps/web/dataconnect/schema/teamHudDeparment.gql new file mode 100644 index 00000000..fd90bee6 --- /dev/null +++ b/apps/web/dataconnect/schema/teamHudDeparment.gql @@ -0,0 +1,13 @@ +type TeamHudDepartment @table(name: "team_hud_departments") { + id: UUID! @default(expr: "uuidV4()") + + name: String! + costCenter: String + + teamHubId: UUID! + teamHub: TeamHub! @ref(fields: "teamHubId", references: "id") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/teamMember.gql b/apps/web/dataconnect/schema/teamMember.gql new file mode 100644 index 00000000..2cd25ffb --- /dev/null +++ b/apps/web/dataconnect/schema/teamMember.gql @@ -0,0 +1,40 @@ +enum TeamMemberRole { + OWNER + ADMIN + MEMBER + MANAGER + VIEWER +} + +enum TeamMemberInviteStatus { + PENDING + ACCEPTED + #EXPIRED + CANCELLED +} + +type TeamMember @table(name: "team_members") { + id: UUID! @default(expr: "uuidV4()") + + teamId: UUID! + team: Team! @ref(fields: "teamId", references: "id") + + userId: String! + user: User! @ref(fields: "userId", references: "id") + + role: TeamMemberRole! + title: String + department: String + + teamHubId: UUID + teamHub: TeamHub @ref(fields: "teamHubId", references: "id") + + isActive: Boolean @default(expr: "true") + + inviteStatus: TeamMemberInviteStatus @default(expr: "'PENDING'") + inviteCode: UUID! @default(expr: "uuidV4()") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/user.gql b/apps/web/dataconnect/schema/user.gql new file mode 100644 index 00000000..4cb4ca24 --- /dev/null +++ b/apps/web/dataconnect/schema/user.gql @@ -0,0 +1,16 @@ +enum UserBaseRole { + ADMIN + USER +} + +type User @table(name: "users") { + id: String! # user_id / uid de Firebase + email: String + fullName: String + role: UserBaseRole! + userRole: String + photoUrl: String + createdDate: Timestamp @default(expr: "request.time") + updatedDate: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/userConversation.gql b/apps/web/dataconnect/schema/userConversation.gql new file mode 100644 index 00000000..73074e87 --- /dev/null +++ b/apps/web/dataconnect/schema/userConversation.gql @@ -0,0 +1,17 @@ +type UserConversation @table(name: "user_conversations", key: ["conversationId", "userId"]) { + id: UUID! @default(expr: "uuidV4()") + + conversationId: UUID! + conversation: Conversation! @ref(fields: "conversationId", references: "id") + + userId: String! + user: User! @ref(fields: "userId", references: "id") + + # per-user state + unreadCount: Int @default(expr: "0") + lastReadAt: Timestamp + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} \ No newline at end of file diff --git a/apps/web/dataconnect/schema/vendor.gql b/apps/web/dataconnect/schema/vendor.gql new file mode 100644 index 00000000..e9ff82de --- /dev/null +++ b/apps/web/dataconnect/schema/vendor.gql @@ -0,0 +1,39 @@ + +enum ApprovalStatus { + APPROVED +} + +enum VendorTier { + PREFERRED + APPROVED + STANDARD +} + + + +type Vendor @table(name: "vendors") { + id: UUID! @default(expr: "uuidV4()") + userId: String! + companyName: String! + email: String + phone: String + photoUrl: String + address: String + billingAddress: String + timezone: String @default(expr: "'UTC'") + legalName: String + doingBusinessAs: String + region: String + state: String + city: String + serviceSpecialty: String + approvalStatus: ApprovalStatus + isActive: Boolean + markup: Float + fee: Float + csat: Float + tier: VendorTier + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/vendorRate.gql b/apps/web/dataconnect/schema/vendorRate.gql new file mode 100644 index 00000000..269126aa --- /dev/null +++ b/apps/web/dataconnect/schema/vendorRate.gql @@ -0,0 +1,31 @@ +enum CategoryType { + KITCHEN_AND_CULINARY + CONCESSIONS + FACILITIES + BARTENDING + SECURITY + EVENT_STAFF + MANAGEMENT + TECHNICAL + OTHER +} + +type VendorRate @table(name: "vendor_rates") { + id: UUID! @default(expr: "uuidV4()") + + vendorId: UUID! + vendor: Vendor! @ref(fields: "vendorId", references: "id") + + roleName: String + category: CategoryType + clientRate: Float + employeeWage: Float + markupPercentage: Float + vendorFeePercentage: Float + isActive: Boolean + notes: String + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String +} diff --git a/apps/web/dataconnect/schema/workforce.gql b/apps/web/dataconnect/schema/workforce.gql new file mode 100644 index 00000000..e00058ed --- /dev/null +++ b/apps/web/dataconnect/schema/workforce.gql @@ -0,0 +1,30 @@ +# enums cant start by a number, reason of W1099 +enum WorkforceEmploymentType { + W2 + W1099 + TEMPORARY + CONTRACT +} + +enum WorkforceStatus { + ACTIVE + INACTIVE +} + +type Workforce @table( name: "workforce") { + id: UUID! @default(expr: "uuidV4()") + + vendorId: UUID! + vendor: Vendor! @ref(fields: "vendorId", references: "id") + + staffId: UUID! + staff: Staff! @ref(fields: "staffId", references: "id") + + workforceNumber: String! + employmentType: WorkforceEmploymentType + status: WorkforceStatus @default(expr: "'ACTIVE'") + + createdAt: Timestamp @default(expr: "request.time") + updatedAt: Timestamp @default(expr: "request.time") + createdBy: String @default(expr: "auth.uid") +} \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index 81b2ab90..ebfd865e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,16 +10,19 @@ "preview": "vite preview" }, "dependencies": { + "@firebase/data-connect": "^0.3.12", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/themes": "^3.2.1", "@reduxjs/toolkit": "^2.11.2", "@tailwindcss/vite": "^4.1.18", + "@tanstack-query-firebase/react": "^2.0.0", "@tanstack/react-query": "^5.90.20", "axios": "^1.13.4", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", + "dataconnect-generated": "link:C:/Users/dell/AppData/Local/pnpm/store/5/node_modules/src/dataconnect-generated", "date-fns": "^4.1.0", "firebase": "^12.8.0", "framer-motion": "^12.29.2", diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml index 1dbaad0d..dc58a36e 100644 --- a/apps/web/pnpm-lock.yaml +++ b/apps/web/pnpm-lock.yaml @@ -4,10 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + dataconnect-generated: link:C:/Users/dell/AppData/Local/pnpm/store/5/node_modules/src/dataconnect-generated + importers: .: dependencies: + '@firebase/data-connect': + specifier: ^0.3.12 + version: 0.3.12(@firebase/app@0.14.7) '@radix-ui/react-label': specifier: ^2.1.7 version: 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -23,6 +29,9 @@ importers: '@tailwindcss/vite': specifier: ^4.1.18 version: 4.1.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)) + '@tanstack-query-firebase/react': + specifier: ^2.0.0 + version: 2.1.1(@tanstack/react-query@5.90.20(react@19.2.4))(firebase@12.8.0) '@tanstack/react-query': specifier: ^5.90.20 version: 5.90.20(react@19.2.4) @@ -38,6 +47,9 @@ importers: cmdk: specifier: ^1.1.1 version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + dataconnect-generated: + specifier: link:C:/Users/dell/AppData/Local/pnpm/store/5/node_modules/src/dataconnect-generated + version: link:C:/Users/dell/AppData/Local/pnpm/store/5/node_modules/src/dataconnect-generated date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -1688,6 +1700,12 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@tanstack-query-firebase/react@2.1.1': + resolution: {integrity: sha512-1hOEcfxLgorg0TwadBJeeEvoD7P4JMCJLhdO1doUQWZRs83WmwTlBJGv8GiO1y2KWaKjQh+JdgsuYCqG2dPXcA==} + peerDependencies: + '@tanstack/react-query': ^5 + firebase: ^11.3.0 || ^12.0.0 + '@tanstack/query-core@5.90.20': resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} @@ -4482,6 +4500,11 @@ snapshots: tailwindcss: 4.1.18 vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2) + '@tanstack-query-firebase/react@2.1.1(@tanstack/react-query@5.90.20(react@19.2.4))(firebase@12.8.0)': + dependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + firebase: 12.8.0 + '@tanstack/query-core@5.90.20': {} '@tanstack/react-query@5.90.20(react@19.2.4)': diff --git a/apps/web/pnpm-workspace.yaml b/apps/web/pnpm-workspace.yaml new file mode 100644 index 00000000..f7fbac2b --- /dev/null +++ b/apps/web/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +overrides: + dataconnect-generated: link:C:/Users/dell/AppData/Local/pnpm/store/5/node_modules/src/dataconnect-generated diff --git a/apps/web/src/features/auth/Login.tsx b/apps/web/src/features/auth/Login.tsx index 12544c06..a432a5a0 100644 --- a/apps/web/src/features/auth/Login.tsx +++ b/apps/web/src/features/auth/Login.tsx @@ -125,7 +125,7 @@ const Login: React.FC = () => { // Dispatch Redux action to handle login dispatch(loginUser({ email, password })); }; - + console.log(user); return (
{/* Left Side: Hero Image (Hidden on Mobile) */} @@ -280,32 +280,6 @@ const Login: React.FC = () => { )} - - {/* Helper for MVP Testing / Demo purposes */} -
-

- Quick Login (Development) -

-
- {[ - { label: "Admin", email: "admin@krow.com" }, - { label: "Client", email: "client@krow.com" }, - { label: "Vendor", email: "vendor@krow.com" }, - ].map((cred) => ( - - ))} -
-
diff --git a/apps/web/src/features/auth/authSlice.ts b/apps/web/src/features/auth/authSlice.ts index 0d525534..2f70f0dd 100644 --- a/apps/web/src/features/auth/authSlice.ts +++ b/apps/web/src/features/auth/authSlice.ts @@ -9,7 +9,7 @@ export interface AuthUser { email: string | null; displayName: string | null; photoURL: string | null; - userRole?: "admin" | "client" | "vendor"; + userRole?: "admin" | "client" | "vendor" | "ADMIN" | "CLIENT" | "VENDOR"; } interface AuthState { @@ -43,24 +43,26 @@ export const loginUser = createAsyncThunk( const firebaseUser = result.user as User; - // Fetch user role from Firestore - let userRole: "admin" | "client" | "vendor" = "client"; + // Fetch user role from backend (DataConnect) or fallback (Firestore) + let userRole: AuthUser['userRole'] = undefined; + if(userRole === undefined){ + userRole = "client"; // Default to 'client' if role is missing + } try { const userData = await fetchUserData(firebaseUser.uid); - if (userData) { - userRole = userData.userRole; + if (userData && userData.userRole) { + userRole = userData.userRole as AuthUser['userRole']; } } catch (error) { console.error("Failed to fetch user role:", error); - // Continue with default role on error + // Do not assign a frontend default — treat missing role as undefined } - return { uid: firebaseUser.uid, email: firebaseUser.email, displayName: firebaseUser.displayName, photoURL: firebaseUser.photoURL, - userRole: userRole, + userRole, }; } ); @@ -82,20 +84,22 @@ export const logoutUser = createAsyncThunk("auth/logoutUser", async (_, { reject * Async thunk to check if user is already logged in * Fetches user role from Firestore on app initialization */ -export const checkAuthStatus = createAsyncThunk("auth/checkAuthStatus", async (_, { rejectWithValue }) => { +export const checkAuthStatus = createAsyncThunk("auth/checkAuthStatus", async () => { const currentUser = getCurrentUser(); if (currentUser) { - // Fetch user role from Firestore - let userRole: "admin" | "client" | "vendor" = "client"; + // Fetch user role from backend (DataConnect) or fallback (Firestore) + let userRole: AuthUser['userRole'] = undefined; try { const userData = await fetchUserData(currentUser.uid); - if (userData) { - userRole = userData.userRole; + if (userData && userData.userRole) { + console.log("User data fetched during auth check:", userData); + userRole = userData.userRole as AuthUser['userRole']; + console.log("Fetched user role:", userRole); } } catch (error) { console.error("Failed to fetch user role:", error); - // Continue with default role on error + // Do not apply a frontend default role } return { @@ -103,7 +107,7 @@ export const checkAuthStatus = createAsyncThunk("auth/checkAuthStatus", async (_ email: currentUser.email, displayName: currentUser.displayName, photoURL: currentUser.photoURL, - userRole: userRole, + userRole, }; } diff --git a/apps/web/src/features/auth/firebase.ts b/apps/web/src/features/auth/firebase.ts index ad7ef043..3d4fea00 100644 --- a/apps/web/src/features/auth/firebase.ts +++ b/apps/web/src/features/auth/firebase.ts @@ -2,6 +2,8 @@ import { initializeApp } from "firebase/app"; import { getAnalytics } from "firebase/analytics"; import { getAuth } from "firebase/auth"; +import { getDataConnect } from "firebase/data-connect"; +import { connectorConfig } from "@/dataconnect-generated"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -17,7 +19,9 @@ const firebaseConfig = { measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID }; + // Initialize Firebase export const app = initializeApp(firebaseConfig); export const analytics = getAnalytics(app); +export const dataConnect = getDataConnect(app, connectorConfig); export const auth = getAuth(app); diff --git a/apps/web/src/features/layouts/ProtectedRoute.tsx b/apps/web/src/features/layouts/ProtectedRoute.tsx index 59af7b31..490bfe97 100644 --- a/apps/web/src/features/layouts/ProtectedRoute.tsx +++ b/apps/web/src/features/layouts/ProtectedRoute.tsx @@ -5,7 +5,7 @@ import type { RootState } from '../../store/store'; interface ProtectedRouteProps { children: React.ReactNode; - allowedRoles: Array<'admin' | 'client' | 'vendor'>; + allowedRoles: Array<'admin' | 'client' | 'vendor' | 'ADMIN' | 'CLIENT' | 'VENDOR'>; redirectTo?: string; } @@ -27,7 +27,11 @@ const ProtectedRoute: React.FC = ({ } // If user is authenticated but role is not allowed, redirect to specified path - if (user?.userRole && !allowedRoles.includes(user.userRole)) { + // Compare roles case-insensitively to handle backend casing (e.g., "ADMIN" vs "admin") + if ( + user?.userRole && + !allowedRoles.some((r) => r.toLowerCase() === user.userRole!.toLowerCase()) + ) { return ; } diff --git a/apps/web/src/features/workforce/directory/StaffList.tsx b/apps/web/src/features/workforce/directory/StaffList.tsx index 5e00b9bb..e039a7f7 100644 --- a/apps/web/src/features/workforce/directory/StaffList.tsx +++ b/apps/web/src/features/workforce/directory/StaffList.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useMemo } from "react"; +import { useState, useMemo} from "react"; import { Link } from "react-router-dom"; import { Button } from "../../../common/components/ui/button"; import { Card, CardContent } from "../../../common/components/ui/card"; @@ -6,11 +6,29 @@ import { Badge } from "../../../common/components/ui/badge"; import { UserPlus, Users, Star, ChevronLeft, ChevronRight, Search } from "lucide-react"; import { motion } from "framer-motion"; import DashboardLayout from "@/features/layouts/DashboardLayout"; -import { workforceService } from "@/services/workforceService"; -import type { Staff, User } from "../type"; +import { useListStaff, useGetStaffById } from "@/dataconnect-generated/react"; +import { dataConnect } from "@/features/auth/firebase"; +import { formatDistanceToNow } from "date-fns"; const ITEMS_PER_PAGE = 10; +function StaffActiveStatus({ staffId }: { staffId: string }) { + const { data: staffDetail, isLoading } = useGetStaffById(dataConnect, { id: staffId }); + + const getLastActiveText = (lastActive?: string) => { + if (!lastActive) return 'Never'; + try { + const date = new Date(lastActive); + return formatDistanceToNow(date, { addSuffix: true }); + } catch (e) { + return 'Invalid date'; + } + }; + + if (isLoading) return Loading...; + return {getLastActiveText(staffDetail?.staff?.updatedAt)}; +} + export default function StaffList() { const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); @@ -18,28 +36,11 @@ export default function StaffList() { const [ratingRange, setRatingRange] = useState<[number, number]>([0, 5]); const [currentPage, setCurrentPage] = useState(1); - const [user, setUser] = useState(null); - const [staff, setStaff] = useState([]); - const [isLoading, setIsLoading] = useState(true); + const { data: staffData, isLoading } = useListStaff(dataConnect); - console.log(user); - useEffect(() => { - const fetchData = async () => { - setIsLoading(true); - try { - const currentUser = await workforceService.auth.me(); - setUser(currentUser); - - const staffList = await workforceService.entities.Staff.list('-created_date'); - setStaff(staffList); - } catch (error) { - console.error("Failed to fetch data", error); - } finally { - setIsLoading(false); - } - }; - fetchData(); - }, []); + const staff = useMemo(() => { + return staffData?.staffs || []; + }, [staffData]); const allSkills = useMemo(() => { const skillSet = new Set(); @@ -54,10 +55,10 @@ export default function StaffList() { const filteredStaff = useMemo(() => { return staff.filter(member => { const matchesSearch = !searchTerm || - member.employee_name?.toLowerCase().includes(searchTerm.toLowerCase()) || + member.fullName?.toLowerCase().includes(searchTerm.toLowerCase()) || member.email?.toLowerCase().includes(searchTerm.toLowerCase()); - const matchesStatus = statusFilter === "all" || member.status?.toLowerCase() === statusFilter.toLowerCase(); + const matchesStatus = statusFilter === "all"; // status field is missing in current schema const matchesSkills = skillsFilter.length === 0 || (member.skills && skillsFilter.some(skill => member.skills?.includes(skill))); @@ -97,22 +98,6 @@ export default function StaffList() { } }; - const getLastActiveText = (lastActive?: string) => { - if (!lastActive) return 'Never'; - const date = new Date(lastActive); - const now = new Date(); - const diffMs = now.getTime() - date.getTime(); - const diffMins = Math.floor(diffMs / 60000); - const diffHours = Math.floor(diffMs / 3600000); - const diffDays = Math.floor(diffMs / 86400000); - - if (diffMins < 1) return 'Just now'; - if (diffMins < 60) return `${diffMins}m ago`; - if (diffHours < 24) return `${diffHours}h ago`; - if (diffDays < 7) return `${diffDays}d ago`; - return date.toLocaleDateString(); - }; - return (
-
+
- {ratingRange[0].toFixed(1)} - {ratingRange[1].toFixed(1)}
@@ -306,21 +290,21 @@ export default function StaffList() { > - {member.employee_name || 'N/A'} + {member.fullName || 'N/A'}
- {member.photo ? ( - {member.employee_name} + {member.photoUrl ? ( + {member.fullName} ) : ( - member.employee_name?.charAt(0) || '?' + member.fullName?.charAt(0) || '?' )}
- - {member.status || 'Active'} + + Active @@ -348,9 +332,9 @@ export default function StaffList() { - {getLastActiveText(member.last_active)} + - + ))} diff --git a/apps/web/src/routes.tsx b/apps/web/src/routes.tsx index f1ceebee..536f8a59 100644 --- a/apps/web/src/routes.tsx +++ b/apps/web/src/routes.tsx @@ -49,7 +49,7 @@ const AppRoutes: React.FC = () => { element={ @@ -71,7 +71,7 @@ const AppRoutes: React.FC = () => { element={ diff --git a/apps/web/src/services/firestoreService.ts b/apps/web/src/services/firestoreService.ts index 07306ec6..6b4c8199 100644 --- a/apps/web/src/services/firestoreService.ts +++ b/apps/web/src/services/firestoreService.ts @@ -1,23 +1,46 @@ import { getFirestore, doc, getDoc } from "firebase/firestore"; import { app } from "../features/auth/firebase"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - generated dataconnect types may not be resolvable in this context +import { getUserById } from "@/dataconnect-generated"; export interface UserData { id: string; email: string; fullName?: string; - userRole: "admin" | "client" | "vendor"; + // role may come back uppercase or lowercase from the backend; treat as optional + userRole?: "admin" | "client" | "vendor" | "ADMIN" | "CLIENT" | "VENDOR"; photoURL?: string; } const db = getFirestore(app); /** - * Fetch user data from Firestore including their role + * Fetch user data from DataConnect (fallback to Firestore if needed) * @param uid - Firebase User UID * @returns UserData object with role information */ export const fetchUserData = async (uid: string): Promise => { try { + // Prefer backend dataconnect query for authoritative user role + const { data } = await getUserById({ id: uid }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const dataAny = data as any; + + if (dataAny && dataAny.user) { + const user = dataAny.user; + + return { + id: uid, + email: user.email || "", + fullName: user.fullName, + userRole: user.userRole, + photoURL: user.photoUrl || user.photoURL, + }; + } + + // Fallback: attempt Firestore lookup if dataconnect didn't return a user const userDocRef = doc(db, "users", uid); const userDocSnap = await getDoc(userDocRef); @@ -27,14 +50,14 @@ export const fetchUserData = async (uid: string): Promise => { id: uid, email: data.email || "", fullName: data.fullName, - userRole: data.userRole || "client", + userRole: data.userRole, // no frontend defaulting photoURL: data.photoURL, }; } return null; } catch (error) { - console.error("Error fetching user data from Firestore:", error); + console.error("Error fetching user data from DataConnect/Firestore:", error); throw error; } }; diff --git a/backend/dataconnect/dataconnect.yaml b/backend/dataconnect/dataconnect.yaml index 39e01fdb..70471213 100644 --- a/backend/dataconnect/dataconnect.yaml +++ b/backend/dataconnect/dataconnect.yaml @@ -10,4 +10,4 @@ schema: instanceId: "krow-sql" # schemaValidation: "STRICT" # STRICT mode makes Postgres schema match Data Connect exactly. # schemaValidation: "COMPATIBLE" # COMPATIBLE mode makes Postgres schema compatible with Data Connect. -connectorDirs: ["./connector"] +connectorDirs: ["./example"] diff --git a/backend/dataconnect/example/account/mutations.gql b/backend/dataconnect/example/account/mutations.gql new file mode 100644 index 00000000..d8d55df4 --- /dev/null +++ b/backend/dataconnect/example/account/mutations.gql @@ -0,0 +1,51 @@ +mutation createAccount( + $bank: String! + $type: AccountType! + $last4: String! + $isPrimary: Boolean + $ownerId: UUID! + $accountNumber: String + $routeNumber: String + $expiryTime: Timestamp +) @auth(level: USER) { + account_insert( + data: { + bank: $bank + type: $type + last4: $last4 + isPrimary: $isPrimary + ownerId: $ownerId + accountNumber: $accountNumber + routeNumber: $routeNumber + expiryTime: $expiryTime + } + ) +} + +mutation updateAccount( + $id: UUID! + $bank: String + $type: AccountType + $last4: String + $isPrimary: Boolean + $accountNumber: String + $routeNumber: String + $expiryTime: Timestamp +) @auth(level: USER) { + account_update( + id: $id + data: { + bank: $bank + type: $type + last4: $last4 + isPrimary: $isPrimary + accountNumber: $accountNumber + routeNumber: $routeNumber + expiryTime: $expiryTime + } + ) +} + +mutation deleteAccount($id: UUID!) @auth(level: USER) { + account_delete(id: $id) +} diff --git a/backend/dataconnect/example/account/queries.gql b/backend/dataconnect/example/account/queries.gql new file mode 100644 index 00000000..672211b6 --- /dev/null +++ b/backend/dataconnect/example/account/queries.gql @@ -0,0 +1,70 @@ +query listAccounts @auth(level: USER) { + accounts { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query getAccountById($id: UUID!) @auth(level: USER) { + account(id: $id) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query getAccountsByOwnerId($ownerId: UUID!) @auth(level: USER) { + accounts(where: { ownerId: { eq: $ownerId } }) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + routeNumber + expiryTime + createdAt + } +} + +query filterAccounts( + $bank: String + $type: AccountType + $isPrimary: Boolean + $ownerId: UUID +) @auth(level: USER) { + accounts( + where: { + bank: { eq: $bank } + type: { eq: $type } + isPrimary: { eq: $isPrimary } + ownerId: { eq: $ownerId } + } + ) { + id + bank + type + last4 + isPrimary + ownerId + accountNumber + expiryTime + routeNumber + } +} diff --git a/backend/dataconnect/example/activityLog/mutations.gql b/backend/dataconnect/example/activityLog/mutations.gql new file mode 100644 index 00000000..772cac1d --- /dev/null +++ b/backend/dataconnect/example/activityLog/mutations.gql @@ -0,0 +1,96 @@ +mutation createActivityLog( + $userId: String! + + $date: Timestamp! + $hourStart: String + $hourEnd: String + $totalhours: String + $iconType: ActivityIconType + $iconColor: String + + $title: String! + $description: String! + $isRead: Boolean + $activityType: ActivityType! +) @auth(level: USER) { + activityLog_insert( + data: { + userId: $userId + + date: $date + hourStart: $hourStart + hourEnd: $hourEnd + totalhours: $totalhours + iconType: $iconType + iconColor: $iconColor + + title: $title + description: $description + isRead: $isRead + activityType: $activityType + } + ) +} + +mutation updateActivityLog( + $id: UUID! + + $userId: String + + $date: Timestamp + $hourStart: String + $hourEnd: String + $totalhours: String + $iconType: ActivityIconType + $iconColor: String + + $title: String + $description: String + $isRead: Boolean + $activityType: ActivityType +) @auth(level: USER) { + activityLog_update( + id: $id + data: { + userId: $userId + + date: $date + hourStart: $hourStart + hourEnd: $hourEnd + totalhours: $totalhours + iconType: $iconType + iconColor: $iconColor + + title: $title + description: $description + isRead: $isRead + activityType: $activityType + } + ) +} + +# ---------------------------------------------------------- +# MARK AS READ (single) +# ---------------------------------------------------------- +mutation markActivityLogAsRead($id: UUID!) @auth(level: USER) { + activityLog_update( + id: $id + data: { isRead: true } + ) +} + +# ---------------------------------------------------------- +# MARK MANY AS READ (correct op name in your DC) +# ---------------------------------------------------------- +mutation markActivityLogsAsRead( + $ids: [UUID!]! +) @auth(level: USER) { + activityLog_updateMany( + where: { id: { in: $ids } } + data: { isRead: true } + ) +} + +mutation deleteActivityLog($id: UUID!) @auth(level: USER) { + activityLog_delete(id: $id) +} diff --git a/backend/dataconnect/example/activityLog/queries.gql b/backend/dataconnect/example/activityLog/queries.gql new file mode 100644 index 00000000..f0267068 --- /dev/null +++ b/backend/dataconnect/example/activityLog/queries.gql @@ -0,0 +1,175 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listActivityLogs( + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs(offset: $offset, limit: $limit) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getActivityLogById($id: UUID!) @auth(level: USER) { + activityLog(id: $id) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# LIST BY USER +# ---------------------------------------------------------- +query listActivityLogsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { userId: { eq: $userId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# LIST UNREAD BY USER (common for notifications UI) +# ---------------------------------------------------------- +query listUnreadActivityLogsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { + userId: { eq: $userId } + isRead: { eq: false } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} + +# ---------------------------------------------------------- +# FILTER (user + date range + read status + type) +# NOTE: Timestamp filter uses ge/le (NOT gte/lte) +# ---------------------------------------------------------- +query filterActivityLogs( + $userId: String + $dateFrom: Timestamp + $dateTo: Timestamp + $isRead: Boolean + $activityType: ActivityType + $iconType: ActivityIconType + $offset: Int + $limit: Int +) @auth(level: USER) { + activityLogs( + where: { + userId: { eq: $userId } + date: { ge: $dateFrom, le: $dateTo } + isRead: { eq: $isRead } + activityType: { eq: $activityType } + iconType: { eq: $iconType } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + userId + + date + hourStart + hourEnd + totalhours + iconType + iconColor + + title + description + isRead + activityType + + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/application/mutations.gql b/backend/dataconnect/example/application/mutations.gql new file mode 100644 index 00000000..c978383d --- /dev/null +++ b/backend/dataconnect/example/application/mutations.gql @@ -0,0 +1,47 @@ +mutation createApplication( + $shiftId: UUID! + $staffId: UUID! + $status: ApplicationStatus! + $checkInTime: Timestamp + $checkOutTime: Timestamp + $origin: ApplicationOrigin! + $roleId: UUID! +) @auth(level: USER) { + application_insert( + data: { + shiftId: $shiftId + staffId: $staffId + status: $status + checkInTime: $checkInTime + checkOutTime: $checkOutTime + origin: $origin + roleId: $roleId + } + ) +} + +mutation updateApplicationStatus( + $id: UUID! + $shiftId: UUID + $staffId: UUID + $status: ApplicationStatus + $checkInTime: Timestamp + $checkOutTime: Timestamp + $roleId: UUID! +) @auth(level: USER) { + application_update( + id: $id + data: { + shiftId: $shiftId + staffId: $staffId + status: $status + checkInTime: $checkInTime + checkOutTime: $checkOutTime + roleId: $roleId + } + ) +} + +mutation deleteApplication($id: UUID!) @auth(level: USER) { + application_delete(id: $id) +} diff --git a/backend/dataconnect/example/application/queries.gql b/backend/dataconnect/example/application/queries.gql new file mode 100644 index 00000000..759a32c6 --- /dev/null +++ b/backend/dataconnect/example/application/queries.gql @@ -0,0 +1,452 @@ +query listApplications @auth(level: USER) { + applications { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + business { + id + businessName + email + contactName + companyLogoUrl + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +#shifts in staff app +query getApplicationById($id: UUID!) @auth(level: USER) { + application(id: $id) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + business { + id + businessName + email + contactName + companyLogoUrl + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +query getApplicationsByShiftId($shiftId: UUID!) @auth(level: USER) { + applications(where: { shiftId: { eq: $shiftId } }) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + + } +} + +query getApplicationsByShiftIdAndStatus( + $shiftId: UUID! + $status: ApplicationStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + shiftId: { eq: $shiftId } + status: { eq: $status } + } + offset: $offset + limit: $limit + ) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + business { + id + businessName + email + contactName + } + vendor { + id + companyName + } + } + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + } +} + +query getApplicationsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int + $dayStart: Timestamp + $dayEnd: Timestamp +) @auth(level: USER) { + applications( + where: { + staffId: { eq: $staffId } + shift: { + date: { ge: $dayStart, le: $dayEnd } + } + + } + offset: $offset + limit: $limit + ) { + id + shiftId + staffId + status + appliedAt + checkInTime + checkOutTime + origin + createdAt + + shift { + id + title + date + startTime + endTime + location + status + + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + business { + id + businessName + email + contactName + companyLogoUrl + } + vendor { + id + companyName + } + } + + } + + shiftRole { + id + roleId + count + assigned + startTime + endTime + hours + totalValue + role { + id + name + costPerHour + } + } + + } +} + +#getting staffs of an shiftrole ACCEPTED for orders view client +query listAcceptedApplicationsByShiftRoleKey( + $shiftId: UUID! + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + shiftId: { eq: $shiftId } + roleId: { eq: $roleId } + status: { eq: ACCEPTED } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + checkInTime + checkOutTime + staff { id fullName email phone photoUrl } + } +} + +#getting staffs of an shiftrole ACCEPTED for orders of the day view client +query listAcceptedApplicationsByBusinessForDay( + $businessId: UUID! + $dayStart: Timestamp! + $dayEnd: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + #status: { eq: ACCEPTED } + status: { in: [ACCEPTED, CONFIRMED, CHECKED_IN, CHECKED_OUT, LATE] } + shift: { + date: { ge: $dayStart, le: $dayEnd } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + shiftId + roleId + checkInTime + checkOutTime + appliedAt + staff { id fullName email phone photoUrl averageRating } + } +} + +#coverage list and today live +query listStaffsApplicationsByBusinessForDay( + $businessId: UUID! + $dayStart: Timestamp! + $dayEnd: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + applications( + where: { + status: {in: [ACCEPTED, CONFIRMED, CHECKED_IN, CHECKED_OUT, LATE]} + shift: { + date: { ge: $dayStart, le: $dayEnd } + order: { businessId: { eq: $businessId } } + #status: { eq: ACCEPTED } + } + } + offset: $offset + limit: $limit + orderBy: { appliedAt: ASC } + ) { + id + shiftId + roleId + checkInTime + checkOutTime + appliedAt + status + + shiftRole{ + shift{ + location + cost + } + count + assigned + hours + + role{ + name + } + } + staff { id fullName email phone photoUrl } + } +} diff --git a/backend/dataconnect/example/assignment/mutations.gql b/backend/dataconnect/example/assignment/mutations.gql new file mode 100644 index 00000000..69a14289 --- /dev/null +++ b/backend/dataconnect/example/assignment/mutations.gql @@ -0,0 +1,71 @@ +mutation CreateAssignment( + $workforceId: UUID! + $title: String + $description: String + $instructions: String + $status: AssignmentStatus + $tipsAvailable: Boolean + $travelTime: Boolean + $mealProvided: Boolean + $parkingAvailable: Boolean + $gasCompensation: Boolean + $managers: [Any!] + $roleId: UUID! + $shiftId: UUID! +) @auth(level: USER) { + assignment_insert( + data: { + workforceId: $workforceId + title: $title + description: $description + instructions: $instructions + status: $status + tipsAvailable: $tipsAvailable + travelTime: $travelTime + mealProvided: $mealProvided + parkingAvailable: $parkingAvailable + gasCompensation: $gasCompensation + managers: $managers + roleId: $roleId + shiftId: $shiftId + } + ) +} + +mutation UpdateAssignment( + $id: UUID! + $title: String + $description: String + $instructions: String + $status: AssignmentStatus + $tipsAvailable: Boolean + $travelTime: Boolean + $mealProvided: Boolean + $parkingAvailable: Boolean + $gasCompensation: Boolean + $managers: [Any!] + $roleId: UUID! + $shiftId: UUID! +) @auth(level: USER) { + assignment_update( + id: $id + data: { + title: $title + description: $description + instructions: $instructions + status: $status + tipsAvailable: $tipsAvailable + travelTime: $travelTime + mealProvided: $mealProvided + parkingAvailable: $parkingAvailable + gasCompensation: $gasCompensation + managers: $managers + roleId: $roleId + shiftId: $shiftId + } + ) +} + +mutation DeleteAssignment($id: UUID!) @auth(level: USER) { + assignment_delete(id: $id) +} diff --git a/backend/dataconnect/example/assignment/queries.gql b/backend/dataconnect/example/assignment/queries.gql new file mode 100644 index 00000000..c65a8559 --- /dev/null +++ b/backend/dataconnect/example/assignment/queries.gql @@ -0,0 +1,278 @@ +# ------------------------------------------------------------ +# LIST ALL ASSIGNMENTS (admin/debug) +# ------------------------------------------------------------ +query listAssignments( + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments(offset: $offset, limit: $limit) { + id + title + status + createdAt + + workforce { + id + workforceNumber + staff { id fullName } + } + + shiftRole { + id + count + assigned + startTime + endTime + hours + totalValue + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + latitude + longitude + status + + order { + id + eventName + business { id businessName email contactName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# GET ASSIGNMENT BY ID +# ------------------------------------------------------------ +query getAssignmentById($id: UUID!) @auth(level: USER) { + assignment(id: $id) { + id + title + description + instructions + status + tipsAvailable + travelTime + mealProvided + parkingAvailable + gasCompensation + managers + createdAt + updatedAt + createdBy + + workforce { + id + workforceNumber + status + staff { id fullName } + } + + shiftRole { + id + startTime + endTime + hours + totalValue + breakType + uniform + department + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + latitude + longitude + status + managers + + order { + id + eventName + orderType + business { id businessName email contactName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# MY ASSIGNMENTS (by workforceId) - Staff view +# ------------------------------------------------------------ +query listAssignmentsByWorkforceId( + $workforceId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { workforceId: { eq: $workforceId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + title + status + createdAt + + workforce { + id + workforceNumber + staff { id fullName } + } + + shiftRole { + id + startTime + endTime + hours + totalValue + role { id name costPerHour } + + shift { + id + title + date + location + status + + order { + id + eventName + business { id businessName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# ASSIGNMENTS FOR A VENDOR (Vendor dashboard) +# Approach: filter by workforce.vendorId (relation) +# If Data Connect can't filter nested, use 2-step: +# 1) listWorkforceByVendorId => workforce ids +# 2) assignments(where: { workforceId: { in: [...] } }) +# ------------------------------------------------------------ +query listAssignmentsByWorkforceIds( + $workforceIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { workforceId: { in: $workforceIds } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + title + status + createdAt + + workforce { id workforceNumber staff { id fullName } } + + shiftRole { + id + role { id name } + shift { + id + title + date + order { + id + eventName + business { id businessName } + vendor { id companyName } + } + } + } + } +} + +# ------------------------------------------------------------ +# ASSIGNMENTS BY SHIFT ROLE (useful for staffing) +# ------------------------------------------------------------ +query listAssignmentsByShiftRole( + $shiftId: UUID! + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { + shiftId: { eq: $shiftId } + roleId: { eq: $roleId } + } + offset: $offset + limit: $limit + ) { + id + title + status + createdAt + workforce { id workforceNumber staff { id fullName } } + } +} + +# ------------------------------------------------------------ + +# FILTER ASSIGNMENTS (status + date range) +# Date range is based on Shift.date through the relation (NOT filterable directly). +# +# Since ShiftRole uses a composite key (shiftId + roleId), +# Assignments must be filtered using BOTH fields. +# +# So the filtering flow is: +# 1) Get Shifts in the date range => shiftIds +# 2) Get ShiftRoles where shiftId IN shiftIds => (shiftId, roleId) pairs +# 3) Get Assignments where: +# - shiftId matches +# - roleId matches +# - status matches (optional) +# +# This query represents step 3. +# ------------------------------------------------------------ +query filterAssignments( + $shiftIds: [UUID!]! + $roleIds: [UUID!]! + $status: AssignmentStatus + $offset: Int + $limit: Int +) @auth(level: USER) { + assignments( + where: { + shiftId: { in: $shiftIds } + roleId: { in: $roleIds } + status: { eq: $status } + } + offset: $offset + limit: $limit + ) { + id + title + status + createdAt + + workforce { id workforceNumber staff { id fullName } } + + shiftRole { + id + role { id name } + shift { id title date location status } + } + } +} diff --git a/backend/dataconnect/example/attireOption/mutations.gql b/backend/dataconnect/example/attireOption/mutations.gql new file mode 100644 index 00000000..59f4f7f9 --- /dev/null +++ b/backend/dataconnect/example/attireOption/mutations.gql @@ -0,0 +1,45 @@ +mutation createAttireOption( + $itemId: String! + $label: String! + $icon: String + $imageUrl: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOption_insert( + data: { + itemId: $itemId + label: $label + icon: $icon + imageUrl: $imageUrl + isMandatory: $isMandatory + vendorId: $vendorId + } + ) +} + +mutation updateAttireOption( + $id: UUID! + $itemId: String + $label: String + $icon: String + $imageUrl: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOption_update( + id: $id + data: { + itemId: $itemId + label: $label + icon: $icon + imageUrl: $imageUrl + isMandatory: $isMandatory + vendorId: $vendorId + } + ) +} + +mutation deleteAttireOption($id: UUID!) @auth(level: USER) { + attireOption_delete(id: $id) +} diff --git a/backend/dataconnect/example/attireOption/queries.gql b/backend/dataconnect/example/attireOption/queries.gql new file mode 100644 index 00000000..76ce2817 --- /dev/null +++ b/backend/dataconnect/example/attireOption/queries.gql @@ -0,0 +1,47 @@ +query listAttireOptions @auth(level: USER) { + attireOptions { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + createdAt + } +} + +query getAttireOptionById($id: UUID!) @auth(level: USER) { + attireOption(id: $id) { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + createdAt + } +} + +query filterAttireOptions( + $itemId: String + $isMandatory: Boolean + $vendorId: UUID +) @auth(level: USER) { + attireOptions( + where: { + itemId: { eq: $itemId } + isMandatory: { eq: $isMandatory } + vendorId: { eq: $vendorId } + } + ) { + id + itemId + label + icon + imageUrl + isMandatory + vendorId + } +} diff --git a/backend/dataconnect/example/benefitsData/mutations.gql b/backend/dataconnect/example/benefitsData/mutations.gql new file mode 100644 index 00000000..bd554b01 --- /dev/null +++ b/backend/dataconnect/example/benefitsData/mutations.gql @@ -0,0 +1,36 @@ + +mutation createBenefitsData( + $vendorBenefitPlanId: UUID! + $staffId: UUID! + $current: Int! +) @auth(level: USER) { + benefitsData_insert( + data: { + vendorBenefitPlanId: $vendorBenefitPlanId + staffId: $staffId + current: $current + } + ) +} + +mutation updateBenefitsData( + $staffId: UUID! + $vendorBenefitPlanId: UUID! + $current: Int +) @auth(level: USER) { + benefitsData_update( + key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId } + data: { + current: $current + } + ) +} + +mutation deleteBenefitsData( + $staffId: UUID! + $vendorBenefitPlanId: UUID! +) @auth(level: USER) { + benefitsData_delete( + key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId } + ) +} diff --git a/backend/dataconnect/example/benefitsData/queries.gql b/backend/dataconnect/example/benefitsData/queries.gql new file mode 100644 index 00000000..2bc60a37 --- /dev/null +++ b/backend/dataconnect/example/benefitsData/queries.gql @@ -0,0 +1,165 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listBenefitsData( + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas(offset: $offset, limit: $limit) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (staffId + vendorBenefitPlanId) ✅ (replaces getById in practice) +# ---------------------------------------------------------- +query getBenefitsDataByKey( + $staffId: UUID! + $vendorBenefitPlanId: UUID! +) @auth(level: USER) { + benefitsData(key: { staffId: $staffId, vendorBenefitPlanId: $vendorBenefitPlanId }) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY STAFF +# ---------------------------------------------------------- +query listBenefitsDataByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR BENEFIT PLAN +# ---------------------------------------------------------- +query listBenefitsDataByVendorBenefitPlanId( + $vendorBenefitPlanId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { vendorBenefitPlanId: { eq: $vendorBenefitPlanId } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR (2-step helper: planIds -> benefitsDatas IN) +# ---------------------------------------------------------- +query listBenefitsDataByVendorBenefitPlanIds( + $vendorBenefitPlanIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + benefitsDatas( + where: { vendorBenefitPlanId: { in: $vendorBenefitPlanIds } } + offset: $offset + limit: $limit + ) { + id + vendorBenefitPlanId + current + staffId + + staff { + id + fullName + } + + vendorBenefitPlan { + id + vendorId + title + description + requestLabel + total + isActive + } + } +} diff --git a/backend/dataconnect/example/business/mutations.gql b/backend/dataconnect/example/business/mutations.gql new file mode 100644 index 00000000..437527d6 --- /dev/null +++ b/backend/dataconnect/example/business/mutations.gql @@ -0,0 +1,75 @@ +mutation createBusiness( + $businessName: String!, + $contactName: String, + $userId: String!, + $companyLogoUrl: String, + $phone: String, + $email: String, + $hubBuilding: String, + $address: String, + $city: String, + $area: BusinessArea, + $sector: BusinessSector, + $rateGroup: BusinessRateGroup!, + $status: BusinessStatus!, + $notes: String +) @auth(level: USER) { + business_insert( + data: { + businessName: $businessName, + contactName: $contactName, + userId: $userId, + companyLogoUrl: $companyLogoUrl, + phone: $phone, + email: $email, + hubBuilding: $hubBuilding, + address: $address, + city: $city, + area: $area, + sector: $sector, + rateGroup: $rateGroup, + status: $status, + notes: $notes + } + ) +} + +mutation updateBusiness( + $id: UUID!, + $businessName: String, + $contactName: String, + $companyLogoUrl: String, + $phone: String, + $email: String, + $hubBuilding: String, + $address: String, + $city: String, + $area: BusinessArea, + $sector: BusinessSector, + $rateGroup: BusinessRateGroup, + $status: BusinessStatus, + $notes: String +) @auth(level: USER) { + business_update( + id: $id, + data: { + businessName: $businessName, + contactName: $contactName, + companyLogoUrl: $companyLogoUrl, + phone: $phone, + email: $email, + hubBuilding: $hubBuilding, + address: $address, + city: $city, + area: $area, + sector: $sector, + rateGroup: $rateGroup, + status: $status, + notes: $notes + } + ) +} + +mutation deleteBusiness($id: UUID!) @auth(level: USER) { + business_delete(id: $id) +} \ No newline at end of file diff --git a/backend/dataconnect/example/business/queries.gql b/backend/dataconnect/example/business/queries.gql new file mode 100644 index 00000000..8484fce0 --- /dev/null +++ b/backend/dataconnect/example/business/queries.gql @@ -0,0 +1,65 @@ +query listBusinesses @auth(level: USER) { + businesses { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} + +query getBusinessesByUserId($userId: String!) @auth(level: USER) { + businesses(where: { userId: { eq: $userId } }) { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} + +query getBusinessById($id: UUID!) @auth(level: USER) { + business(id: $id) { + id + businessName + contactName + userId + companyLogoUrl + phone + email + hubBuilding + address + city + area + sector + rateGroup + status + notes + createdAt + updatedAt + } +} \ No newline at end of file diff --git a/backend/dataconnect/example/category/mutations.gql b/backend/dataconnect/example/category/mutations.gql new file mode 100644 index 00000000..f143f01f --- /dev/null +++ b/backend/dataconnect/example/category/mutations.gql @@ -0,0 +1,34 @@ +mutation createCategory( + $categoryId: String! + $label: String! + $icon: String +) @auth(level: USER) { + category_insert( + data: { + categoryId: $categoryId + label: $label + icon: $icon + } + ) +} + +mutation updateCategory( + $id: UUID! + $categoryId: String + $label: String + $icon: String +) @auth(level: USER) { + category_update( + id: $id + data: { + categoryId: $categoryId + label: $label + icon: $icon + } + ) +} + + +mutation deleteCategory($id: UUID!) @auth(level: USER) { + category_delete(id: $id) +} diff --git a/backend/dataconnect/example/category/queries.gql b/backend/dataconnect/example/category/queries.gql new file mode 100644 index 00000000..3a4b2d02 --- /dev/null +++ b/backend/dataconnect/example/category/queries.gql @@ -0,0 +1,43 @@ +query listCategories @auth(level: USER) { + categories { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} + +query getCategoryById($id: UUID!) @auth(level: USER) { + category(id: $id) { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} + +query filterCategories( + $categoryId: String + $label: String +) @auth(level: USER) { + categories( + where: { + categoryId: { eq: $categoryId } + label: { eq: $label } + } + ) { + id + categoryId + label + icon + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/certificate/mutations.gql b/backend/dataconnect/example/certificate/mutations.gql new file mode 100644 index 00000000..6fc8128a --- /dev/null +++ b/backend/dataconnect/example/certificate/mutations.gql @@ -0,0 +1,65 @@ +mutation CreateCertificate( + $name: String! + $description: String + $expiry: Timestamp + $status: CertificateStatus! + $fileUrl: String + $icon: String + $certificationType: ComplianceType + $issuer: String + $staffId: UUID! + $validationStatus: ValidationStatus + $certificateNumber: String +) @auth(level: USER) { + certificate_insert( + data: { + name: $name + description: $description + expiry: $expiry + status: $status + fileUrl: $fileUrl + icon: $icon + staffId: $staffId + certificationType: $certificationType + issuer: $issuer + validationStatus: $validationStatus + certificateNumber: $certificateNumber + } + ) +} + +mutation UpdateCertificate( + $id: UUID! + $name: String + $description: String + $expiry: Timestamp + $status: CertificateStatus + $fileUrl: String + $icon: String + $staffId: UUID + $certificationType: ComplianceType + $issuer: String + $validationStatus: ValidationStatus + $certificateNumber: String +) @auth(level: USER) { + certificate_update( + id: $id + data: { + name: $name + description: $description + expiry: $expiry + status: $status + fileUrl: $fileUrl + icon: $icon + staffId: $staffId + certificationType: $certificationType + issuer: $issuer + validationStatus: $validationStatus + certificateNumber: $certificateNumber + } + ) +} + +mutation DeleteCertificate($id: UUID!) @auth(level: USER) { + certificate_delete(id: $id) +} diff --git a/backend/dataconnect/example/certificate/queries.gql b/backend/dataconnect/example/certificate/queries.gql new file mode 100644 index 00000000..f154e34b --- /dev/null +++ b/backend/dataconnect/example/certificate/queries.gql @@ -0,0 +1,72 @@ +query listCertificates @auth(level: USER) { + certificates { + id + name + description + expiry + status + fileUrl + icon + staffId + certificationType + issuer + validationStatus + certificateNumber + createdAt + + staff { + id + fullName + } + + } +} + +query getCertificateById($id: UUID!) @auth(level: USER) { + certificate(id: $id) { + id + name + description + expiry + status + fileUrl + icon + certificationType + issuer + staffId + validationStatus + certificateNumber + updatedAt + + staff { + id + fullName + } + + } +} + +query listCertificatesByStaffId($staffId: UUID!) @auth(level: USER) { + certificates(where: { staffId: { eq: $staffId } }) { + id + name + description + expiry + status + fileUrl + icon + staffId + certificationType + issuer + validationStatus + certificateNumber + createdAt + + staff { + id + fullName + } + + } +} + diff --git a/backend/dataconnect/example/clientFeedback/mutations.gql b/backend/dataconnect/example/clientFeedback/mutations.gql new file mode 100644 index 00000000..c9c2e63b --- /dev/null +++ b/backend/dataconnect/example/clientFeedback/mutations.gql @@ -0,0 +1,43 @@ +mutation createClientFeedback( + $businessId: UUID! + $vendorId: UUID! + $rating: Int + $comment: String + $date: Timestamp + $createdBy: String +) @auth(level: USER) { + clientFeedback_insert( + data: { + businessId: $businessId + vendorId: $vendorId + rating: $rating + comment: $comment + date: $date + } + ) +} + +mutation updateClientFeedback( + $id: UUID! + $businessId: UUID + $vendorId: UUID + $rating: Int + $comment: String + $date: Timestamp + $createdBy: String +) @auth(level: USER) { + clientFeedback_update( + id: $id + data: { + businessId: $businessId + vendorId: $vendorId + rating: $rating + comment: $comment + date: $date + } + ) +} + +mutation deleteClientFeedback($id: UUID!) @auth(level: USER) { + clientFeedback_delete(id: $id) +} diff --git a/backend/dataconnect/example/clientFeedback/queries.gql b/backend/dataconnect/example/clientFeedback/queries.gql new file mode 100644 index 00000000..9a8702ba --- /dev/null +++ b/backend/dataconnect/example/clientFeedback/queries.gql @@ -0,0 +1,185 @@ +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listClientFeedbacks( + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks(offset: $offset, limit: $limit) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getClientFeedbackById($id: UUID!) @auth(level: USER) { + clientFeedback(id: $id) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS +# ---------------------------------------------------------- +query listClientFeedbacksByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR +# ---------------------------------------------------------- +query listClientFeedbacksByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS + VENDOR (pair) +# ---------------------------------------------------------- +query listClientFeedbacksByBusinessAndVendor( + $businessId: UUID! + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { + businessId: { eq: $businessId } + vendorId: { eq: $vendorId } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + createdAt + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# FILTER (rating + date range) +# NOTE: using Timestamp ops: ge/le +# ---------------------------------------------------------- +query filterClientFeedbacks( + $businessId: UUID + $vendorId: UUID + $ratingMin: Int + $ratingMax: Int + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + clientFeedbacks( + where: { + businessId: { eq: $businessId } + vendorId: { eq: $vendorId } + rating: { ge: $ratingMin, le: $ratingMax } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + orderBy: { date: DESC } + ) { + id + businessId + vendorId + rating + comment + date + + business { id businessName } + vendor { id companyName } + } +} + +# ---------------------------------------------------------- +# QUICK KPI: average rating for a vendor (client-side aggregate) +# You fetch rows; Flutter/web computes avg. +# ---------------------------------------------------------- +query listClientFeedbackRatingsByVendorId( + $vendorId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp +) @auth(level: USER) { + clientFeedbacks( + where: { + vendorId: { eq: $vendorId } + date: { ge: $dateFrom, le: $dateTo } + } + orderBy: { date: DESC } + ) { + id + rating + comment + date + business { id businessName } + vendor { id companyName } + } +} diff --git a/backend/dataconnect/example/connector.yaml b/backend/dataconnect/example/connector.yaml new file mode 100644 index 00000000..57f5f975 --- /dev/null +++ b/backend/dataconnect/example/connector.yaml @@ -0,0 +1,8 @@ +connectorId: example +generate: + javascriptSdk: + - outputDir: ..\..\..\apps\web\src\dataconnect-generated + package: "@dataconnect/generated" + packageJsonDir: ..\..\..\apps\web + react: true + angular: false diff --git a/backend/dataconnect/example/conversation/mutations.gql b/backend/dataconnect/example/conversation/mutations.gql new file mode 100644 index 00000000..304aa37f --- /dev/null +++ b/backend/dataconnect/example/conversation/mutations.gql @@ -0,0 +1,69 @@ + +mutation createConversation( + $subject: String + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $groupName: String + $lastMessage: String + $lastMessageAt: Timestamp +) @auth(level: USER) { + conversation_insert( + data: { + subject: $subject + status: $status + conversationType: $conversationType + isGroup: $isGroup + groupName: $groupName + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +mutation updateConversation( + $id: UUID! + + $subject: String + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $groupName: String + $lastMessage: String + $lastMessageAt: Timestamp + +) @auth(level: USER) { + conversation_update( + id: $id + data: { + subject: $subject + status: $status + conversationType: $conversationType + isGroup: $isGroup + groupName: $groupName + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +# ---------------------------------------------------------- +# UPDATE LAST MESSAGE +# ---------------------------------------------------------- +mutation updateConversationLastMessage( + $id: UUID! + $lastMessage: String + $lastMessageAt: Timestamp +) @auth(level: USER) { + conversation_update( + id: $id + data: { + lastMessage: $lastMessage + lastMessageAt: $lastMessageAt + } + ) +} + +mutation deleteConversation($id: UUID!) @auth(level: USER) { + conversation_delete(id: $id) +} diff --git a/backend/dataconnect/example/conversation/queries.gql b/backend/dataconnect/example/conversation/queries.gql new file mode 100644 index 00000000..e45cf6b6 --- /dev/null +++ b/backend/dataconnect/example/conversation/queries.gql @@ -0,0 +1,125 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listConversations( + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations(offset: $offset, limit: $limit, orderBy: { updatedAt: DESC }) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getConversationById($id: UUID!) @auth(level: USER) { + conversation(id: $id) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY TYPE (CLIENT_VENDOR / GROUP_STAFF) +# ---------------------------------------------------------- +query listConversationsByType( + $conversationType: ConversationType! + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { conversationType: { eq: $conversationType } } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY STATUS (ACTIVE) +# ---------------------------------------------------------- +query listConversationsByStatus( + $status: ConversationStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} + +# ---------------------------------------------------------- +# FILTER (dashboard/debug) +# Supports searching by multiple optional fields +# ---------------------------------------------------------- +query filterConversations( + $status: ConversationStatus + $conversationType: ConversationType + $isGroup: Boolean + $lastMessageAfter: Timestamp + $lastMessageBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + conversations( + where: { + status: { eq: $status } + conversationType: { eq: $conversationType } + isGroup: { eq: $isGroup } + lastMessageAt: { ge: $lastMessageAfter, le: $lastMessageBefore } + } + offset: $offset + limit: $limit + orderBy: { lastMessageAt: DESC } + ) { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } +} diff --git a/backend/dataconnect/example/course/mutations.gql b/backend/dataconnect/example/course/mutations.gql new file mode 100644 index 00000000..71423710 --- /dev/null +++ b/backend/dataconnect/example/course/mutations.gql @@ -0,0 +1,53 @@ +mutation createCourse( + $title: String + $description: String + $thumbnailUrl: String + $durationMinutes: Int + $xpReward: Int + $categoryId: UUID! + $levelRequired: String + $isCertification: Boolean +) @auth(level: USER) { + course_insert( + data: { + title: $title + description: $description + thumbnailUrl: $thumbnailUrl + durationMinutes: $durationMinutes + xpReward: $xpReward + categoryId: $categoryId + levelRequired: $levelRequired + isCertification: $isCertification + } + ) +} + +mutation updateCourse( + $id: UUID! + $title: String + $description: String + $thumbnailUrl: String + $durationMinutes: Int + $xpReward: Int + $categoryId: UUID! + $levelRequired: String + $isCertification: Boolean +) @auth(level: USER) { + course_update( + id: $id + data: { + title: $title + description: $description + thumbnailUrl: $thumbnailUrl + durationMinutes: $durationMinutes + xpReward: $xpReward + categoryId: $categoryId + levelRequired: $levelRequired + isCertification: $isCertification + } + ) +} + +mutation deleteCourse($id: UUID!) @auth(level: USER) { + course_delete(id: $id) +} diff --git a/backend/dataconnect/example/course/queries.gql b/backend/dataconnect/example/course/queries.gql new file mode 100644 index 00000000..2e6d8552 --- /dev/null +++ b/backend/dataconnect/example/course/queries.gql @@ -0,0 +1,68 @@ +query listCourses @auth(level: USER) { + courses { + id + title + description + thumbnailUrl + durationMinutes + xpReward + categoryId + levelRequired + isCertification + createdAt + + category{ + id + label + } + + } +} + +query getCourseById($id: UUID!) @auth(level: USER) { + course(id: $id) { + id + title + description + thumbnailUrl + durationMinutes + xpReward + categoryId + levelRequired + isCertification + createdAt + + category{ + id + label + } + + } +} + +query filterCourses( + $categoryId: UUID + $isCertification: Boolean + $levelRequired: String + $completed: Boolean +) @auth(level: USER) { + courses( + where: { + categoryId: { eq: $categoryId } + isCertification: { eq: $isCertification } + levelRequired: { eq: $levelRequired } + } + ) { + id + title + categoryId + levelRequired + isCertification + + category{ + id + label + } + + } +} diff --git a/backend/dataconnect/example/customRateCard/mutations.gql b/backend/dataconnect/example/customRateCard/mutations.gql new file mode 100644 index 00000000..4b212962 --- /dev/null +++ b/backend/dataconnect/example/customRateCard/mutations.gql @@ -0,0 +1,37 @@ +mutation createCustomRateCard( + $name: String!, + $baseBook: String, + $discount: Float, + $isDefault: Boolean +) @auth(level: USER) { + customRateCard_insert( + data: { + name: $name, + baseBook: $baseBook, + discount: $discount, + isDefault: $isDefault + } + ) +} + +mutation updateCustomRateCard( + $id: UUID!, + $name: String, + $baseBook: String, + $discount: Float, + $isDefault: Boolean +) @auth(level: USER) { + customRateCard_update( + id: $id, + data: { + name: $name, + baseBook: $baseBook, + discount: $discount, + isDefault: $isDefault + } + ) +} + +mutation deleteCustomRateCard($id: UUID!) @auth(level: USER) { + customRateCard_delete(id: $id) +} diff --git a/backend/dataconnect/example/customRateCard/queries.gql b/backend/dataconnect/example/customRateCard/queries.gql new file mode 100644 index 00000000..e110c349 --- /dev/null +++ b/backend/dataconnect/example/customRateCard/queries.gql @@ -0,0 +1,23 @@ +query listCustomRateCards @auth(level: USER) { + customRateCards { + id + name + baseBook + discount + isDefault + createdAt + updatedAt + } +} + +query getCustomRateCardById($id: UUID!) @auth(level: USER) { + customRateCard(id: $id) { + id + name + baseBook + discount + isDefault + createdAt + updatedAt + } +} diff --git a/backend/dataconnect/example/document/mutations.gql b/backend/dataconnect/example/document/mutations.gql new file mode 100644 index 00000000..74055a4e --- /dev/null +++ b/backend/dataconnect/example/document/mutations.gql @@ -0,0 +1,33 @@ +mutation createDocument( + $documentType: DocumentType! + $name: String! + $description: String +) @auth(level: USER) { + document_insert( + data: { + documentType: $documentType + name: $name + description: $description + } + ) +} + +mutation updateDocument( + $id: UUID! + $documentType: DocumentType + $name: String + $description: String +) @auth(level: USER) { + document_update( + id: $id + data: { + documentType: $documentType + name: $name + description: $description + } + ) +} + +mutation deleteDocument($id: UUID!) @auth(level: USER) { + document_delete(id: $id) +} diff --git a/backend/dataconnect/example/document/queries.gql b/backend/dataconnect/example/document/queries.gql new file mode 100644 index 00000000..b44c1ce3 --- /dev/null +++ b/backend/dataconnect/example/document/queries.gql @@ -0,0 +1,35 @@ +query listDocuments @auth(level: USER) { + documents { + id + documentType + name + description + createdAt + } +} + +query getDocumentById($id: UUID!) @auth(level: USER) { + document(id: $id) { + id + documentType + name + description + createdAt + } +} + +query filterDocuments( + $documentType: DocumentType +) @auth(level: USER) { + documents( + where: { + documentType: { eq: $documentType } + } + ) { + id + documentType + name + description + createdAt + } +} diff --git a/backend/dataconnect/example/emergencyContact/mutations.gql b/backend/dataconnect/example/emergencyContact/mutations.gql new file mode 100644 index 00000000..9148f685 --- /dev/null +++ b/backend/dataconnect/example/emergencyContact/mutations.gql @@ -0,0 +1,35 @@ +mutation createEmergencyContact( + $name: String! + $phone: String! + $relationship: RelationshipType! + $staffId: UUID! +) @auth(level: USER) { + emergencyContact_insert( + data: { + name: $name + phone: $phone + relationship: $relationship + staffId: $staffId + } + ) +} + +mutation updateEmergencyContact( + $id: UUID! + $name: String + $phone: String + $relationship: RelationshipType +) @auth(level: USER) { + emergencyContact_update( + id: $id + data: { + name: $name + phone: $phone + relationship: $relationship + } + ) +} + +mutation deleteEmergencyContact($id: UUID!) @auth(level: USER) { + emergencyContact_delete(id: $id) +} diff --git a/backend/dataconnect/example/emergencyContact/queries.gql b/backend/dataconnect/example/emergencyContact/queries.gql new file mode 100644 index 00000000..65777051 --- /dev/null +++ b/backend/dataconnect/example/emergencyContact/queries.gql @@ -0,0 +1,38 @@ +query listEmergencyContacts @auth(level: USER) { + emergencyContacts { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} + +query getEmergencyContactById($id: UUID!) @auth(level: USER) { + emergencyContact(id: $id) { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} + +query getEmergencyContactsByStaffId($staffId: UUID!) @auth(level: USER) { + emergencyContacts(where: { staffId: { eq: $staffId } }) { + id + name + phone + relationship + staffId + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/faqData/mutations.gql b/backend/dataconnect/example/faqData/mutations.gql new file mode 100644 index 00000000..720be3c3 --- /dev/null +++ b/backend/dataconnect/example/faqData/mutations.gql @@ -0,0 +1,29 @@ +mutation createFaqData( + $category: String! + $questions: [Any!] +) @auth(level: USER) { + faqData_insert( + data: { + category: $category + questions: $questions + } + ) +} + +mutation updateFaqData( + $id: UUID! + $category: String + $questions: [Any!] +) @auth(level: USER) { + faqData_update( + id: $id + data: { + category: $category + questions: $questions + } + ) +} + +mutation deleteFaqData($id: UUID!) @auth(level: USER) { + faqData_delete(id: $id) +} diff --git a/backend/dataconnect/example/faqData/queries.gql b/backend/dataconnect/example/faqData/queries.gql new file mode 100644 index 00000000..3a3c77d3 --- /dev/null +++ b/backend/dataconnect/example/faqData/queries.gql @@ -0,0 +1,29 @@ +query listFaqDatas @auth(level: USER) { + faqDatas { + id + category + questions + createdAt + updatedAt + createdBy + } +} + +query getFaqDataById($id: UUID!) @auth(level: USER) { + faqData(id: $id) { + id + category + questions + createdAt + updatedAt + createdBy + } +} + +query filterFaqDatas($category: String) @auth(level: USER) { + faqDatas(where: { category: { eq: $category } }) { + id + category + questions + } +} diff --git a/backend/dataconnect/example/hub/mutations.gql b/backend/dataconnect/example/hub/mutations.gql new file mode 100644 index 00000000..bf7b0c18 --- /dev/null +++ b/backend/dataconnect/example/hub/mutations.gql @@ -0,0 +1,41 @@ +mutation createHub( + $name: String! + $locationName: String + $address: String + $nfcTagId: String + $ownerId: UUID! +) @auth(level: USER) { + hub_insert( + data: { + name: $name + locationName: $locationName + address: $address + nfcTagId: $nfcTagId + ownerId: $ownerId + } + ) +} + +mutation updateHub( + $id: UUID! + $name: String + $locationName: String + $address: String + $nfcTagId: String + $ownerId: UUID +) @auth(level: USER) { + hub_update( + id: $id + data: { + name: $name + locationName: $locationName + address: $address + nfcTagId: $nfcTagId + ownerId: $ownerId + } + ) +} + +mutation deleteHub($id: UUID!) @auth(level: USER) { + hub_delete(id: $id) +} diff --git a/backend/dataconnect/example/hub/queries.gql b/backend/dataconnect/example/hub/queries.gql new file mode 100644 index 00000000..dc2a69c9 --- /dev/null +++ b/backend/dataconnect/example/hub/queries.gql @@ -0,0 +1,62 @@ +query listHubs @auth(level: USER) { + hubs { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query getHubById($id: UUID!) @auth(level: USER) { + hub(id: $id) { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query getHubsByOwnerId($ownerId: UUID!) @auth(level: USER) { + hubs(where: { ownerId: { eq: $ownerId } }) { + id + name + locationName + address + nfcTagId + ownerId + createdAt + updatedAt + createdBy + } +} + +query filterHubs( + $ownerId: UUID + $name: String + $nfcTagId: String +) @auth(level: USER) { + hubs( + where: { + ownerId: { eq: $ownerId } + name: { eq: $name } + nfcTagId: { eq: $nfcTagId } + } + ) { + id + name + locationName + address + nfcTagId + ownerId + } +} diff --git a/backend/dataconnect/example/invoice/mutations.gql b/backend/dataconnect/example/invoice/mutations.gql new file mode 100644 index 00000000..53af2552 --- /dev/null +++ b/backend/dataconnect/example/invoice/mutations.gql @@ -0,0 +1,123 @@ + +mutation createInvoice( + $status: InvoiceStatus! + + $vendorId: UUID! + $businessId: UUID! + $orderId: UUID! + + $paymentTerms: InovicePaymentTerms + $invoiceNumber: String! + $issueDate: Timestamp! + $dueDate: Timestamp! + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float! + $notes: String + + $staffCount: Int + $chargesCount: Int + +) @auth(level: USER) { + invoice_insert( + data: { + status: $status + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + + } + ) +} + +mutation updateInvoice( + $id: UUID! + + $status: InvoiceStatus + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTerms + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int + + + $disputedItems: Any + $disputeReason: String + $disputeDetails: String +) @auth(level: USER) { + invoice_update( + id: $id + data: { + status: $status + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + + disputedItems: $disputedItems + disputeReason: $disputeReason + disputeDetails: $disputeDetails + + } + ) +} + +mutation deleteInvoice($id: UUID!) @auth(level: USER) { + invoice_delete(id: $id) +} diff --git a/backend/dataconnect/example/invoice/queries.gql b/backend/dataconnect/example/invoice/queries.gql new file mode 100644 index 00000000..53c33a15 --- /dev/null +++ b/backend/dataconnect/example/invoice/queries.gql @@ -0,0 +1,568 @@ + +# ------------------------------------------------------------ +# LIST ALL INVOICES (admin/debug) +# ------------------------------------------------------------ +query listInvoices( + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices(offset: $offset, limit: $limit) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# GET INVOICE BY ID +# ------------------------------------------------------------ +query getInvoiceById($id: UUID!) @auth(level: USER) { + invoice(id: $id) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY VENDOR +# ------------------------------------------------------------ +query listInvoicesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY BUSINESS +# ------------------------------------------------------------ +query listInvoicesByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY ORDER +# ------------------------------------------------------------ +query listInvoicesByOrderId( + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { orderId: { eq: $orderId } } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# LIST INVOICES BY STATUS +# ------------------------------------------------------------ +query listInvoicesByStatus( + $status: InvoiceStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { dueDate: ASC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# FILTER INVOICES (multi filters) +# NOTE: Timestamp filters use ge/le (NOT gte/lte) +# ------------------------------------------------------------ +query filterInvoices( + $vendorId: UUID + $businessId: UUID + $orderId: UUID + $status: InvoiceStatus + + $issueDateFrom: Timestamp + $issueDateTo: Timestamp + + $dueDateFrom: Timestamp + $dueDateTo: Timestamp + + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { + vendorId: { eq: $vendorId } + businessId: { eq: $businessId } + orderId: { eq: $orderId } + status: { eq: $status } + + issueDate: { ge: $issueDateFrom, le: $issueDateTo } + dueDate: { ge: $dueDateFrom, le: $dueDateTo } + } + offset: $offset + limit: $limit + orderBy: { issueDate: DESC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} + +# ------------------------------------------------------------ +# OVERDUE INVOICES (dueDate < now and not PAID) +# NOTE: request.time works in @default; for filters, pass $now from client +# ------------------------------------------------------------ +query listOverdueInvoices( + $now: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoices( + where: { + dueDate: { lt: $now } + status: { ne: PAID } + } + offset: $offset + limit: $limit + orderBy: { dueDate: ASC } + ) { + id + status + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + + staffCount + chargesCount + + disputedItems + disputeReason + disputeDetails + + vendor { + companyName + address + email + phone + } + + business { + businessName + address + phone + email + } + order { + eventName + deparment + poReference + + teamHub { + address + placeId + hubName + } + + } + } +} diff --git a/backend/dataconnect/example/invoiceTemplate/mutations.gql b/backend/dataconnect/example/invoiceTemplate/mutations.gql new file mode 100644 index 00000000..3bf87c49 --- /dev/null +++ b/backend/dataconnect/example/invoiceTemplate/mutations.gql @@ -0,0 +1,115 @@ + +mutation createInvoiceTemplate( + $name: String! + $ownerId: UUID! + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTermsTemp + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int +) @auth(level: USER) { + invoiceTemplate_insert( + data: { + name: $name + ownerId: $ownerId + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + } + ) +} + +mutation updateInvoiceTemplate( + $id: UUID! + + $name: String + $ownerId: UUID + + $vendorId: UUID + $businessId: UUID + $orderId: UUID + + $paymentTerms: InovicePaymentTermsTemp + $invoiceNumber: String + $issueDate: Timestamp + $dueDate: Timestamp + $hub: String + $managerName: String + $vendorNumber: String + $roles: Any + $charges: Any + $otherCharges: Float + $subtotal: Float + $amount: Float + $notes: String + + $staffCount: Int + $chargesCount: Int +) @auth(level: USER) { + invoiceTemplate_update( + id: $id + data: { + name: $name + ownerId: $ownerId + + vendorId: $vendorId + businessId: $businessId + orderId: $orderId + + paymentTerms: $paymentTerms + invoiceNumber: $invoiceNumber + issueDate: $issueDate + dueDate: $dueDate + hub: $hub + managerName: $managerName + vendorNumber: $vendorNumber + roles: $roles + charges: $charges + otherCharges: $otherCharges + subtotal: $subtotal + amount: $amount + notes: $notes + + staffCount: $staffCount + chargesCount: $chargesCount + } + ) +} + +mutation deleteInvoiceTemplate($id: UUID!) @auth(level: USER) { + invoiceTemplate_delete(id: $id) +} diff --git a/backend/dataconnect/example/invoiceTemplate/queries.gql b/backend/dataconnect/example/invoiceTemplate/queries.gql new file mode 100644 index 00000000..907ad1d2 --- /dev/null +++ b/backend/dataconnect/example/invoiceTemplate/queries.gql @@ -0,0 +1,325 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listInvoiceTemplates( + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates(offset: $offset, limit: $limit) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getInvoiceTemplateById($id: UUID!) @auth(level: USER) { + invoiceTemplate(id: $id) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY OWNER (my templates) +# ---------------------------------------------------------- +query listInvoiceTemplatesByOwnerId( + $ownerId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { ownerId: { eq: $ownerId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR (templates tied to a vendor) +# ---------------------------------------------------------- +query listInvoiceTemplatesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY BUSINESS (templates tied to a business) +# ---------------------------------------------------------- +query listInvoiceTemplatesByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# LIST BY ORDER (templates tied to a specific order) +# ---------------------------------------------------------- +query listInvoiceTemplatesByOrderId( + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { orderId: { eq: $orderId } } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} + +# ---------------------------------------------------------- +# SEARCH (by name) within an owner +# ---------------------------------------------------------- +query searchInvoiceTemplatesByOwnerAndName( + $ownerId: UUID! + $name: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + invoiceTemplates( + where: { + ownerId: { eq: $ownerId } + name: { eq: $name } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + name + ownerId + + vendorId + businessId + orderId + + paymentTerms + invoiceNumber + issueDate + dueDate + hub + managerName + vendorNumber + roles + charges + otherCharges + subtotal + amount + notes + staffCount + chargesCount + + createdAt + updatedAt + createdBy + + vendor { id companyName } + business { id businessName email contactName } + order { id eventName status orderType } + } +} diff --git a/backend/dataconnect/example/level/mutations.gql b/backend/dataconnect/example/level/mutations.gql new file mode 100644 index 00000000..4c5b978c --- /dev/null +++ b/backend/dataconnect/example/level/mutations.gql @@ -0,0 +1,37 @@ +mutation createLevel( + $name: String! + $xpRequired: Int! + $icon: String + $colors: Any +) @auth(level: USER) { + level_insert( + data: { + name: $name + xpRequired: $xpRequired + icon: $icon + colors: $colors + } + ) +} + +mutation updateLevel( + $id: UUID! + $name: String + $xpRequired: Int + $icon: String + $colors: Any +) @auth(level: USER) { + level_update( + id: $id + data: { + name: $name + xpRequired: $xpRequired + icon: $icon + colors: $colors + } + ) +} + +mutation deleteLevel($id: UUID!) @auth(level: USER) { + level_delete(id: $id) +} diff --git a/backend/dataconnect/example/level/queries.gql b/backend/dataconnect/example/level/queries.gql new file mode 100644 index 00000000..42026e24 --- /dev/null +++ b/backend/dataconnect/example/level/queries.gql @@ -0,0 +1,44 @@ +query listLevels @auth(level: USER) { + levels { + id + name + xpRequired + icon + colors + createdAt + updatedAt + createdBy + } +} + +query getLevelById($id: UUID!) @auth(level: USER) { + level(id: $id) { + id + name + xpRequired + icon + colors + createdAt + updatedAt + createdBy + } +} + +query filterLevels( + $name: String + $xpRequired: Int +) @auth(level: USER) { + levels( + where: { + name: { eq: $name } + xpRequired: { eq: $xpRequired } + } + ) { + id + name + xpRequired + icon + colors + } +} + diff --git a/backend/dataconnect/example/memberTask/mutations.gql b/backend/dataconnect/example/memberTask/mutations.gql new file mode 100644 index 00000000..d8690742 --- /dev/null +++ b/backend/dataconnect/example/memberTask/mutations.gql @@ -0,0 +1,21 @@ + +mutation createMemberTask( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask_insert( + data: { + teamMemberId: $teamMemberId + taskId: $taskId + } + ) +} + +mutation deleteMemberTask( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask_delete( + key: { teamMemberId: $teamMemberId, taskId: $taskId } + ) +} diff --git a/backend/dataconnect/example/memberTask/queries.gql b/backend/dataconnect/example/memberTask/queries.gql new file mode 100644 index 00000000..0213ea2c --- /dev/null +++ b/backend/dataconnect/example/memberTask/queries.gql @@ -0,0 +1,77 @@ + +query getMyTasks($teamMemberId: UUID!) @auth(level: USER) { + memberTasks(where: { teamMemberId: { eq: $teamMemberId } }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +#before named getMemberTaskByIdKey +query getMemberTaskByIdKey( + $teamMemberId: UUID! + $taskId: UUID! +) @auth(level: USER) { + memberTask(key: { teamMemberId: $teamMemberId, taskId: $taskId }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + } +} + +query getMemberTasksByTaskId($taskId: UUID!) @auth(level: USER) { + memberTasks(where: { taskId: { eq: $taskId } }) { + id + task { + id + taskName + description + status + dueDate + progress + priority + } + + teamMember{ + + user { + fullName + email + } + + } + } +} diff --git a/backend/dataconnect/example/message/mutations.gql b/backend/dataconnect/example/message/mutations.gql new file mode 100644 index 00000000..883c06cf --- /dev/null +++ b/backend/dataconnect/example/message/mutations.gql @@ -0,0 +1,37 @@ +mutation createMessage( + $conversationId: UUID!, + $senderId: String!, + $content: String!, + $isSystem: Boolean +) @auth(level: USER) { + message_insert( + data: { + conversationId: $conversationId, + senderId: $senderId, + content: $content, + isSystem: $isSystem + } + ) +} + +mutation updateMessage( + $id: UUID!, + $conversationId: UUID, + $senderId: String, + $content: String, + $isSystem: Boolean +) @auth(level: USER) { + message_update( + id: $id, + data: { + conversationId: $conversationId, + senderId: $senderId, + content: $content, + isSystem: $isSystem + } + ) +} + +mutation deleteMessage($id: UUID!) @auth(level: USER) { + message_delete(id: $id) +} diff --git a/backend/dataconnect/example/message/queries.gql b/backend/dataconnect/example/message/queries.gql new file mode 100644 index 00000000..770bdafe --- /dev/null +++ b/backend/dataconnect/example/message/queries.gql @@ -0,0 +1,41 @@ +query listMessages @auth(level: USER) { + messages { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} + +query getMessageById($id: UUID!) @auth(level: USER) { + message(id: $id) { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} + +query getMessagesByConversationId($conversationId: UUID!) @auth(level: USER) { + messages(where: { conversationId: { eq: $conversationId } }) { + id + conversationId + senderId + content + isSystem + createdAt + user{ + fullName + } + } +} diff --git a/backend/dataconnect/example/order/mutations.gql b/backend/dataconnect/example/order/mutations.gql new file mode 100644 index 00000000..6827d73a --- /dev/null +++ b/backend/dataconnect/example/order/mutations.gql @@ -0,0 +1,100 @@ +mutation createOrder( + $vendorId: UUID + $businessId: UUID! + $orderType: OrderType! + #$location: String + $status: OrderStatus + $date: Timestamp + $startDate: Timestamp + $endDate: Timestamp + $duration: OrderDuration + $lunchBreak: Int + $total: Float + $eventName: String + $assignedStaff: Any + $shifts: Any + $requested: Int + $teamHubId: UUID! + $recurringDays: Any + $permanentStartDate: Timestamp + $permanentDays: Any + $notes: String + $detectedConflicts: Any + $poReference: String +) @auth(level: USER) { + order_insert( + data: { + vendorId: $vendorId + businessId: $businessId + orderType: $orderType + #location: $location + status: $status + date: $date + startDate: $startDate + endDate: $endDate + duration: $duration + lunchBreak: $lunchBreak + total: $total + eventName: $eventName + assignedStaff: $assignedStaff + shifts: $shifts + requested: $requested + teamHubId: $teamHubId + recurringDays: $recurringDays + permanentDays: $permanentDays + notes: $notes + detectedConflicts: $detectedConflicts + poReference: $poReference + } + ) +} + +mutation updateOrder( + $id: UUID! + $vendorId: UUID + $businessId: UUID + #$location: String + $status: OrderStatus + $date: Timestamp + $startDate: Timestamp + $endDate: Timestamp + $total: Float + $eventName: String + $assignedStaff: Any + $shifts: Any + $requested: Int + $teamHubId: UUID! + $recurringDays: Any + $permanentDays: Any + $notes: String + $detectedConflicts: Any + $poReference: String +) @auth(level: USER) { + order_update( + id: $id + data: { + vendorId: $vendorId + businessId: $businessId + #location: $location + status: $status + date: $date + startDate: $startDate + endDate: $endDate + total: $total + eventName: $eventName + assignedStaff: $assignedStaff + shifts: $shifts + requested: $requested + teamHubId: $teamHubId + recurringDays: $recurringDays + permanentDays: $permanentDays + notes: $notes + detectedConflicts: $detectedConflicts + poReference: $poReference + } + ) +} + +mutation deleteOrder($id: UUID!) @auth(level: USER) { + order_delete(id: $id) +} diff --git a/backend/dataconnect/example/order/queries.gql b/backend/dataconnect/example/order/queries.gql new file mode 100644 index 00000000..c500c595 --- /dev/null +++ b/backend/dataconnect/example/order/queries.gql @@ -0,0 +1,435 @@ +# ------------------------------------------------------------ +# LIST ALL ORDERS +# ------------------------------------------------------------ +query listOrders( + $offset: Int + $limit: Int +) @auth(level: USER) { + orders(offset: $offset, limit: $limit) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET ORDER BY ID +# ------------------------------------------------------------ +query getOrderById($id: UUID!) @auth(level: USER) { + order(id: $id) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY BUSINESS +# ------------------------------------------------------------ +query getOrdersByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { businessId: { eq: $businessId } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY VENDOR +# ------------------------------------------------------------ +query getOrdersByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY STATUS +# ------------------------------------------------------------ +query getOrdersByStatus( + $status: OrderStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET ORDERS BY DATE RANGE +# ------------------------------------------------------------ +query getOrdersByDateRange( + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { + date: { ge: $start, le: $end } + } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +# ------------------------------------------------------------ +# GET RAPID ORDERS +# ------------------------------------------------------------ +query getRapidOrders( + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { orderType: { eq: RAPID } } + offset: $offset + limit: $limit + ) { + id + eventName + + vendorId + businessId + orderType + #location + status + date + startDate + endDate + duration + lunchBreak + total + assignedStaff + shifts + requested + recurringDays + permanentDays + poReference + detectedConflicts + notes + createdAt + + business { + id + businessName + email + contactName + } + + vendor { + id + companyName + } + + teamHub { + address + placeId + hubName + } + + } +} + +#to validate if an hub has orders before delete +query listOrdersByBusinessAndTeamHub( + $businessId: UUID! + $teamHubId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + orders( + where: { + businessId: { eq: $businessId } + teamHubId: { eq: $teamHubId } + #status: {in: [ DRAFT POSTED FILLED PENDING FULLY_STAFFED PARTIAL_STAFFED ] } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + eventName + orderType + status + duration + + businessId + vendorId + teamHubId + + date + startDate + endDate + + requested + total + notes + + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/recentPayment/mutations.gql b/backend/dataconnect/example/recentPayment/mutations.gql new file mode 100644 index 00000000..109e4ee2 --- /dev/null +++ b/backend/dataconnect/example/recentPayment/mutations.gql @@ -0,0 +1,41 @@ +mutation createRecentPayment( + $workedTime: String + $status: RecentPaymentStatus + $staffId: UUID! + $applicationId: UUID! + $invoiceId: UUID! +) @auth(level: USER) { + recentPayment_insert( + data: { + workedTime: $workedTime + status: $status + staffId: $staffId + applicationId: $applicationId + invoiceId: $invoiceId + } + ) +} + +mutation updateRecentPayment( + $id: UUID! + $workedTime: String + $status: RecentPaymentStatus + $staffId: UUID + $applicationId: UUID + $invoiceId: UUID +) @auth(level: USER) { + recentPayment_update( + id: $id + data: { + workedTime: $workedTime + status: $status + staffId: $staffId + applicationId: $applicationId + invoiceId: $invoiceId + } + ) +} + +mutation deleteRecentPayment($id: UUID!) @auth(level: USER) { + recentPayment_delete(id: $id) +} diff --git a/backend/dataconnect/example/recentPayment/queries.gql b/backend/dataconnect/example/recentPayment/queries.gql new file mode 100644 index 00000000..82072bdd --- /dev/null +++ b/backend/dataconnect/example/recentPayment/queries.gql @@ -0,0 +1,483 @@ +# ------------------------------------------------------------ +# LIST ALL (admin/debug) +# ------------------------------------------------------------ +query listRecentPayments( + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments(offset: $offset, limit: $limit) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + checkInTime + checkOutTime + + shiftRole { + hours + totalValue + startTime + endTime + + role { + name + costPerHour + } + + shift { + title + date + location + locationAddress + description + } + } + } + + invoice { + status + invoiceNumber + issueDate + + business { id businessName } + vendor { id companyName } + order { id eventName } + } + } +} + +# ------------------------------------------------------------ +# GET BY ID +# ------------------------------------------------------------ +query getRecentPaymentById($id: UUID!) @auth(level: USER) { + recentPayment(id: $id) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + checkInTime + checkOutTime + + shiftRole { + hours + totalValue + startTime + endTime + + role { + name + costPerHour + } + + shift { + title + date + location + locationAddress + description + } + } + } + + invoice { + status + invoiceNumber + issueDate + + business { id businessName } + vendor { id companyName } + order { id eventName } + } + } +} + +# ------------------------------------------------------------ +# LIST BY STAFF (Staff view) +# ------------------------------------------------------------ +query listRecentPaymentsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + status + shiftRole { + startTime + endTime + hours + totalValue + + role { id name costPerHour } + + shift { + id + title + date + locationAddress + } + } + } + + invoice { + id + invoiceNumber + status + issueDate + dueDate + amount + + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +# ------------------------------------------------------------ +# LIST BY APPLICATION (debug / trace) +# ------------------------------------------------------------ +query listRecentPaymentsByApplicationId( + $applicationId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { applicationId: { eq: $applicationId } } + offset: $offset + limit: $limit + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + status + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +# ------------------------------------------------------------ +# LIST BY INVOICE (Vendor/Business can see all payments for invoice) +# ------------------------------------------------------------ +query listRecentPaymentsByInvoiceId( + $invoiceId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { invoiceId: { eq: $invoiceId } } + offset: $offset + limit: $limit + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + staffId + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +# ------------------------------------------------------------ +# FILTER BY STATUS (common) +# ------------------------------------------------------------ +query listRecentPaymentsByStatus( + $status: RecentPaymentStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +# ------------------------------------------------------------ +# BY BUSINESS (2-step) +# Step 2: pass invoiceIds (from query: listInvoicesByBusinessId) +# ------------------------------------------------------------ +query listRecentPaymentsByInvoiceIds( + $invoiceIds: [UUID!]! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { invoiceId: { in: $invoiceIds } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + shiftRole { + hours + totalValue + role { id name costPerHour } + shift { id title date locationAddress } + } + } + + invoice { + id + invoiceNumber + status + amount + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +# ------------------------------------------------------------ +# LIST BY BUSINESS ID (direct) +# ------------------------------------------------------------ +query listRecentPaymentsByBusinessId( + $businessId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + recentPayments( + where: { + invoice: { + businessId: { eq: $businessId } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + workedTime + status + staffId + applicationId + invoiceId + createdAt + updatedAt + createdBy + + application { + id + staffId + checkInTime + checkOutTime + shiftRole { + startTime + endTime + hours + totalValue + + role { id name costPerHour } + + shift { + id + title + date + location + locationAddress + description + } + } + } + + invoice { + id + invoiceNumber + status + issueDate + dueDate + amount + + business { id businessName } + vendor { id companyName } + order { + id + eventName + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} diff --git a/backend/dataconnect/example/reports/queries.gql b/backend/dataconnect/example/reports/queries.gql new file mode 100644 index 00000000..10bceae5 --- /dev/null +++ b/backend/dataconnect/example/reports/queries.gql @@ -0,0 +1,455 @@ +# ========================================================== +# Reports Connector - For MVP +# ========================================================== +# This file exposes SOURCE-DATA queries for all report screens. +# All aggregation (group by day/week, percentages, averages) +# is intentionally done on the client (Flutter). +# +# Entities used: +# - Shift +# - Application +# - Staff +# - Invoice +# - TimeSheet +# +# NOTE: +# Data Connect does NOT support custom root resolvers. +# These queries return raw rows from @table entities. +# ========================================================== + + +# ========================================================== +# 1) COVERAGE REPORT (Next 7 days) +# ========================================================== +# Coverage definition: +# - Needed: sum(Shift.workersNeeded) grouped by date +# - Confirmed: count(Application) where status IN (...) +# +# Client groups by Shift.date and calculates: +# coveragePercentage = confirmed / needed * 100 +# ========================================================== + +query listShiftsForCoverage( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + filled + status + } +} + +#I comment here because I have an error en sdk +query listApplicationsForCoverage( + $shiftIds: [UUID!]! + #$statuses: [ApplicationStatus!]! +) @auth(level: USER) { + applications( + where: { + shiftId: { in: $shiftIds } + #status: { in: $statuses } + } + ) { + id + shiftId + staffId + status + } +} + + +# ========================================================== +# 2) DAILY OPS REPORT (Single day) +# ========================================================== +# Metrics derived on client: +# - scheduledShifts = shifts.length +# - workersConfirmed = confirmedApps / totalNeeded +# - inProgressShifts = status == IN_PROGRESS +# - completedShifts = status == COMPLETED +# ========================================================== + +query listShiftsForDailyOpsByBusiness( + $businessId: UUID! + $date: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { eq: $date } + } + orderBy: { startTime: ASC } + ) { + id + title + location + startTime + endTime + workersNeeded + filled + status + } +} + +query listShiftsForDailyOpsByVendor( + $vendorId: UUID! + $date: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { eq: $date } + } + orderBy: { startTime: ASC } + ) { + id + title + location + startTime + endTime + workersNeeded + filled + status + } +} + +query listApplicationsForDailyOps( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + checkInTime + checkOutTime + } +} + + +# ========================================================== +# 3) FORECAST REPORT (Next N weeks) +# ========================================================== +# Projected spend formula (client): +# projectedCost = workersNeeded * hours * hourlyRate +# ========================================================== + +query listShiftsForForecastByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + hours + cost + status + } +} + +query listShiftsForForecastByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + } + orderBy: { date: ASC } + ) { + id + date + workersNeeded + hours + cost + status + } +} + +# ========================================================== +# 4) NO-SHOW REPORT (Historical range) +# ========================================================== +# Now fully supported because ApplicationStatus includes NO_SHOW. +# +# Metrics: +# - totalNoShows = count(status == NO_SHOW) +# - noShowRate = noShows / totalApplications +# - breakdown by staff +# ========================================================== + +query listShiftsForNoShowRangeByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + } + ) { + id + date + } +} + +query listShiftsForNoShowRangeByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + } + ) { + id + date + } +} + + +query listApplicationsForNoShowRange( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + } +} + +query listStaffForNoShowReport( + $staffIds: [UUID!]! +) @auth(level: USER) { + staffs(where: { id: { in: $staffIds } }) { + id + fullName + noShowCount + reliabilityScore + } +} + + +# ========================================================== +# 5) SPEND REPORT (Financial) +# ========================================================== +# Uses Invoice as source of truth for money. +# Filter is now based on: +# - businessId (business dashboard) +# - vendorId (vendor dashboard) +# since Invoice no longer has ownerId. +# ========================================================== + +query listInvoicesForSpendByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + businessId: { eq: $businessId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +query listInvoicesForSpendByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + vendorId: { eq: $vendorId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +# Optional: Spend by Order (if you need it) +query listInvoicesForSpendByOrder( + $orderId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + invoices( + where: { + orderId: { eq: $orderId } + issueDate: { ge: $startDate, le: $endDate } + } + orderBy: { issueDate: ASC } + ) { + id + issueDate + dueDate + amount + status + invoiceNumber + + vendor { id companyName } + business { id businessName } + order { id eventName } + } +} + +query listTimesheetsForSpend( + $startTime: Timestamp! + $endTime: Timestamp! +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $startTime, le: $endTime } + } + } + ) { + id + hours + totalValue + + shift{ + title + location + status + date + + order{ + business{ + businessName + } + } + } + + role{ + costPerHour + } + + } +} + + +# ========================================================== +# 6) PERFORMANCE REPORT (Historical KPIs) +# ========================================================== +# Metrics derivable: +# - fillRate +# - completionRate +# - onTimeRate +# - avgFillTimeHours (NOW POSSIBLE 🎉) +# +# avgFillTimeHours formula: +# (filledAt - createdAt) averaged across FILLED shifts +# ========================================================== + +query listShiftsForPerformanceByBusiness( + $businessId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $startDate, le: $endDate } + filledAt: { isNull: false } + } + ) { + id + workersNeeded + filled + status + createdAt + filledAt + } +} + +query listShiftsForPerformanceByVendor( + $vendorId: UUID! + $startDate: Timestamp! + $endDate: Timestamp! +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $startDate, le: $endDate } + filledAt: { isNull: false } + } + ) { + id + workersNeeded + filled + status + createdAt + filledAt + } +} + +query listApplicationsForPerformance( + $shiftIds: [UUID!]! +) @auth(level: USER) { + applications(where: { shiftId: { in: $shiftIds } }) { + id + shiftId + staffId + status + checkInTime + checkOutTime + } +} + +query listStaffForPerformance( + $staffIds: [UUID!]! +) @auth(level: USER) { + staffs(where: { id: { in: $staffIds } }) { + id + averageRating + onTimeRate + noShowCount + reliabilityScore + } +} diff --git a/backend/dataconnect/example/role/mutations.gql b/backend/dataconnect/example/role/mutations.gql new file mode 100644 index 00000000..f13bba25 --- /dev/null +++ b/backend/dataconnect/example/role/mutations.gql @@ -0,0 +1,36 @@ +mutation createRole( + $name: String! + $costPerHour: Float! + $vendorId: UUID! + $roleCategoryId: UUID! +) @auth(level: USER) { + role_insert( + data: { + name: $name + costPerHour: $costPerHour + vendorId: $vendorId + roleCategoryId: $roleCategoryId + } + ) +} + + +mutation updateRole( + $id: UUID! + $name: String + $costPerHour: Float + $roleCategoryId: UUID! +) @auth(level: USER) { + role_update( + id: $id + data: { + name: $name + costPerHour: $costPerHour + roleCategoryId: $roleCategoryId + } + ) +} + +mutation deleteRole($id: UUID!) @auth(level: USER) { + role_delete(id: $id) +} diff --git a/backend/dataconnect/example/role/queries.gql b/backend/dataconnect/example/role/queries.gql new file mode 100644 index 00000000..3cd66ace --- /dev/null +++ b/backend/dataconnect/example/role/queries.gql @@ -0,0 +1,43 @@ +query listRoles @auth(level: USER) { + roles { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query getRoleById($id: UUID!) @auth(level: USER) { + role(id: $id) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query listRolesByVendorId($vendorId: UUID!) @auth(level: USER) { + roles(where: { vendorId: { eq: $vendorId } }) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} + +query listRolesByroleCategoryId($roleCategoryId: UUID!) @auth(level: USER) { + roles(where: { roleCategoryId: { eq: $roleCategoryId } }) { + id + name + costPerHour + vendorId + roleCategoryId + createdAt + } +} diff --git a/backend/dataconnect/example/roleCategory/mutations.gql b/backend/dataconnect/example/roleCategory/mutations.gql new file mode 100644 index 00000000..d09d9c03 --- /dev/null +++ b/backend/dataconnect/example/roleCategory/mutations.gql @@ -0,0 +1,29 @@ +mutation createRoleCategory( + $roleName: String!, + $category: RoleCategoryType! +) @auth(level: USER) { + roleCategory_insert( + data: { + roleName: $roleName, + category: $category + } + ) +} + +mutation updateRoleCategory( + $id: UUID!, + $roleName: String, + $category: RoleCategoryType +) @auth(level: USER) { + roleCategory_update( + id: $id, + data: { + roleName: $roleName, + category: $category + } + ) +} + +mutation deleteRoleCategory($id: UUID!) @auth(level: USER) { + roleCategory_delete(id: $id) +} diff --git a/backend/dataconnect/example/roleCategory/queries.gql b/backend/dataconnect/example/roleCategory/queries.gql new file mode 100644 index 00000000..10e2a84a --- /dev/null +++ b/backend/dataconnect/example/roleCategory/queries.gql @@ -0,0 +1,27 @@ +query listRoleCategories @auth(level: USER) { + roleCategories { + id + roleName + category + createdAt + updatedAt + } +} + +query getRoleCategoryById($id: UUID!) @auth(level: USER) { + roleCategory(id: $id) { + id + roleName + category + createdAt + updatedAt + } +} + +query getRoleCategoriesByCategory($category: RoleCategoryType!) @auth(level: USER) { + roleCategories(where: { category: { eq: $category } }) { + id + roleName + category + } +} diff --git a/backend/dataconnect/example/shift/mutations.gql b/backend/dataconnect/example/shift/mutations.gql new file mode 100644 index 00000000..0a81f9bc --- /dev/null +++ b/backend/dataconnect/example/shift/mutations.gql @@ -0,0 +1,134 @@ + +mutation createShift( + $title: String! + $orderId: UUID! + + $date: Timestamp + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $cost: Float + + $location: String + $locationAddress: String + $latitude: Float + $longitude: Float + $placeId: String + $city: String + $state: String + $street: String + $country: String + $description: String + + $status: ShiftStatus + $workersNeeded: Int + $filled: Int + $filledAt: Timestamp + + $managers: [Any!] + $durationDays: Int + + $createdBy: String +) @auth(level: USER) { + shift_insert( + data: { + title: $title + orderId: $orderId + + date: $date + startTime: $startTime + endTime: $endTime + hours: $hours + cost: $cost + + location: $location + locationAddress: $locationAddress + latitude: $latitude + longitude: $longitude + placeId: $placeId + city: $city + state: $state + street: $street + country: $country + description: $description + + status: $status + workersNeeded: $workersNeeded + filled: $filled + filledAt: $filledAt + + managers: $managers + durationDays: $durationDays + } + ) +} + +mutation updateShift( + $id: UUID! + $title: String + $orderId: UUID + + $date: Timestamp + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $cost: Float + + $location: String + $locationAddress: String + $latitude: Float + $longitude: Float + $placeId: String + $city: String + $state: String + $street: String + $country: String + $description: String + + $status: ShiftStatus + $workersNeeded: Int + $filled: Int + $filledAt: Timestamp + + $managers: [Any!] + $durationDays: Int + +) @auth(level: USER) { + shift_update( + id: $id + data: { + title: $title + orderId: $orderId + + date: $date + startTime: $startTime + endTime: $endTime + hours: $hours + cost: $cost + + location: $location + locationAddress: $locationAddress + latitude: $latitude + longitude: $longitude + placeId: $placeId + city: $city + state: $state + street: $street + country: $country + description: $description + + status: $status + workersNeeded: $workersNeeded + filled: $filled + filledAt: $filledAt + + managers: $managers + durationDays: $durationDays + + } + ) +} + +mutation deleteShift($id: UUID!) @auth(level: USER) { + shift_delete(id: $id) +} diff --git a/backend/dataconnect/example/shift/queries.gql b/backend/dataconnect/example/shift/queries.gql new file mode 100644 index 00000000..96fdfbe8 --- /dev/null +++ b/backend/dataconnect/example/shift/queries.gql @@ -0,0 +1,307 @@ + +# ------------------------------------------------------------ +# LIST SHIFTS (paginated) +# ------------------------------------------------------------ +query listShifts( + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts(offset: $offset, limit: $limit) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + placeId + city + state + street + country + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# GET SHIFT BY ID +# ------------------------------------------------------------ +query getShiftById($id: UUID!) @auth(level: USER) { + shift(id: $id) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + placeId + city + state + street + country + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# FILTER SHIFTS (by status/orderId/date range) +# NOTE: Timestamp filters use ge/le (not gte/lte) +# ------------------------------------------------------------ +query filterShifts( + $status: ShiftStatus + $orderId: UUID + + $dateFrom: Timestamp + $dateTo: Timestamp + + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + status: { eq: $status } + orderId: { eq: $orderId } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + placeId + city + state + street + country + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# BUSINESS: GET SHIFTS FOR A BUSINESS (via order.businessId) +# ------------------------------------------------------------ +query getShiftsByBusinessId( + $businessId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + placeId + city + state + street + country + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} + +# ------------------------------------------------------------ +# VENDOR: GET SHIFTS FOR A VENDOR (via order.vendorId) +# ------------------------------------------------------------ +query getShiftsByVendorId( + $vendorId: UUID! + $dateFrom: Timestamp + $dateTo: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { vendorId: { eq: $vendorId } } + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + title + + orderId + + date + startTime + endTime + hours + cost + + location + locationAddress + latitude + longitude + placeId + city + state + street + country + description + + status + workersNeeded + filled + filledAt + + managers + durationDays + + createdAt + updatedAt + createdBy + + order { + id + eventName + status + orderType + businessId + vendorId + business { id businessName email contactName } + vendor { id companyName } + } + } +} diff --git a/backend/dataconnect/example/shiftRole/mutations.gql b/backend/dataconnect/example/shiftRole/mutations.gql new file mode 100644 index 00000000..d7225ef8 --- /dev/null +++ b/backend/dataconnect/example/shiftRole/mutations.gql @@ -0,0 +1,65 @@ +mutation createShiftRole( + $shiftId: UUID! + $roleId: UUID! + $count: Int! + $assigned: Int + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $department: String + $uniform: String + $breakType: BreakDuration + $totalValue: Float +) @auth(level: USER) { + shiftRole_insert( + data: { + shiftId: $shiftId + roleId: $roleId + count: $count + assigned: $assigned + startTime: $startTime + endTime: $endTime + hours: $hours + department: $department + uniform: $uniform + breakType: $breakType + totalValue: $totalValue + } + ) +} + +mutation updateShiftRole( + $shiftId: UUID! + $roleId: UUID! + $count: Int + $assigned: Int + $startTime: Timestamp + $endTime: Timestamp + $hours: Float + $department: String + $uniform: String + $breakType: BreakDuration + $totalValue: Float +) @auth(level: USER) { + shiftRole_update( + key: { shiftId: $shiftId, roleId: $roleId } + data: { + count: $count + assigned: $assigned + startTime: $startTime + endTime: $endTime + hours: $hours + department: $department + uniform: $uniform + breakType: $breakType + totalValue: $totalValue + } + ) +} + +mutation deleteShiftRole( + $shiftId: UUID! + $roleId: UUID! +) @auth(level: USER) { + shiftRole_delete(key: { shiftId: $shiftId, roleId: $roleId }) +} diff --git a/backend/dataconnect/example/shiftRole/queries.gql b/backend/dataconnect/example/shiftRole/queries.gql new file mode 100644 index 00000000..46ac263d --- /dev/null +++ b/backend/dataconnect/example/shiftRole/queries.gql @@ -0,0 +1,609 @@ + +query getShiftRoleById( + $shiftId: UUID! + $roleId: UUID! + ) @auth(level: USER) { + shiftRole(key: { shiftId: $shiftId, roleId: $roleId }) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + } +} + +query listShiftRolesByShiftId( + $shiftId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { shiftId: { eq: $shiftId } } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + } +} + +query listShiftRolesByRoleId( + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { roleId: { eq: $roleId } } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + + } +} + +query listShiftRolesByShiftIdAndTimeRange( + $shiftId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shiftId: { eq: $shiftId } + startTime: { ge: $start } + endTime: { le: $end } + } + offset: $offset + limit: $limit + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift{ + location + locationAddress + description + orderId + + order{ + recurringDays + permanentDays + notes + + business{ + id + businessName + } + + vendor{ + id + companyName + } + + } + } + + } +} + +# ------------------------------------------------------------ +# LIST SHIFT ROLES BY VENDOR (via Shift -> Order) +# ------------------------------------------------------------ +query listShiftRolesByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + order: { + vendorId: { eq: $vendorId } + } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift { + id + title + date + location + locationAddress + description + orderId + + order { + id + eventName + vendorId + businessId + orderType + status + date + recurringDays + permanentDays + notes + + business { id businessName } + vendor { id companyName } + } + } + } +} + + +# ------------------------------------------------------------ +# LIST SHIFT ROLES BY VENDOR and Date Range (via Shift -> Order) +# ------------------------------------------------------------ +#for find shifts in staff app +query listShiftRolesByVendorIdAndDateRange( + $vendorId: UUID! + $start: Timestamp! + $end: Timestamp! + $status: ShiftStatus + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + status: { eq: $status } + order: { + vendorId: { eq: $vendorId } + } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + department + uniform + breakType + totalValue + createdAt + + role { + id + name + costPerHour + } + + shift { + id + title + date + location + locationAddress + description + orderId + + order { + id + eventName + vendorId + businessId + orderType + status + date + recurringDays + permanentDays + notes + + business { id businessName } + vendor { id companyName } + } + } + } +} + +#orders view client +query listShiftRolesByBusinessAndDateRange( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int + $status: ShiftStatus +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + order: { businessId: { eq: $businessId } } + status: { eq: $status } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + shiftId + roleId + count + assigned + hours + startTime + endTime + totalValue + role { id name } + shift { + id + date + location + locationAddress + title + status + order { id eventName } + } + } +} + +#list shiftsroles for update order in client app +query listShiftRolesByBusinessAndOrder( + $businessId: UUID! + $orderId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + orderId: { eq: $orderId } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + shiftId + roleId + count + assigned + startTime + endTime + hours + breakType + totalValue + createdAt + + role { id name costPerHour } + + shift { + id + title + date + orderId + location + locationAddress + + order{ + vendorId + eventName + date + #location + + teamHub { + address + placeId + hubName + } + + } + } + } +} + +#reorder get list by businessId +query listShiftRolesByBusinessDateRangeCompletedOrders( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + order: { + businessId: { eq: $businessId } + status: { eq: COMPLETED } + } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + shiftId + roleId + count + assigned + hours + startTime + endTime + totalValue + + role { + id + name + costPerHour + } + + shift { + id + date + location + locationAddress + title + status + + order { + id + orderType + } + } + } +} + +#view for billing period +query listShiftRolesByBusinessAndDatesSummary( + $businessId: UUID! + $start: Timestamp! + $end: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shiftRoles( + where: { + shift: { + date: { ge: $start, le: $end } + status: { eq: COMPLETED } + order: { businessId: { eq: $businessId } } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + roleId + hours + totalValue + role { id name } + } +} + +# ------------------------------------------------------------ +# BUSINESS: GET COMPLETED SHIFTS FOR A BUSINESS (via order.businessId) +# ------------------------------------------------------------ +#for spending insights in home view +query getCompletedShiftsByBusinessId( + $businessId: UUID! + $dateFrom: Timestamp! + $dateTo: Timestamp! + $offset: Int + $limit: Int +) @auth(level: USER) { + shifts( + where: { + order: { businessId: { eq: $businessId } } + status: {in: [IN_PROGRESS, CONFIRMED, COMPLETED, OPEN]} + date: { ge: $dateFrom, le: $dateTo } + } + offset: $offset + limit: $limit + ) { + id + #title + + #orderId + + date + startTime + endTime + hours + cost + + #location + #locationAddress + #latitude + #longitude + #description + + #status + workersNeeded + filled + #filledAt + + #managers + #durationDays + + createdAt + + order { + #id + #eventName + status + #orderType + #businessId + #vendorId + #business { id businessName email contactName } + #vendor { id companyName } + } + } +} diff --git a/backend/dataconnect/example/staff/mutations.gql b/backend/dataconnect/example/staff/mutations.gql new file mode 100644 index 00000000..17e2e25e --- /dev/null +++ b/backend/dataconnect/example/staff/mutations.gql @@ -0,0 +1,184 @@ +mutation CreateStaff( + $userId: String! + $fullName: String! + $level: String + $role: String + $phone: String + $email: String + $photoUrl: String + + $totalShifts: Int + $averageRating: Float + $onTimeRate: Int + $noShowCount: Int + $cancellationCount: Int + $reliabilityScore: Int + + $bio: String + $skills: [String!] + $industries: [String!] + $preferredLocations: [String!] + $maxDistanceMiles: Int + $languages: Any + $itemsAttire: Any + + $xp: Int + $badges: Any + $isRecommended: Boolean + + $ownerId: UUID + $department: DepartmentType + $hubId: UUID + $manager: UUID + $english: EnglishProficiency + + + + $backgroundCheckStatus: BackgroundCheckStatus + $employmentType: EmploymentType + $initial: String + $englishRequired: Boolean + $city: String + $addres: String +) @auth(level: USER) { + staff_insert( + data: { + userId: $userId + fullName: $fullName + level: $level + role: $role + phone: $phone + email: $email + photoUrl: $photoUrl + + totalShifts: $totalShifts + averageRating: $averageRating + onTimeRate: $onTimeRate + noShowCount: $noShowCount + cancellationCount: $cancellationCount + reliabilityScore: $reliabilityScore + + bio: $bio + skills: $skills + industries: $industries + preferredLocations: $preferredLocations + maxDistanceMiles: $maxDistanceMiles + languages: $languages + itemsAttire: $itemsAttire + + xp: $xp + badges: $badges + isRecommended: $isRecommended + + ownerId: $ownerId + department: $department + hubId: $hubId + manager: $manager + english: $english + + backgroundCheckStatus: $backgroundCheckStatus + employmentType: $employmentType + initial: $initial + englishRequired: $englishRequired + city: $city + addres: $addres + + } + ) +} + +mutation UpdateStaff( + $id: UUID! + + $userId: String + $fullName: String + $level: String + $role: String + $phone: String + $email: String + $photoUrl: String + + $totalShifts: Int + $averageRating: Float + $onTimeRate: Int + $noShowCount: Int + $cancellationCount: Int + $reliabilityScore: Int + + $bio: String + $skills: [String!] + $industries: [String!] + $preferredLocations: [String!] + $maxDistanceMiles: Int + $languages: Any + $itemsAttire: Any + + $xp: Int + $badges: Any + $isRecommended: Boolean + + $ownerId: UUID + $department: DepartmentType + $hubId: UUID + $manager: UUID + $english: EnglishProficiency + + + + $backgroundCheckStatus: BackgroundCheckStatus + $employmentType: EmploymentType + $initial: String + $englishRequired: Boolean + $city: String + $addres: String +) @auth(level: USER) { + staff_update( + id: $id + data: { + userId: $userId + fullName: $fullName + level: $level + role: $role + phone: $phone + email: $email + photoUrl: $photoUrl + + totalShifts: $totalShifts + averageRating: $averageRating + onTimeRate: $onTimeRate + noShowCount: $noShowCount + cancellationCount: $cancellationCount + reliabilityScore: $reliabilityScore + + bio: $bio + skills: $skills + industries: $industries + preferredLocations: $preferredLocations + maxDistanceMiles: $maxDistanceMiles + languages: $languages + itemsAttire: $itemsAttire + + xp: $xp + badges: $badges + isRecommended: $isRecommended + + ownerId: $ownerId + department: $department + hubId: $hubId + manager: $manager + english: $english + + backgroundCheckStatus: $backgroundCheckStatus + employmentType: $employmentType + initial: $initial + englishRequired: $englishRequired + city: $city + addres: $addres + + } + ) +} + +mutation DeleteStaff($id: UUID!) @auth(level: USER) { + staff_delete(id: $id) +} diff --git a/backend/dataconnect/example/staff/queries.gql b/backend/dataconnect/example/staff/queries.gql new file mode 100644 index 00000000..5b9dc6f5 --- /dev/null +++ b/backend/dataconnect/example/staff/queries.gql @@ -0,0 +1,174 @@ +query listStaff @auth(level: USER) { + staffs { + id + userId + fullName + level + role + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query getStaffById($id: UUID!) @auth(level: USER) { + staff(id: $id) { + id + userId + fullName + role + level + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + updatedAt + createdBy + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query getStaffByUserId($userId: String!) @auth(level: USER) { + staffs(where: { userId: { eq: $userId } }) { + id + userId + fullName + level + phone + email + photoUrl + + totalShifts + averageRating + onTimeRate + noShowCount + cancellationCount + reliabilityScore + xp + badges + isRecommended + + bio + skills + industries + preferredLocations + maxDistanceMiles + languages + itemsAttire + + ownerId + createdAt + updatedAt + createdBy + department + hubId + manager + english + + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} + +query filterStaff( + $ownerId: UUID + $fullName: String + $level: String + $email: String +) @auth(level: USER) { + staffs( + where: { + ownerId: { eq: $ownerId } + fullName: { eq: $fullName } + level: { eq: $level } + email: { eq: $email } + } + ) { + id + userId + fullName + level + phone + email + photoUrl + averageRating + reliabilityScore + totalShifts + ownerId + isRecommended + skills + industries + backgroundCheckStatus + employmentType + initial + englishRequired + city + addres + } +} diff --git a/backend/dataconnect/example/staffAvailability/mutations.gql b/backend/dataconnect/example/staffAvailability/mutations.gql new file mode 100644 index 00000000..91f95a5e --- /dev/null +++ b/backend/dataconnect/example/staffAvailability/mutations.gql @@ -0,0 +1,44 @@ + +mutation createStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! + $status: AvailabilityStatus + $notes: String +) @auth(level: USER) { + staffAvailability_insert( + data: { + staffId: $staffId + day: $day + slot: $slot + status: $status + notes: $notes + } + ) +} + +mutation updateStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! + $status: AvailabilityStatus + $notes: String +) @auth(level: USER) { + staffAvailability_update( + key: { staffId: $staffId, day: $day, slot: $slot } + data: { + status: $status + notes: $notes + } + ) +} + +mutation deleteStaffAvailability( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! +) @auth(level: USER) { + staffAvailability_delete( + key: { staffId: $staffId, day: $day, slot: $slot } + ) +} diff --git a/backend/dataconnect/example/staffAvailability/queries.gql b/backend/dataconnect/example/staffAvailability/queries.gql new file mode 100644 index 00000000..e9d5ef11 --- /dev/null +++ b/backend/dataconnect/example/staffAvailability/queries.gql @@ -0,0 +1,87 @@ + +query listStaffAvailabilities( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities(offset: $offset, limit: $limit) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query listStaffAvailabilitiesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query getStaffAvailabilityByKey( + $staffId: UUID! + $day: DayOfWeek! + $slot: AvailabilitySlot! +) @auth(level: USER) { + staffAvailability(key: { staffId: $staffId, day: $day, slot: $slot }) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} + +query listStaffAvailabilitiesByDay( + $day: DayOfWeek! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilities( + where: { day: { eq: $day } } + offset: $offset + limit: $limit + ) { + id + staffId + day + slot + status + notes + createdAt + updatedAt + createdBy + + staff { id fullName } + } +} diff --git a/backend/dataconnect/example/staffAvailabilityStats/mutations.gql b/backend/dataconnect/example/staffAvailabilityStats/mutations.gql new file mode 100644 index 00000000..25d3926d --- /dev/null +++ b/backend/dataconnect/example/staffAvailabilityStats/mutations.gql @@ -0,0 +1,54 @@ + +mutation createStaffAvailabilityStats( + $staffId: UUID! + $needWorkIndex: Int + $utilizationPercentage: Int + $predictedAvailabilityScore: Int + $scheduledHoursThisPeriod: Int + $desiredHoursThisPeriod: Int + $lastShiftDate: Timestamp + $acceptanceRate: Int +) @auth(level: USER) { + staffAvailabilityStats_insert( + data: { + staffId: $staffId + needWorkIndex: $needWorkIndex + utilizationPercentage: $utilizationPercentage + predictedAvailabilityScore: $predictedAvailabilityScore + scheduledHoursThisPeriod: $scheduledHoursThisPeriod + desiredHoursThisPeriod: $desiredHoursThisPeriod + lastShiftDate: $lastShiftDate + acceptanceRate: $acceptanceRate + } + ) +} + +mutation updateStaffAvailabilityStats( + $staffId: UUID! + $needWorkIndex: Int + $utilizationPercentage: Int + $predictedAvailabilityScore: Int + $scheduledHoursThisPeriod: Int + $desiredHoursThisPeriod: Int + $lastShiftDate: Timestamp + $acceptanceRate: Int +) @auth(level: USER) { + staffAvailabilityStats_update( + key: { staffId: $staffId } + data: { + needWorkIndex: $needWorkIndex + utilizationPercentage: $utilizationPercentage + predictedAvailabilityScore: $predictedAvailabilityScore + scheduledHoursThisPeriod: $scheduledHoursThisPeriod + desiredHoursThisPeriod: $desiredHoursThisPeriod + lastShiftDate: $lastShiftDate + acceptanceRate: $acceptanceRate + } + ) +} + +mutation deleteStaffAvailabilityStats( + $staffId: UUID! +) @auth(level: USER) { + staffAvailabilityStats_delete(key: { staffId: $staffId }) +} diff --git a/backend/dataconnect/example/staffAvailabilityStats/queries.gql b/backend/dataconnect/example/staffAvailabilityStats/queries.gql new file mode 100644 index 00000000..a1d658ca --- /dev/null +++ b/backend/dataconnect/example/staffAvailabilityStats/queries.gql @@ -0,0 +1,109 @@ +# ========================================================== +# StaffAvailabilityStats - QUERIES +# ========================================================== +# Notes: +# - Entity key is composite: key: ["staffId"] +# - So the single-record lookup is: staffAvailabilityStats(key: { staffId: ... }) +# - There is no Query.staffAvailabilityStat(id: ...) unless you defined id as the key. +# ========================================================== + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listStaffAvailabilityStats( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilityStatss(offset: $offset, limit: $limit) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (staffId) +# ---------------------------------------------------------- +query getStaffAvailabilityStatsByStaffId( + $staffId: UUID! +) @auth(level: USER) { + staffAvailabilityStats(key: { staffId: $staffId }) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} + +# ---------------------------------------------------------- +# FILTER (optional) - useful for dashboards +# NOTE: Data Connect filter ops are typically: eq, ne, gt, ge, lt, le, in, isNull +# ---------------------------------------------------------- +query filterStaffAvailabilityStats( + $needWorkIndexMin: Int + $needWorkIndexMax: Int + $utilizationMin: Int + $utilizationMax: Int + $acceptanceRateMin: Int + $acceptanceRateMax: Int + $lastShiftAfter: Timestamp + $lastShiftBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + staffAvailabilityStatss( + where: { + needWorkIndex: { ge: $needWorkIndexMin, le: $needWorkIndexMax } + utilizationPercentage: { ge: $utilizationMin, le: $utilizationMax } + acceptanceRate: { ge: $acceptanceRateMin, le: $acceptanceRateMax } + lastShiftDate: { ge: $lastShiftAfter, le: $lastShiftBefore } + } + offset: $offset + limit: $limit + ) { + id + staffId + needWorkIndex + utilizationPercentage + predictedAvailabilityScore + scheduledHoursThisPeriod + desiredHoursThisPeriod + lastShiftDate + acceptanceRate + createdAt + updatedAt + createdBy + + staff { + id + fullName + } + } +} diff --git a/backend/dataconnect/example/staffCourse/mutations.gql b/backend/dataconnect/example/staffCourse/mutations.gql new file mode 100644 index 00000000..90801b9b --- /dev/null +++ b/backend/dataconnect/example/staffCourse/mutations.gql @@ -0,0 +1,47 @@ +# Mutations for StaffCourse + +mutation createStaffCourse( + $staffId: UUID! + $courseId: UUID! + $progressPercent: Int + $completed: Boolean + $completedAt: Timestamp + $startedAt: Timestamp + $lastAccessedAt: Timestamp +) @auth(level: USER) { + staffCourse_insert( + data: { + staffId: $staffId + courseId: $courseId + progressPercent: $progressPercent + completed: $completed + completedAt: $completedAt + startedAt: $startedAt + lastAccessedAt: $lastAccessedAt + } + ) +} + +mutation updateStaffCourse( + $id: UUID! + $progressPercent: Int + $completed: Boolean + $completedAt: Timestamp + $startedAt: Timestamp + $lastAccessedAt: Timestamp +) @auth(level: USER) { + staffCourse_update( + id: $id + data: { + progressPercent: $progressPercent + completed: $completed + completedAt: $completedAt + startedAt: $startedAt + lastAccessedAt: $lastAccessedAt + } + ) +} + +mutation deleteStaffCourse($id: UUID!) @auth(level: USER) { + staffCourse_delete(id: $id) +} diff --git a/backend/dataconnect/example/staffCourse/queries.gql b/backend/dataconnect/example/staffCourse/queries.gql new file mode 100644 index 00000000..91c6e738 --- /dev/null +++ b/backend/dataconnect/example/staffCourse/queries.gql @@ -0,0 +1,85 @@ +query getStaffCourseById($id: UUID!) @auth(level: USER) { + staffCourse(id: $id) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query listStaffCoursesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffCourses( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query listStaffCoursesByCourseId( + $courseId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffCourses( + where: { courseId: { eq: $courseId } } + offset: $offset + limit: $limit + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + +query getStaffCourseByStaffAndCourse( + $staffId: UUID! + $courseId: UUID! +) @auth(level: USER) { + staffCourses( + where: { + staffId: { eq: $staffId } + courseId: { eq: $courseId } + } + limit: 1 + ) { + id + staffId + courseId + progressPercent + completed + completedAt + startedAt + lastAccessedAt + createdAt + updatedAt + } +} + diff --git a/backend/dataconnect/example/staffDocument/mutations.gql b/backend/dataconnect/example/staffDocument/mutations.gql new file mode 100644 index 00000000..8877dd02 --- /dev/null +++ b/backend/dataconnect/example/staffDocument/mutations.gql @@ -0,0 +1,43 @@ + +mutation createStaffDocument( + $staffId: UUID! + $staffName: String! + $documentId: UUID! + $status: DocumentStatus! + $documentUrl: String + $expiryDate: Timestamp +) @auth(level: USER) { + staffDocument_insert( + data: { + staffId: $staffId + staffName: $staffName + documentId: $documentId + status: $status + documentUrl: $documentUrl + expiryDate: $expiryDate + } + ) +} + +mutation updateStaffDocument( + $staffId: UUID! + $documentId: UUID! + $status: DocumentStatus + $documentUrl: String + $expiryDate: Timestamp +) @auth(level: USER) { + staffDocument_update( + key: { staffId: $staffId, documentId: $documentId } + data: { + status: $status + documentUrl: $documentUrl + } + ) +} + +mutation deleteStaffDocument( + $staffId: UUID! + $documentId: UUID! +) @auth(level: USER) { + staffDocument_delete(key: { staffId: $staffId, documentId: $documentId }) +} diff --git a/backend/dataconnect/example/staffDocument/queries.gql b/backend/dataconnect/example/staffDocument/queries.gql new file mode 100644 index 00000000..77e6cc6f --- /dev/null +++ b/backend/dataconnect/example/staffDocument/queries.gql @@ -0,0 +1,100 @@ + +query getStaffDocumentByKey( + $staffId: UUID! + $documentId: UUID! +) @auth(level: USER) { + staffDocument(key: { staffId: $staffId, documentId: $documentId }) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + createdAt + updatedAt + document { + id + name + documentType + description + } + } +} + +query listStaffDocumentsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + createdAt + updatedAt + document { + id + name + documentType + } + } +} + +query listStaffDocumentsByDocumentType( + $documentType: DocumentType! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { document: { documentType: { eq: $documentType } } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + document { + id + name + documentType + } + } +} + +query listStaffDocumentsByStatus( + $status: DocumentStatus! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffDocuments( + where: { status: { eq: $status } } + offset: $offset + limit: $limit + ) { + id + staffId + staffName + documentId + status + documentUrl + expiryDate + document { + id + name + documentType + } + } +} diff --git a/backend/dataconnect/example/staffRole/mutations.gql b/backend/dataconnect/example/staffRole/mutations.gql new file mode 100644 index 00000000..a2857979 --- /dev/null +++ b/backend/dataconnect/example/staffRole/mutations.gql @@ -0,0 +1,22 @@ +mutation createStaffRole( + $staffId: UUID! + $roleId: UUID! + $roleType: RoleType +) @auth(level: USER) { + staffRole_insert( + data: { + staffId: $staffId + roleId: $roleId + roleType: $roleType + } + ) +} + +mutation deleteStaffRole( + $staffId: UUID! + $roleId: UUID! +) @auth(level: USER) { + staffRole_delete( + key: { staffId: $staffId, roleId: $roleId } + ) +} diff --git a/backend/dataconnect/example/staffRole/queries.gql b/backend/dataconnect/example/staffRole/queries.gql new file mode 100644 index 00000000..560cbf56 --- /dev/null +++ b/backend/dataconnect/example/staffRole/queries.gql @@ -0,0 +1,142 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listStaffRoles( + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles(offset: $offset, limit: $limit) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# GET BY COMPOSITE KEY (staffId + roleId) +# ---------------------------------------------------------- +query getStaffRoleByKey( + $staffId: UUID! + $roleId: UUID! +) @auth(level: USER) { + staffRole(key: { staffId: $staffId, roleId: $roleId }) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# LIST BY STAFF (most common) +# ---------------------------------------------------------- +query listStaffRolesByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + + role { + id + name + costPerHour + } + } +} + +# ---------------------------------------------------------- +# LIST BY ROLE (who has this skill) +# ---------------------------------------------------------- +query listStaffRolesByRoleId( + $roleId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { roleId: { eq: $roleId } } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + + staff { + id + fullName + userId + email + phone + } + } +} + +# ---------------------------------------------------------- +# FILTER (optional) +# Useful when you want both conditions without using key lookup +# ---------------------------------------------------------- +query filterStaffRoles( + $staffId: UUID + $roleId: UUID + $offset: Int + $limit: Int +) @auth(level: USER) { + staffRoles( + where: { + staffId: { eq: $staffId } + roleId: { eq: $roleId } + } + offset: $offset + limit: $limit + ) { + id + staffId + roleId + createdAt + roleType + } +} \ No newline at end of file diff --git a/backend/dataconnect/example/task/mutations.gql b/backend/dataconnect/example/task/mutations.gql new file mode 100644 index 00000000..a9c1040e --- /dev/null +++ b/backend/dataconnect/example/task/mutations.gql @@ -0,0 +1,64 @@ +mutation createTask( + $taskName: String! + $description: String + $priority: TaskPriority! + $status: TaskStatus! + $dueDate: Timestamp + $progress: Int + $orderIndex: Int + $commentCount: Int + $attachmentCount: Int + $files: Any + $ownerId:UUID! +) @auth(level: USER) { + task_insert( + data: { + taskName: $taskName + description: $description + priority: $priority + status: $status + dueDate: $dueDate + progress: $progress + orderIndex: $orderIndex + commentCount: $commentCount + attachmentCount: $attachmentCount + files: $files + ownerId:$ownerId + } + ) +} + +mutation updateTask( + $id: UUID! + $taskName: String + $description: String + $priority: TaskPriority + $status: TaskStatus + $dueDate: Timestamp + $progress: Int + $assignedMembers: Any + $orderIndex: Int + $commentCount: Int + $attachmentCount: Int + $files: Any +) @auth(level: USER) { + task_update( + id: $id + data: { + taskName: $taskName + description: $description + priority: $priority + status: $status + dueDate: $dueDate + progress: $progress + orderIndex: $orderIndex + commentCount: $commentCount + attachmentCount: $attachmentCount + files: $files + } + ) +} + +mutation deleteTask($id: UUID!) @auth(level: USER) { + task_delete(id: $id) +} diff --git a/backend/dataconnect/example/task/queries.gql b/backend/dataconnect/example/task/queries.gql new file mode 100644 index 00000000..bc315e0d --- /dev/null +++ b/backend/dataconnect/example/task/queries.gql @@ -0,0 +1,83 @@ +query listTasks @auth(level: USER) { + tasks { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query getTaskById($id: UUID!) @auth(level: USER) { + task(id: $id) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query getTasksByOwnerId($ownerId: UUID!) @auth(level: USER) { + tasks(where: { ownerId: { eq: $ownerId } }) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} + +query filterTasks( + $status: TaskStatus + $priority: TaskPriority +) @auth(level: USER) { + tasks( + where: { + status: { eq: $status } + priority: { eq: $priority } + } + ) { + id + taskName + description + priority + status + dueDate + progress + orderIndex + commentCount + attachmentCount + files + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/task_comment/mutations.gql b/backend/dataconnect/example/task_comment/mutations.gql new file mode 100644 index 00000000..432cab97 --- /dev/null +++ b/backend/dataconnect/example/task_comment/mutations.gql @@ -0,0 +1,33 @@ +mutation createTaskComment( + $taskId: UUID! + $teamMemberId: UUID! + $comment: String! + $isSystem: Boolean +) @auth(level: USER) { + taskComment_insert( + data: { + taskId: $taskId + teamMemberId: $teamMemberId + comment: $comment + isSystem: $isSystem + } + ) +} + +mutation updateTaskComment( + $id: UUID! + $comment: String + $isSystem: Boolean +) @auth(level: USER) { + taskComment_update( + id: $id + data: { + comment: $comment + isSystem: $isSystem + } + ) +} + +mutation deleteTaskComment($id: UUID!) @auth(level: USER) { + taskComment_delete(id: $id) +} diff --git a/backend/dataconnect/example/task_comment/queries.gql b/backend/dataconnect/example/task_comment/queries.gql new file mode 100644 index 00000000..48afc3f9 --- /dev/null +++ b/backend/dataconnect/example/task_comment/queries.gql @@ -0,0 +1,62 @@ +query listTaskComments @auth(level: USER) { + taskComments { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +query getTaskCommentById($id: UUID!) @auth(level: USER) { + taskComment(id: $id) { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} + +query getTaskCommentsByTaskId($taskId: UUID!) @auth(level: USER) { + taskComments(where: { taskId: { eq: $taskId } }) { + id + taskId + teamMemberId + comment + isSystem + createdAt + + teamMember{ + + user { + fullName + email + } + + } + + } +} diff --git a/backend/dataconnect/example/taxForm/mutations.gql b/backend/dataconnect/example/taxForm/mutations.gql new file mode 100644 index 00000000..868ed420 --- /dev/null +++ b/backend/dataconnect/example/taxForm/mutations.gql @@ -0,0 +1,169 @@ +mutation createTaxForm( + $formType: TaxFormType! + $firstName: String! + $lastName: String! + $mInitial: String + $oLastName: String + $dob: Timestamp + $socialSN: Int! + $email: String + $phone: String + $address: String! + $city: String + $apt: String + $state: String + $zipCode: String + + # W-4 + $marital: MaritalStatus + $multipleJob: Boolean + $childrens: Int + $otherDeps: Int + $totalCredits: Float + $otherInconme: Float + $deductions: Float + $extraWithholding: Float + + # I-9 + $citizen: CitizenshipStatus + $uscis: String + $passportNumber: String + $countryIssue: String + $prepartorOrTranslator: Boolean + + # both + $signature: String + $date: Timestamp + + $status: TaxFormStatus! + $staffId: UUID! + $createdBy: String +) @auth(level: USER) { + taxForm_insert( + data: { + formType: $formType + firstName: $firstName + lastName: $lastName + mInitial: $mInitial + oLastName: $oLastName + dob: $dob + socialSN: $socialSN + email: $email + phone: $phone + address: $address + city: $city + apt: $apt + state: $state + zipCode: $zipCode + + marital: $marital + multipleJob: $multipleJob + childrens: $childrens + otherDeps: $otherDeps + totalCredits: $totalCredits + otherInconme: $otherInconme + deductions: $deductions + extraWithholding: $extraWithholding + + citizen: $citizen + uscis: $uscis + passportNumber: $passportNumber + countryIssue: $countryIssue + prepartorOrTranslator: $prepartorOrTranslator + + signature: $signature + date: $date + + status: $status + staffId: $staffId + createdBy: $createdBy + } + ) +} + +mutation updateTaxForm( + $id: UUID! + + $formType: TaxFormType + $firstName: String + $lastName: String + $mInitial: String + $oLastName: String + $dob: Timestamp + $socialSN: Int + $email: String + $phone: String + $address: String + $city: String + $apt: String + $state: String + $zipCode: String + + # W-4 + $marital: MaritalStatus + $multipleJob: Boolean + $childrens: Int + $otherDeps: Int + $totalCredits: Float + $otherInconme: Float + $deductions: Float + $extraWithholding: Float + + # I-9 + $citizen: CitizenshipStatus + $uscis: String + $passportNumber: String + $countryIssue: String + $prepartorOrTranslator: Boolean + + # both + $signature: String + $date: Timestamp + + $status: TaxFormStatus + +) @auth(level: USER) { + taxForm_update( + id: $id + data: { + formType: $formType + firstName: $firstName + lastName: $lastName + mInitial: $mInitial + oLastName: $oLastName + dob: $dob + socialSN: $socialSN + email: $email + phone: $phone + address: $address + city: $city + apt: $apt + state: $state + zipCode: $zipCode + + marital: $marital + multipleJob: $multipleJob + childrens: $childrens + otherDeps: $otherDeps + totalCredits: $totalCredits + otherInconme: $otherInconme + deductions: $deductions + extraWithholding: $extraWithholding + + citizen: $citizen + uscis: $uscis + passportNumber: $passportNumber + countryIssue: $countryIssue + prepartorOrTranslator: $prepartorOrTranslator + + signature: $signature + date: $date + + status: $status + } + ) +} + +mutation deleteTaxForm($id: UUID!) @auth(level: USER) { + taxForm_delete(id: $id) +} diff --git a/backend/dataconnect/example/taxForm/queries.gql b/backend/dataconnect/example/taxForm/queries.gql new file mode 100644 index 00000000..0581f24f --- /dev/null +++ b/backend/dataconnect/example/taxForm/queries.gql @@ -0,0 +1,205 @@ + +# ========================================================== +# TAX FORM - QUERIES (USE where, NOT filter) +# Include ALL fields from the new TaxForm type +# ========================================================== + +query listTaxForms($offset: Int, $limit: Int) @auth(level: USER) { + taxForms(offset: $offset, limit: $limit, orderBy: { createdAt: DESC }) { + id + formType + firstName + lastName + mInitial + oLastName + dob + socialSN + email + phone + address + city + apt + state + zipCode + + marital + multipleJob + childrens + otherDeps + totalCredits + otherInconme + deductions + extraWithholding + + citizen + uscis + passportNumber + countryIssue + prepartorOrTranslator + + signature + date + + status + staffId + createdAt + updatedAt + createdBy + } +} + +query getTaxFormById($id: UUID!) @auth(level: USER) { + taxForm(id: $id) { + id + formType + firstName + lastName + mInitial + oLastName + dob + socialSN + email + phone + address + city + apt + state + zipCode + + marital + multipleJob + childrens + otherDeps + totalCredits + otherInconme + deductions + extraWithholding + + citizen + uscis + passportNumber + countryIssue + prepartorOrTranslator + + signature + date + + status + staffId + createdAt + updatedAt + createdBy + } +} + +query getTaxFormsByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + taxForms( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + formType + firstName + lastName + mInitial + oLastName + dob + socialSN + email + phone + address + city + apt + state + zipCode + + marital + multipleJob + childrens + otherDeps + totalCredits + otherInconme + deductions + extraWithholding + + citizen + uscis + passportNumber + countryIssue + prepartorOrTranslator + + signature + date + + status + staffId + createdAt + updatedAt + createdBy + } +} + +query listTaxFormsWhere( + $formType: TaxFormType + $status: TaxFormStatus + $staffId: UUID + $offset: Int + $limit: Int +) @auth(level: USER) { + taxForms( + where: { + formType: { eq: $formType } + status: { eq: $status } + staffId: { eq: $staffId } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + formType + firstName + lastName + mInitial + oLastName + dob + socialSN + email + phone + address + city + apt + state + zipCode + + marital + multipleJob + childrens + otherDeps + totalCredits + otherInconme + deductions + extraWithholding + + citizen + uscis + passportNumber + countryIssue + prepartorOrTranslator + + signature + date + + status + staffId + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/team/mutations.gql b/backend/dataconnect/example/team/mutations.gql new file mode 100644 index 00000000..70c87e5a --- /dev/null +++ b/backend/dataconnect/example/team/mutations.gql @@ -0,0 +1,73 @@ +mutation createTeam( + $teamName: String! + $ownerId: UUID! + $ownerName: String! + $ownerRole: String! + $email: String + $companyLogo: String + $totalMembers: Int + $activeMembers: Int + $totalHubs: Int + $departments: Any + $favoriteStaffCount: Int + $blockedStaffCount: Int + $favoriteStaff: Any + $blockedStaff: Any +) @auth(level: USER) { + team_insert( + data: { + teamName: $teamName + ownerId: $ownerId + ownerName: $ownerName + ownerRole: $ownerRole + email: $email + companyLogo: $companyLogo + totalMembers: $totalMembers + activeMembers: $activeMembers + totalHubs: $totalHubs + departments: $departments + favoriteStaffCount: $favoriteStaffCount + blockedStaffCount: $blockedStaffCount + favoriteStaff: $favoriteStaff + blockedStaff: $blockedStaff + } + ) +} + +mutation updateTeam( + $id: UUID! + $teamName: String + $ownerName: String + $ownerRole: String + $companyLogo: String + $totalMembers: Int + $activeMembers: Int + $totalHubs: Int + $departments: Any + $favoriteStaffCount: Int + $blockedStaffCount: Int + $favoriteStaff: Any + $blockedStaff: Any +) @auth(level: USER) { + team_update( + id: $id + data: { + teamName: $teamName + ownerName: $ownerName + ownerRole: $ownerRole + companyLogo: $companyLogo + totalMembers: $totalMembers + activeMembers: $activeMembers + totalHubs: $totalHubs + departments: $departments + favoriteStaffCount: $favoriteStaffCount + blockedStaffCount: $blockedStaffCount + favoriteStaff: $favoriteStaff + blockedStaff: $blockedStaff + } + ) +} + +mutation deleteTeam($id: UUID!) @auth(level: USER) { + team_delete(id: $id) +} diff --git a/backend/dataconnect/example/team/queries.gql b/backend/dataconnect/example/team/queries.gql new file mode 100644 index 00000000..85ac4764 --- /dev/null +++ b/backend/dataconnect/example/team/queries.gql @@ -0,0 +1,68 @@ +query listTeams @auth(level: USER) { + teams { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} + +query getTeamById($id: UUID!) @auth(level: USER) { + team(id: $id) { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} + +query getTeamsByOwnerId($ownerId: UUID!) @auth(level: USER) { + teams(where: { ownerId: { eq: $ownerId } }) { + id + teamName + ownerId + ownerName + ownerRole + email + companyLogo + totalMembers + activeMembers + totalHubs + departments + favoriteStaffCount + blockedStaffCount + favoriteStaff + blockedStaff + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/teamHub/mutations.gql b/backend/dataconnect/example/teamHub/mutations.gql new file mode 100644 index 00000000..adf57c42 --- /dev/null +++ b/backend/dataconnect/example/teamHub/mutations.gql @@ -0,0 +1,93 @@ +mutation createTeamHub( + $teamId: UUID! + $hubName: String! + $address: String! + + $placeId: String + $latitude: Float + $longitude: Float + + $city: String + $state: String + $street: String + $country: String + $zipCode: String + + $managerName: String + $isActive: Boolean + $departments: Any +) @auth(level: USER) { + teamHub_insert( + data: { + teamId: $teamId + hubName: $hubName + address: $address + + placeId: $placeId + latitude: $latitude + longitude: $longitude + + city: $city + state: $state + street: $street + country: $country + zipCode: $zipCode + + managerName: $managerName + isActive: $isActive + departments: $departments + + } + ) +} + +mutation updateTeamHub( + $id: UUID! + + $teamId: UUID + $hubName: String + $address: String + + $placeId: String + $latitude: Float + $longitude: Float + + $city: String + $state: String + $street: String + $country: String + $zipCode: String + + $managerName: String + $isActive: Boolean + $departments: Any + +) @auth(level: USER) { + teamHub_update( + id: $id + data: { + teamId: $teamId + hubName: $hubName + address: $address + + placeId: $placeId + latitude: $latitude + longitude: $longitude + + city: $city + state: $state + street: $street + country: $country + zipCode: $zipCode + + managerName: $managerName + isActive: $isActive + departments: $departments + + } + ) +} + +mutation deleteTeamHub($id: UUID!) @auth(level: USER) { + teamHub_delete(id: $id) +} \ No newline at end of file diff --git a/backend/dataconnect/example/teamHub/queries.gql b/backend/dataconnect/example/teamHub/queries.gql new file mode 100644 index 00000000..19619802 --- /dev/null +++ b/backend/dataconnect/example/teamHub/queries.gql @@ -0,0 +1,126 @@ + +# ========================================================== +# TEAM HUB - QUERIES (USE where, NOT filter) +# Include ALL fields in TeamHub +# ========================================================== + +query listTeamHubs($offset: Int, $limit: Int) @auth(level: USER) { + teamHubs(offset: $offset, limit: $limit, orderBy: { createdAt: DESC }) { + id + teamId + hubName + + address + placeId + latitude + longitude + + city + state + street + country + zipCode + + managerName + isActive + departments + + } +} + +query getTeamHubById($id: UUID!) @auth(level: USER) { + teamHub(id: $id) { + id + teamId + hubName + + address + placeId + latitude + longitude + + city + state + street + country + zipCode + + managerName + isActive + departments + + } +} + +query getTeamHubsByTeamId( + $teamId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHubs( + where: { teamId: { eq: $teamId } } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + teamId + hubName + + address + placeId + latitude + longitude + + city + state + street + country + zipCode + + managerName + isActive + departments + + } +} + +# ------------------------------------------------------------ +# LIST TEAM HUBS BY OWNER (Vendor/Business) +# ------------------------------------------------------------ +query listTeamHubsByOwnerId( + $ownerId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHubs( + where: { + team: { + ownerId: { eq: $ownerId } + } + } + offset: $offset + limit: $limit + orderBy: { createdAt: DESC } + ) { + id + teamId + hubName + + address + placeId + latitude + longitude + + city + state + street + country + zipCode + + managerName + isActive + departments + + } +} diff --git a/backend/dataconnect/example/teamHudDeparment/mutations.gql b/backend/dataconnect/example/teamHudDeparment/mutations.gql new file mode 100644 index 00000000..b2e9b176 --- /dev/null +++ b/backend/dataconnect/example/teamHudDeparment/mutations.gql @@ -0,0 +1,35 @@ + +mutation createTeamHudDepartment( + $name: String! + $costCenter: String + $teamHubId: UUID! +) @auth(level: USER) { + teamHudDepartment_insert( + data: { + name: $name + costCenter: $costCenter + teamHubId: $teamHubId + } + ) +} + +mutation updateTeamHudDepartment( + $id: UUID! + + $name: String + $costCenter: String + $teamHubId: UUID +) @auth(level: USER) { + teamHudDepartment_update( + id: $id + data: { + name: $name + costCenter: $costCenter + teamHubId: $teamHubId + } + ) +} + +mutation deleteTeamHudDepartment($id: UUID!) @auth(level: USER) { + teamHudDepartment_delete(id: $id) +} diff --git a/backend/dataconnect/example/teamHudDeparment/queries.gql b/backend/dataconnect/example/teamHudDeparment/queries.gql new file mode 100644 index 00000000..3d2a85a2 --- /dev/null +++ b/backend/dataconnect/example/teamHudDeparment/queries.gql @@ -0,0 +1,68 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listTeamHudDepartments( + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHudDepartments(offset: $offset, limit: $limit) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getTeamHudDepartmentById($id: UUID!) @auth(level: USER) { + teamHudDepartment(id: $id) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} + +# ---------------------------------------------------------- +# LIST BY TEAM HUB ID +# ---------------------------------------------------------- +query listTeamHudDepartmentsByTeamHubId( + $teamHubId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + teamHudDepartments( + where: { teamHubId: { eq: $teamHubId } } + offset: $offset + limit: $limit + ) { + id + name + costCenter + + teamHubId + teamHub { + id + hubName + } + + createdAt + } +} diff --git a/backend/dataconnect/example/teamMember/mutations.gql b/backend/dataconnect/example/teamMember/mutations.gql new file mode 100644 index 00000000..c271c2f8 --- /dev/null +++ b/backend/dataconnect/example/teamMember/mutations.gql @@ -0,0 +1,92 @@ +mutation createTeamMember( + $teamId: UUID! + $role: TeamMemberRole! + $title: String + $department: String + $teamHubId: UUID + $isActive: Boolean + $userId: String! + $inviteStatus: TeamMemberInviteStatus +) @auth(level: USER) { + teamMember_insert( + data: { + teamId: $teamId + role: $role + title: $title + department: $department + teamHubId: $teamHubId + isActive: $isActive + userId: $userId + inviteStatus: $inviteStatus + } + ) +} + +mutation updateTeamMember( + $id: UUID! + $role: TeamMemberRole + $title: String + $department: String + $teamHubId: UUID + $isActive: Boolean + $inviteStatus: TeamMemberInviteStatus +) @auth(level: USER) { + teamMember_update( + id: $id + data: { + role: $role + title: $title + department: $department + teamHubId: $teamHubId + isActive: $isActive + inviteStatus: $inviteStatus + } + ) +} + +mutation updateTeamMemberInviteStatus( + $id: UUID! + $inviteStatus: TeamMemberInviteStatus! +) @auth(level: USER) { + teamMember_update( + id: $id + data: { + inviteStatus: $inviteStatus + } + ) +} + +mutation acceptInviteByCode( + $inviteCode: UUID! +) @auth(level: USER) { + teamMember_updateMany( + where: { + inviteCode: { eq: $inviteCode } + inviteStatus: { eq: PENDING } + } + data: { + inviteStatus: ACCEPTED + isActive: true + } + ) +} + +mutation cancelInviteByCode( + $inviteCode: UUID! +) @auth(level: USER) { + teamMember_updateMany( + where: { + inviteCode: { eq: $inviteCode } + inviteStatus: { eq: PENDING } + } + data: { + inviteStatus: CANCELLED + isActive: false + } + ) +} + + +mutation deleteTeamMember($id: UUID!) @auth(level: USER) { + teamMember_delete(id: $id) +} diff --git a/backend/dataconnect/example/teamMember/queries.gql b/backend/dataconnect/example/teamMember/queries.gql new file mode 100644 index 00000000..4415f16d --- /dev/null +++ b/backend/dataconnect/example/teamMember/queries.gql @@ -0,0 +1,66 @@ +query listTeamMembers @auth(level: USER) { + teamMembers { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + + } +} + +query getTeamMemberById($id: UUID!) @auth(level: USER) { + teamMember(id: $id) { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + } +} + +query getTeamMembersByTeamId($teamId: UUID!) @auth(level: USER) { + teamMembers(where: { teamId: { eq: $teamId } }) { + id + teamId + role + title + department + teamHubId + isActive + createdAt + + user { + fullName + email + } + + teamHub{ + hubName + } + } +} diff --git a/backend/dataconnect/example/user/mutations.gql b/backend/dataconnect/example/user/mutations.gql new file mode 100644 index 00000000..05e233b6 --- /dev/null +++ b/backend/dataconnect/example/user/mutations.gql @@ -0,0 +1,45 @@ +mutation CreateUser( + $id: String!, # Firebase UID + $email: String, + $fullName: String, + $role: UserBaseRole!, + $userRole: String, + $photoUrl: String +) @auth(level: USER) { + user_insert( + data: { + id: $id + email: $email + fullName: $fullName + role: $role + userRole: $userRole + photoUrl: $photoUrl + } + ) +} + +mutation UpdateUser( + $id: String!, + $email: String, + $fullName: String, + $role: UserBaseRole, + $userRole: String, + $photoUrl: String +) @auth(level: USER) { + user_update( + id: $id, + data: { + email: $email + fullName: $fullName + role: $role + userRole: $userRole + photoUrl: $photoUrl + } + ) +} + +mutation DeleteUser( + $id: String! +) @auth(level: USER) { + user_delete(id: $id) +} diff --git a/backend/dataconnect/example/user/queries.gql b/backend/dataconnect/example/user/queries.gql new file mode 100644 index 00000000..044abebf --- /dev/null +++ b/backend/dataconnect/example/user/queries.gql @@ -0,0 +1,48 @@ +query listUsers @auth(level: USER) { + users { + id + email + fullName + role + userRole + photoUrl + createdDate + updatedDate + } +} + +query getUserById( + $id: String! +) @auth(level: USER) { + user(id: $id) { + id + email + fullName + role + userRole + photoUrl + } +} + +query filterUsers( + $id: String, + $email: String, + $role: UserBaseRole, + $userRole: String +) @auth(level: USER) { + users( + where: { + id: { eq: $id } + email: { eq: $email } + role: { eq: $role } + userRole: { eq: $userRole } + } + ) { + id + email + fullName + role + userRole + photoUrl + } +} diff --git a/backend/dataconnect/example/userConversation/mutations.gql b/backend/dataconnect/example/userConversation/mutations.gql new file mode 100644 index 00000000..53e4e945 --- /dev/null +++ b/backend/dataconnect/example/userConversation/mutations.gql @@ -0,0 +1,74 @@ + +mutation createUserConversation( + $conversationId: UUID! + $userId: String! + $unreadCount: Int + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_insert( + data: { + conversationId: $conversationId + userId: $userId + unreadCount: $unreadCount + lastReadAt: $lastReadAt + } + ) +} + +mutation updateUserConversation( + $conversationId: UUID! + $userId: String! + $unreadCount: Int + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { + unreadCount: $unreadCount + lastReadAt: $lastReadAt + } + ) +} + +# ---------------------------------------------------------- +# MARK AS READ (sets unreadCount=0 + lastReadAt=now) +# Note: request.time is valid in schema defaults; in mutations +# you can pass Timestamp from client. If you want "now" server-side, +# you'd typically pass null and have logic elsewhere. +# ---------------------------------------------------------- +mutation markConversationAsRead( + $conversationId: UUID! + $userId: String! + $lastReadAt: Timestamp +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { + unreadCount: 0 + lastReadAt: $lastReadAt + } + ) +} + +# ---------------------------------------------------------- +# INCREMENT UNREAD (common after sending message) +# ---------------------------------------------------------- +mutation incrementUnreadForUser( + $conversationId: UUID! + $userId: String! + $unreadCount: Int! +) @auth(level: USER) { + userConversation_update( + key: { conversationId: $conversationId, userId: $userId } + data: { unreadCount: $unreadCount } + ) +} + +mutation deleteUserConversation( + $conversationId: UUID! + $userId: String! +) @auth(level: USER) { + userConversation_delete( + key: { conversationId: $conversationId, userId: $userId } + ) +} diff --git a/backend/dataconnect/example/userConversation/queries.gql b/backend/dataconnect/example/userConversation/queries.gql new file mode 100644 index 00000000..99a1a2e4 --- /dev/null +++ b/backend/dataconnect/example/userConversation/queries.gql @@ -0,0 +1,230 @@ + +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listUserConversations( + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations(offset: $offset, limit: $limit) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# GET BY KEY (conversationId + userId) +# ---------------------------------------------------------- +query getUserConversationByKey( + $conversationId: UUID! + $userId: String! +) @auth(level: USER) { + userConversation(key: { conversationId: $conversationId, userId: $userId }) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# LIST BY USER (My inbox) ✅ +# Order by most recent activity (Conversation.lastMessageAt) +# NOTE: If your DC version doesn't allow orderBy on nested fields, +# just orderBy createdAt/updatedAt on user_conversations. +# ---------------------------------------------------------- +query listUserConversationsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { userId: { eq: $userId } } + offset: $offset + limit: $limit + # If supported: + # orderBy: { conversation: { lastMessageAt: DESC } } + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + updatedAt + createdBy + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# LIST UNREAD BY USER (badge, notifications) +# ---------------------------------------------------------- +query listUnreadUserConversationsByUserId( + $userId: String! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { + userId: { eq: $userId } + unreadCount: { gt: 0 } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + } + } +} + +# ---------------------------------------------------------- +# LIST BY CONVERSATION (participants view) +# ---------------------------------------------------------- +query listUserConversationsByConversationId( + $conversationId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { conversationId: { eq: $conversationId } } + offset: $offset + limit: $limit + orderBy: { createdAt: ASC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + user { + id + fullName + photoUrl + } + } +} + +# ---------------------------------------------------------- +# FILTER (dashboard/debug) +# ---------------------------------------------------------- +query filterUserConversations( + $userId: String + $conversationId: UUID + $unreadMin: Int + $unreadMax: Int + $lastReadAfter: Timestamp + $lastReadBefore: Timestamp + $offset: Int + $limit: Int +) @auth(level: USER) { + userConversations( + where: { + userId: { eq: $userId } + conversationId: { eq: $conversationId } + unreadCount: { ge: $unreadMin, le: $unreadMax } + lastReadAt: { ge: $lastReadAfter, le: $lastReadBefore } + } + offset: $offset + limit: $limit + orderBy: { updatedAt: DESC } + ) { + id + conversationId + userId + unreadCount + lastReadAt + createdAt + + conversation { + id + subject + status + conversationType + isGroup + groupName + lastMessage + lastMessageAt + createdAt + } + user { id fullName photoUrl } + } +} diff --git a/backend/dataconnect/example/vendor/mutations.gql b/backend/dataconnect/example/vendor/mutations.gql new file mode 100644 index 00000000..5f0b72cf --- /dev/null +++ b/backend/dataconnect/example/vendor/mutations.gql @@ -0,0 +1,99 @@ +mutation createVendor( + $userId: String! + $companyName: String! + $email: String + $phone: String + $photoUrl: String + $address: String + $billingAddress: String + $timezone: String + $legalName: String + $doingBusinessAs: String + $region: String + $state: String + $city: String + $serviceSpecialty: String + $approvalStatus: ApprovalStatus + $isActive: Boolean + $markup: Float + $fee: Float + $csat: Float + $tier: VendorTier +) @auth(level: USER) { + vendor_insert( + data: { + userId: $userId + companyName: $companyName + email: $email + phone: $phone + photoUrl: $photoUrl + address: $address + billingAddress: $billingAddress + timezone: $timezone + legalName: $legalName + doingBusinessAs: $doingBusinessAs + region: $region + state: $state + city: $city + serviceSpecialty: $serviceSpecialty + approvalStatus: $approvalStatus + isActive: $isActive + markup: $markup + fee: $fee + csat: $csat + tier: $tier + } + ) +} + +mutation updateVendor( + $id: UUID! + $companyName: String + $email: String + $phone: String + $photoUrl: String + $address: String + $billingAddress: String + $timezone: String + $legalName: String + $doingBusinessAs: String + $region: String + $state: String + $city: String + $serviceSpecialty: String + $approvalStatus: ApprovalStatus + $isActive: Boolean + $markup: Float + $fee: Float + $csat: Float + $tier: VendorTier +) @auth(level: USER) { + vendor_update( + id: $id + data: { + companyName: $companyName + email: $email + phone: $phone + photoUrl: $photoUrl + address: $address + billingAddress: $billingAddress + timezone: $timezone + legalName: $legalName + doingBusinessAs: $doingBusinessAs + region: $region + state: $state + city: $city + serviceSpecialty: $serviceSpecialty + approvalStatus: $approvalStatus + isActive: $isActive + markup: $markup + fee: $fee + csat: $csat + tier: $tier + } + ) +} + +mutation deleteVendor($id: UUID!) @auth(level: USER) { + vendor_delete(id: $id) +} diff --git a/backend/dataconnect/example/vendor/queries.gql b/backend/dataconnect/example/vendor/queries.gql new file mode 100644 index 00000000..76c69b03 --- /dev/null +++ b/backend/dataconnect/example/vendor/queries.gql @@ -0,0 +1,86 @@ +query getVendorById($id: UUID!) @auth(level: USER) { + vendor(id: $id) { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} + +query getVendorByUserId($userId: String!) @auth(level: USER) { + vendors(where: { userId: { eq: $userId } }) { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} + +query listVendors @auth(level: USER) { + vendors { + id + userId + companyName + email + phone + photoUrl + address + billingAddress + timezone + legalName + doingBusinessAs + region + state + city + serviceSpecialty + approvalStatus + isActive + markup + fee + csat + tier + createdAt + updatedAt + createdBy + } +} diff --git a/backend/dataconnect/example/vendorBenefitPlan/mutations.gql b/backend/dataconnect/example/vendorBenefitPlan/mutations.gql new file mode 100644 index 00000000..2f3fdf63 --- /dev/null +++ b/backend/dataconnect/example/vendorBenefitPlan/mutations.gql @@ -0,0 +1,48 @@ + +mutation createVendorBenefitPlan( + $vendorId: UUID! + $title: String! + $description: String + $requestLabel: String + $total: Int + $isActive: Boolean + $createdBy: String +) @auth(level: USER) { + vendorBenefitPlan_insert( + data: { + vendorId: $vendorId + title: $title + description: $description + requestLabel: $requestLabel + total: $total + isActive: $isActive + } + ) +} + +mutation updateVendorBenefitPlan( + $id: UUID! + $vendorId: UUID + $title: String + $description: String + $requestLabel: String + $total: Int + $isActive: Boolean + $createdBy: String +) @auth(level: USER) { + vendorBenefitPlan_update( + id: $id + data: { + vendorId: $vendorId + title: $title + description: $description + requestLabel: $requestLabel + total: $total + isActive: $isActive + } + ) +} + +mutation deleteVendorBenefitPlan($id: UUID!) @auth(level: USER) { + vendorBenefitPlan_delete(id: $id) +} diff --git a/backend/dataconnect/example/vendorBenefitPlan/queries.gql b/backend/dataconnect/example/vendorBenefitPlan/queries.gql new file mode 100644 index 00000000..59068553 --- /dev/null +++ b/backend/dataconnect/example/vendorBenefitPlan/queries.gql @@ -0,0 +1,149 @@ +# ---------------------------------------------------------- +# LIST ALL (admin/debug) +# ---------------------------------------------------------- +query listVendorBenefitPlans( + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# GET BY ID +# ---------------------------------------------------------- +query getVendorBenefitPlanById($id: UUID!) @auth(level: USER) { + vendorBenefitPlan(id: $id) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# LIST BY VENDOR +# ---------------------------------------------------------- +query listVendorBenefitPlansByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# LIST ACTIVE PLANS BY VENDOR +# ---------------------------------------------------------- +query listActiveVendorBenefitPlansByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { + vendorId: { eq: $vendorId } + isActive: { eq: true } + } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} + +# ---------------------------------------------------------- +# FILTER (vendorId + title + isActive) +# - Useful for "does this plan already exist?" +# ---------------------------------------------------------- +query filterVendorBenefitPlans( + $vendorId: UUID + $title: String + $isActive: Boolean + $offset: Int + $limit: Int +) @auth(level: USER) { + vendorBenefitPlans( + where: { + vendorId: { eq: $vendorId } + title: { eq: $title } + isActive: { eq: $isActive } + } + offset: $offset + limit: $limit + ) { + id + vendorId + title + description + requestLabel + total + isActive + createdAt + updatedAt + createdBy + + vendor { + companyName + } + } +} diff --git a/backend/dataconnect/example/vendorRate/mutations.gql b/backend/dataconnect/example/vendorRate/mutations.gql new file mode 100644 index 00000000..0479e75c --- /dev/null +++ b/backend/dataconnect/example/vendorRate/mutations.gql @@ -0,0 +1,57 @@ +mutation createVendorRate( + $vendorId: UUID!, + $roleName: String, + $category: CategoryType, + $clientRate: Float, + $employeeWage: Float, + $markupPercentage: Float, + $vendorFeePercentage: Float, + $isActive: Boolean, + $notes: String +) @auth(level: USER) { + vendorRate_insert( + data: { + vendorId: $vendorId, + roleName: $roleName, + category: $category, + clientRate: $clientRate, + employeeWage: $employeeWage, + markupPercentage: $markupPercentage, + vendorFeePercentage: $vendorFeePercentage, + isActive: $isActive, + notes: $notes, + } + ) +} + +mutation updateVendorRate( + $id: UUID!, + $vendorId: UUID, + $roleName: String, + $category: CategoryType, + $clientRate: Float, + $employeeWage: Float, + $markupPercentage: Float, + $vendorFeePercentage: Float, + $isActive: Boolean, + $notes: String, +) @auth(level: USER) { + vendorRate_update( + id: $id, + data: { + vendorId: $vendorId, + roleName: $roleName, + category: $category, + clientRate: $clientRate, + employeeWage: $employeeWage, + markupPercentage: $markupPercentage, + vendorFeePercentage: $vendorFeePercentage, + isActive: $isActive, + notes: $notes, + } + ) +} + +mutation deleteVendorRate($id: UUID!) @auth(level: USER) { + vendorRate_delete(id: $id) +} diff --git a/backend/dataconnect/example/vendorRate/queries.gql b/backend/dataconnect/example/vendorRate/queries.gql new file mode 100644 index 00000000..3e2df738 --- /dev/null +++ b/backend/dataconnect/example/vendorRate/queries.gql @@ -0,0 +1,42 @@ +query listVendorRates @auth(level: USER) { + vendorRates { + id + vendorId + roleName + category + clientRate + employeeWage + markupPercentage + vendorFeePercentage + isActive + notes + createdAt + + vendor{ + companyName + region + } + + } +} + +query getVendorRateById($id: UUID!) @auth(level: USER) { + vendorRate(id: $id) { + id + vendorId + roleName + category + clientRate + employeeWage + markupPercentage + vendorFeePercentage + isActive + notes + createdAt + + vendor{ + companyName + region + } + } +} diff --git a/backend/dataconnect/example/workForce/mutations.gql b/backend/dataconnect/example/workForce/mutations.gql new file mode 100644 index 00000000..489ab55f --- /dev/null +++ b/backend/dataconnect/example/workForce/mutations.gql @@ -0,0 +1,41 @@ +mutation createWorkforce( + $vendorId: UUID! + $staffId: UUID! + $workforceNumber: String! + $employmentType: WorkforceEmploymentType +) @auth(level: USER) { + workforce_insert( + data: { + vendorId: $vendorId + staffId: $staffId + workforceNumber: $workforceNumber + employmentType: $employmentType + status: ACTIVE + } + ) +} + +mutation updateWorkforce( + $id: UUID! + $workforceNumber: String + $employmentType: WorkforceEmploymentType + $status: WorkforceStatus +) @auth(level: USER) { + workforce_update( + id: $id + data: { + workforceNumber: $workforceNumber + employmentType: $employmentType + status: $status + } + ) +} + +mutation deactivateWorkforce( + $id: UUID! +) @auth(level: USER) { + workforce_update( + id: $id + data: { status: INACTIVE } + ) +} diff --git a/backend/dataconnect/example/workForce/queries.gql b/backend/dataconnect/example/workForce/queries.gql new file mode 100644 index 00000000..453bc5db --- /dev/null +++ b/backend/dataconnect/example/workForce/queries.gql @@ -0,0 +1,116 @@ +# ------------------------------------------------------------ +# GET Workforce by ID +# ------------------------------------------------------------ +query getWorkforceById($id: UUID!) @auth(level: USER) { + workforce(id: $id) { + id + vendorId + staffId + workforceNumber + employmentType + status + createdAt + updatedAt + + staff { id fullName } + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# GET Workforce by Vendor + Staff (was "by key") +# ------------------------------------------------------------ +query getWorkforceByVendorAndStaff( + $vendorId: UUID! + $staffId: UUID! +) @auth(level: USER) { + workforces( + where: { + vendorId: { eq: $vendorId } + staffId: { eq: $staffId } + } + limit: 1 + ) { + id + vendorId + staffId + workforceNumber + employmentType + status + createdAt + updatedAt + + staff { id fullName } + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# LIST Workforce by Vendor +# ------------------------------------------------------------ +query listWorkforceByVendorId( + $vendorId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + workforces( + where: { vendorId: { eq: $vendorId } } + offset: $offset + limit: $limit + ) { + id + staffId + workforceNumber + employmentType + status + createdAt + + staff { id fullName } + } +} + +# ------------------------------------------------------------ +# LIST Workforce by Staff +# ------------------------------------------------------------ +query listWorkforceByStaffId( + $staffId: UUID! + $offset: Int + $limit: Int +) @auth(level: USER) { + workforces( + where: { staffId: { eq: $staffId } } + offset: $offset + limit: $limit + ) { + id + vendorId + workforceNumber + employmentType + status + createdAt + updatedAt + + vendor { id companyName } + } +} + +# ------------------------------------------------------------ +# CHECK workforceNumber uniqueness within a Vendor (optional) +# ------------------------------------------------------------ +query getWorkforceByVendorAndNumber( + $vendorId: UUID! + $workforceNumber: String! +) @auth(level: USER) { + workforces( + where: { + vendorId: { eq: $vendorId } + workforceNumber: { eq: $workforceNumber } + } + limit: 1 + ) { + id + staffId + workforceNumber + status + } +} diff --git a/backend/dataconnect/schema/application.gql b/backend/dataconnect/schema/application.gql index ed5294fc..e0c13dc1 100644 --- a/backend/dataconnect/schema/application.gql +++ b/backend/dataconnect/schema/application.gql @@ -7,6 +7,7 @@ enum ApplicationStatus { CHECKED_OUT LATE NO_SHOW + COMPLETED } enum ApplicationOrigin { diff --git a/backend/dataconnect/schema/order.gql b/backend/dataconnect/schema/order.gql index c0db5d79..16a60eac 100644 --- a/backend/dataconnect/schema/order.gql +++ b/backend/dataconnect/schema/order.gql @@ -33,7 +33,7 @@ type Order @table(name: "orders") { business: Business! @ref(fields: "businessId", references: "id") orderType: OrderType! - location: String + #location: String status: OrderStatus! @default(expr: "'DRAFT'") duration: OrderDuration lunchBreak: Int @@ -44,7 +44,8 @@ type Order @table(name: "orders") { shifts: Any @col(dataType: "jsonb") requested: Int - hub: String + teamHubId: UUID! + teamHub: TeamHub! @ref(fields: "teamHubId", references: "id") date: Timestamp diff --git a/backend/dataconnect/schema/shift.gql b/backend/dataconnect/schema/shift.gql index 30c7dd9c..96b1d2d1 100644 --- a/backend/dataconnect/schema/shift.gql +++ b/backend/dataconnect/schema/shift.gql @@ -28,6 +28,12 @@ type Shift @table(name: "shifts") { locationAddress: String latitude: Float longitude: Float + placeId: String + city: String + state: String + street: String + country: String + description: String status: ShiftStatus diff --git a/backend/dataconnect/schema/taxForm.gql b/backend/dataconnect/schema/taxForm.gql index 35a36462..cf110f19 100644 --- a/backend/dataconnect/schema/taxForm.gql +++ b/backend/dataconnect/schema/taxForm.gql @@ -11,15 +11,66 @@ enum TaxFormType { W4 } +enum MaritalStatus{ + SINGLE + MARRIED + HEAD +} + +enum CitizenshipStatus{ + CITIZEN + NONCITIZEN + PERMANENT_RESIDENT + ALIEN +} + type TaxForm @table(name: "tax_forms") { id: UUID! @default(expr: "uuidV4()") + formType: TaxFormType! - title: String! - subtitle: String - description: String + firstName: String! + lastName: String! + mInitial: String + oLastName:String + dob: Timestamp + socialSN: Int! + email: String + phone: String + address: String! + city: String + apt: String + state: String + zipCode: String + + # form W-4 + marital: MaritalStatus + + multipleJob: Boolean @default(expr: "false") + + childrens: Int + otherDeps: Int + totalCredits: Float @default(expr: "0") + + otherInconme: Float @default(expr: "0") + deductions: Float @default(expr: "0") + extraWithholding: Float @default(expr: "0") + + # form I-9 + + citizen: CitizenshipStatus + + uscis: String + passportNumber: String + countryIssue: String + + prepartorOrTranslator: Boolean @default(expr: "false") + + # both forms + signature:String + date: Timestamp + status: TaxFormStatus! staffId: UUID! - formData: Any createdAt: Timestamp @default(expr: "request.time") updatedAt: Timestamp @default(expr: "request.time") diff --git a/backend/dataconnect/schema/teamHub.gql b/backend/dataconnect/schema/teamHub.gql index a206a6fd..faece738 100644 --- a/backend/dataconnect/schema/teamHub.gql +++ b/backend/dataconnect/schema/teamHub.gql @@ -5,10 +5,18 @@ type TeamHub @table(name: "team_hubs") { team: Team! @ref(fields: "teamId", references: "id") hubName: String! + address: String! + placeId: String + latitude: Float + longitude: Float + city: String state: String + street: String + country: String zipCode: String + managerName: String isActive: Boolean! @default(expr: "true") departments: Any