Browse Source

feat(api): update API endpoints to use selects for cities, countries, states, and financial plan accounts; add new endpoints for selecting students and unit packages

ebagabee 1 week ago
parent
commit
f840fae831

+ 3 - 3
src/api/city.js

@@ -8,16 +8,16 @@ export const getCity = async (id) => {
 };
 
 export const getCities = async () => {
-  const { data } = await api.get("/city");
+  const { data } = await api.get("/selects/cities");
   return data.payload;
 };
 
 export const getCityByState = async (stateId) => {
-  const { data } = await api.get(`/city/state/${stateId}`);
+  const { data } = await api.get("/selects/cities", { params: { state_id: stateId } });
   return data.payload;
 };
 
 export const getCityByCountry = async (countryId) => {
-  const { data } = await api.get(`/city/country/${countryId}`);
+  const { data } = await api.get("/selects/cities", { params: { country_id: countryId } });
   return data.payload;
 };

+ 1 - 1
src/api/country.js

@@ -8,6 +8,6 @@ export const getCountry = async (id) => {
 };
 
 export const getCountries = async () => {
-  const { data } = await api.get("/country");
+  const { data } = await api.get("/selects/countries");
   return data.payload;
 };

+ 5 - 0
src/api/financial_plan_account.js

@@ -5,6 +5,11 @@ export const getPlanAccountsMe = async () => {
   return data.payload;
 };
 
+export const getPlanAccountsForSelect = async () => {
+  const { data } = await api.get("/selects/financial-plan-accounts");
+  return data.payload;
+};
+
 export const createPlanAccountMe = async (payload) => {
   const { data } = await api.post("/franchisee/financial/plan-accounts", payload);
   return data.payload;

+ 1 - 1
src/api/inhabitant_classification.js

@@ -1,6 +1,6 @@
 import api from "src/api";
 
 export const getInhabitantClassificationsForSelect = async () => {
-  const { data } = await api.get("/inhabitant-classification/all/select");
+  const { data } = await api.get("/selects/inhabitant-classifications");
   return data.payload;
 };

+ 6 - 1
src/api/package.js

@@ -6,7 +6,12 @@ export const getUnitPackages = async () => {
 };
 
 export const getAllUnitPackages = async () => {
-  const { data } = await api.get("/franchisee/packages");
+  const { data } = await api.get("/selects/franchisee/packages");
+  return data.payload;
+};
+
+export const getUnitPackagesForSelect = async () => {
+  const { data } = await api.get("/selects/franchisee/packages");
   return data.payload;
 };
 

+ 3 - 1
src/api/product.js

@@ -1,6 +1,8 @@
 import api from "src/api";
 
 export const getProductsForSelect = async () => {
-  const { data } = await api.get("/franchisee/packages/material-options");
+  const { data } = await api.get("/selects/products", {
+    params: { visible_franchisee: true },
+  });
   return data.payload;
 };

+ 2 - 2
src/api/state.js

@@ -8,11 +8,11 @@ export const getState = async (id) => {
 }
 
 export const getStates = async () => {
-  const { data } = await api.get("/state");
+  const { data } = await api.get("/selects/states");
   return data.payload;
 }
 
 export const getStateByCountry = async (countryId) => {
-  const { data } = await api.get(`/state/country/${countryId}`);
+  const { data } = await api.get("/selects/states", { params: { country_id: countryId } });
   return data.payload;
 }

+ 5 - 0
src/api/student.js

@@ -5,6 +5,11 @@ export const getStudents = async (params = {}) => {
   return data.payload;
 };
 
+export const getStudentsForSelect = async () => {
+  const { data } = await api.get("/selects/franchisee/students");
+  return data.payload;
+};
+
 export const getStudent = async (id) => {
   const { data } = await api.get(`/franchisee/students/${id}`);
   return data.payload;

+ 0 - 5
src/api/unit.js

@@ -51,8 +51,3 @@ export const deleteUnit = async (id) => {
   const { data } = await api.delete(`/unit/${id}`);
   return data;
 };
-
-export const getUnitsForSelect = async () => {
-  const { data } = await api.get("/unit/all/select");
-  return data.payload;
-};

+ 5 - 3
src/api/user.js

@@ -16,7 +16,7 @@ export const getUserById = async (id) => {
 };
 
 export const getUsersByUnit = async () => {
-  const { data } = await api.get("/franchisee/users");
+  const { data } = await api.get("/selects/franchisee/users");
   return data.payload;
 };
 
@@ -46,6 +46,8 @@ export const deleteUser = async (id) => {
 };
 
 export const userTypes = async () => {
-  const { data } = await api.get("/franchisee/users/types");
-  return data.payload;
+  const { data } = await api.get("/selects/user-types", {
+    params: { access_scope: "unit" },
+  });
+  return Object.fromEntries(data.payload.map((type) => [type.value, type.label]));
 };

+ 1 - 4
src/pages/classes/ClassPage.vue

@@ -108,10 +108,7 @@ const permissions = permissionStore();
 const canAdd = computed(() =>
   permissions.getAccess("franchisee_classes", "add"),
 );
-const canViewPackages = computed(() =>
-  permissions.getAccess("franchisee_packages", "view"),
-);
-const canAddClass = computed(() => canAdd.value && canViewPackages.value);
+const canAddClass = computed(() => canAdd.value);
 
 const view = ref("month"); // 'month' | 'day'
 const currentDate = ref(new Date());

+ 3 - 9
src/pages/classes/components/AddEditClassDialog.vue

@@ -80,7 +80,6 @@
 
               <!-- Instrutor (Neurotrainer da unidade) -->
               <DefaultSelect
-                v-if="canViewUsers"
                 v-model="form.instructor"
                 label="Neurotrainer"
                 :options="instructorOptions"
@@ -137,9 +136,8 @@ import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
 import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
 
 import { createClass, updateClass } from "src/api/class";
-import { getUnitPackages } from "src/api/package";
+import { getUnitPackagesForSelect } from "src/api/package";
 import { getUsersByUnit } from "src/api/user";
-import { permissionStore } from "src/stores/permission";
 
 defineEmits([...useDialogPluginComponent.emits]);
 
@@ -153,8 +151,6 @@ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
   useDialogPluginComponent();
 
 const $q = useQuasar();
-const permissions = permissionStore();
-const canViewUsers = permissions.getAccess("franchisee_users", "view");
 
 const formRef = ref(null);
 const saving = ref(false);
@@ -182,15 +178,13 @@ const form = reactive({
 const loadPackages = async () => {
   loadingPackages.value = true;
   try {
-    packageOptions.value = await getUnitPackages();
+    packageOptions.value = await getUnitPackagesForSelect();
   } finally {
     loadingPackages.value = false;
   }
 };
 
 const loadInstructors = async () => {
-  if (!canViewUsers) return;
-
   loadingInstructors.value = true;
   try {
     const users = await getUsersByUnit();
@@ -237,6 +231,6 @@ const onSubmit = async () => {
 
 onMounted(() => {
   loadPackages();
-  if (canViewUsers) loadInstructors();
+  loadInstructors();
 });
 </script>

+ 4 - 7
src/pages/financial/AccountsReceivablePage.vue

@@ -271,8 +271,8 @@ import {
   settleManualReceivableMe,
   reopenManualReceivableMe,
 } from "src/api/unit_receivable";
-import { getStudents } from "src/api/student";
-import { getPlanAccountsMe } from "src/api/financial_plan_account";
+import { getStudentsForSelect } from "src/api/student";
+import { getPlanAccountsForSelect } from "src/api/financial_plan_account";
 import { permissionStore } from "src/stores/permission";
 
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
@@ -291,9 +291,6 @@ const canAdd = computed(() =>
 const canEdit = computed(() =>
   permissions.getAccess("franchisee_financial", "edit"),
 );
-const canViewStudents = computed(() =>
-  permissions.getAccess("franchisee_students", "view"),
-);
 
 const rows = ref([]);
 const statusFilter = ref(null);
@@ -408,8 +405,8 @@ async function loadAux() {
   loadingAux.value = true;
   try {
     const [students, planAccounts] = await Promise.all([
-      canViewStudents.value ? getStudents() : Promise.resolve([]),
-      getPlanAccountsMe(),
+      getStudentsForSelect(),
+      getPlanAccountsForSelect(),
     ]);
     studentOptions.value = (students ?? []).map((s) => ({
       label: s.name,

+ 1 - 3
src/pages/kanban/components/AddEditKanbanDialog.vue

@@ -53,7 +53,7 @@
 
                 <!-- Responsável — só aparece quando destino é Interno -->
                 <DefaultSelect
-                  v-if="canViewUsers && form.scope === 'internal'"
+                  v-if="form.scope === 'internal'"
                   v-model="form.responsible_user_id"
                   label="Responsável"
                   :options="userOptions"
@@ -238,7 +238,6 @@ const permissions = permissionStore();
 const canAdd = computed(() => permissions.getAccess("franchisee_activities", "add"));
 const canEdit = computed(() => permissions.getAccess("franchisee_activities", "edit"));
 const canSave = computed(() => card?.id ? canEdit.value : canAdd.value);
-const canViewUsers = computed(() => permissions.getAccess("franchisee_users", "view"));
 
 const formRef        = ref(null);
 const loading        = ref(false);
@@ -316,7 +315,6 @@ const buildPayload = () => ({
 });
 
 const loadUsers = async () => {
-  if (!canViewUsers.value) return;
   try {
     const users = await getUsersByUnit();
     userOptions.value = users.map((u) => ({ label: u.name, value: u.id }));

+ 2 - 2
src/pages/students/components/AddEditContractDialog.vue

@@ -363,7 +363,7 @@ import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePick
 import { useSubmitHandler } from "src/composables/useSubmitHandler";
 import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
 import { formatDateYMDtoDMY, formatDateDMYtoYMD } from "src/helpers/utils";
-import { getUnitPackages } from "src/api/package";
+import { getUnitPackagesForSelect } from "src/api/package";
 import { getFinancialMe } from "src/api/unit_financial";
 import { permissionStore } from "src/stores/permission";
 import {
@@ -524,7 +524,7 @@ watch(activeTab, (tab) => {
 });
 
 onMounted(async () => {
-  packages.value = await getUnitPackages();
+  packages.value = await getUnitPackagesForSelect();
 
   // Para novo contrato, pré-preenche desconto/juros/multa com os defaults da unidade
   if (!props.contract && canViewFinancial.value) {

+ 2 - 6
src/pages/students/tabs/ContractTab.vue

@@ -118,15 +118,11 @@ const props = defineProps({
 
 const $q = useQuasar();
 const permissions = permissionStore();
-const canViewPackages = computed(() =>
-  permissions.getAccess("franchisee_packages", "view"),
-);
 const canAdd = computed(() =>
-  permissions.getAccess("franchisee_contracts", "add") &&
-  canViewPackages.value,
+  permissions.getAccess("franchisee_contracts", "add"),
 );
 const canEdit = computed(() => permissions.getAccess("franchisee_contracts", "edit"));
-const canEditContract = computed(() => canEdit.value && canViewPackages.value);
+const canEditContract = computed(() => canEdit.value);
 const rows = ref([]);
 const fileInputRef = ref(null);
 const uploadingId = ref(null);