{"schemaVersion":"1.0","sourceCommit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca","sourceVisibility":"private","article":{"id":"api-mansoq-odoo-be-cashsessionviewset-992065df","title":"Cash Session API reference · mansoq-odoo-be","summary":"Static source contract for Cash Session: 6 declared or inherited operation mappings, schema/field evidence and authorization/refusal references. Deployment and behavioral review remain explicit.","module":"IT & integrations","roles":["IT administrator","Developer","Integration engineer"],"facilities":["All configured facility types"],"kind":"reference","minutes":6,"prerequisites":["Use the API contract from the installed deployment and an authorized synthetic test environment.","Confirm facility/organization scope, action permissions and optional app enablement.","This reference is static source evidence; complete payload, authorization, failure and end-to-end review remains recorded as pending."],"steps":[],"sections":[{"title":"Declared route and availability","body":"This resource is declared in **mansoq-odoo-be** at `/api/{installed_plugin_prefix}/cash-session/`. plugin/local mount; actual prefix and enablement require deployment verification A registered path and an indexed handler do not prove deployment availability, user permission or production readiness.\n\nViewSet for managing cash sessions with Odoo.\n\nAll endpoints are facility-scoped and use the authenticated user.\n\nURL Pattern: /facility/{facility_external_id}/cash-session/\n\nEndpoints:\n- POST / - Open a new session\n- PUT /close/ - Close current session\n- GET /current/ - Get current session for authenticated user at location\n- GET / - List sessions\n- GET /counters/ - List all counters with session status"},{"title":"Operation map","body":"| Method | Path | Action | Evidence |\n| --- | --- | --- | --- |\n| GET | `/api/{installed_plugin_prefix}/cash-session/` | list | declared/inherited method |\n| POST | `/api/{installed_plugin_prefix}/cash-session/` | create | declared/inherited method |\n| PUT | `/api/{installed_plugin_prefix}/cash-session/close/` | close_session | @action declaration |\n| POST | `/api/{installed_plugin_prefix}/cash-session/close/` | close_session | @action declaration |\n| POST | `/api/{installed_plugin_prefix}/cash-session/current/` | current_session | @action declaration |\n| GET | `/api/{installed_plugin_prefix}/cash-session/counters/` | list_counters | @action declaration |"},{"title":"list · GET","body":"List all sessions in the facility, optionally filtered by status.\n\nGET /facility/{facility_external_id}/cash-session/?status=open\n\n**GET /api/{installed_plugin_prefix}/cash-session/** — action `list`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\nDirectly observed request reads (these do not constitute a complete accepted-payload or requiredness guarantee):\n\n| Location | Field | Declared/inferred read type | Requiredness evidence |\n| --- | --- | --- | --- |\n| query | `status` | not declared at read site | not established |\n\n**Authorization:** no literal permission name was resolved in the bounded handler/helper traversal. Authentication, inherited policies, object/facility scoping and middleware still require review; this does not mean public access.\n\n**Explicit response statuses in observed code:** status.HTTP_200_OK. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError (dynamic detail; inspect source)."},{"title":"create · POST","body":"Open a new cash session for the authenticated user.\n\nPOST /facility/{facility_external_id}/cash-session/\n{\n    \"counter_x_care_id\": \"UUID\",\n    \"opening_balance\": 5000.00\n}\n\n**POST /api/{installed_plugin_prefix}/cash-session/** — action `create`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\n**Observed authorization checks:** `can_list_facility_location_obj`. Helper/queryset evidence is included; this is not proof of complete security review.\n\n**Explicit response statuses in observed code:** status.HTTP_201_CREATED. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError (dynamic detail; inspect source); PermissionDenied (dynamic detail; inspect source); NotFound (dynamic detail; inspect source)."},{"title":"close_session · PUT","body":"Close the current cash session for the authenticated user.\n\nPUT /facility/{facility_external_id}/cash-session/close/\n{\n    \"counter_x_care_id\": \"UUID\",\n    \"declared_amount\": 45000.00,\n    \"denominations\": {\"500\": 50, \"200\": 100}\n}\n\n**PUT /api/{installed_plugin_prefix}/cash-session/close/** — action `close_session`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\n**Observed authorization checks:** `can_list_facility_location_obj`. Helper/queryset evidence is included; this is not proof of complete security review.\n\n**Explicit response statuses in observed code:** status.HTTP_200_OK. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError (dynamic detail; inspect source); PermissionDenied (dynamic detail; inspect source); NotFound (dynamic detail; inspect source)."},{"title":"close_session · POST","body":"Close the current cash session for the authenticated user.\n\nPUT /facility/{facility_external_id}/cash-session/close/\n{\n    \"counter_x_care_id\": \"UUID\",\n    \"declared_amount\": 45000.00,\n    \"denominations\": {\"500\": 50, \"200\": 100}\n}\n\n**POST /api/{installed_plugin_prefix}/cash-session/close/** — action `close_session`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\n**Observed authorization checks:** `can_list_facility_location_obj`. Helper/queryset evidence is included; this is not proof of complete security review.\n\n**Explicit response statuses in observed code:** status.HTTP_200_OK. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError (dynamic detail; inspect source); PermissionDenied (dynamic detail; inspect source); NotFound (dynamic detail; inspect source)."},{"title":"current_session · POST","body":"Get the current open session for the authenticated user at a location.\n\nPOST /facility/{facility_external_id}/cash-session/current/\n{\n    \"counter_x_care_id\": \"UUID\"\n}\n\n**POST /api/{installed_plugin_prefix}/cash-session/current/** — action `current_session`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\nDirectly observed request reads (these do not constitute a complete accepted-payload or requiredness guarantee):\n\n| Location | Field | Declared/inferred read type | Requiredness evidence |\n| --- | --- | --- | --- |\n| body | `counter_x_care_id` | not declared at read site | not established |\n\n**Observed authorization checks:** `can_list_facility_location_obj`. Helper/queryset evidence is included; this is not proof of complete security review.\n\n**Explicit response statuses in observed code:** status.HTTP_200_OK. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError: counter_x_care_id is required; ValidationError (dynamic detail; inspect source); PermissionDenied (dynamic detail; inspect source); NotFound (dynamic detail; inspect source)."},{"title":"list_counters · GET","body":"List all available counters in the facility with their session status.\n\nGET /facility/{facility_external_id}/cash-session/counters/\n\n**GET /api/{installed_plugin_prefix}/cash-session/counters/** — action `list_counters`. static contract extracted; runtime/permission/payload behavior review pending.\n\nPath and deployment-context parameters:\n\n| Location | Parameter | Type | Required |\n| --- | --- | --- | --- |\n| deployment mount | installed_plugin_prefix | deployment-selected mount prefix | true |\n\n**Authorization:** no literal permission name was resolved in the bounded handler/helper traversal. Authentication, inherited policies, object/facility scoping and middleware still require review; this does not mean public access.\n\n**Explicit response statuses in observed code:** status.HTTP_200_OK. Other branches/framework exception handling may differ.\n\n**Declared refusal/error evidence:** ValidationError (dynamic detail; inspect source)."},{"title":"Integration review checklist","body":"Confirm the installed route and full schema; review authentication, organization/facility scoping, all accepted fields, value-state and date/time semantics, idempotency, pagination, response/exception branches and the allowed correction/reversal workflow. Test positive and negative cases with synthetic data. This source reference does not establish external certification or replace an illustrated user procedure."}],"troubleshooting":[{"problem":"A declared route is unavailable or a request is rejected","solution":"Compare the installed revision, actual API schema, optional plugin mount, HTTP-method restrictions and recorded validation/permission evidence. Do not bypass a refusal or send a production transaction to test documentation."}],"sources":[{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":25,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":242,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py","line":322,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":41,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":73,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":81,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":54,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":45,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":135,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":191,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":279,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":77,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}],"related":["it-api-contract","it-api-auth","security-rcm-roles"],"verification":"Static API contract — behavior review pending","version":"f6e9f05f76d4","apiReferenceIds":["backend-resource-cf5f0978992065df","backend-resource-cf5f0978992065df:GET:list","backend-resource-cf5f0978992065df:POST:create","backend-resource-cf5f0978992065df:PUT:close_session","backend-resource-cf5f0978992065df:POST:close_session","backend-resource-cf5f0978992065df:POST:current_session","backend-resource-cf5f0978992065df:GET:list_counters"]},"backend":{"resources":[{"id":"backend-resource-cf5f0978992065df","localPrefix":"cash-session","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","basename":"cash-session","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"conditions":[],"repository":"repositories/platform/mansoq-odoo-be","classSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":25,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"description":"ViewSet for managing cash sessions with Odoo.\n\nAll endpoints are facility-scoped and use the authenticated user.\n\nURL Pattern: /facility/{facility_external_id}/cash-session/\n\nEndpoints:\n- POST / - Open a new session\n- PUT /close/ - Close current session\n- GET /current/ - Get current session for authenticated user at location\n- GET / - List sessions\n- GET /counters/ - List all counters with session status","path":"/api/{installed_plugin_prefix}/cash-session/","mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","operationIds":["backend-resource-cf5f0978992065df:GET:list","backend-resource-cf5f0978992065df:POST:create","backend-resource-cf5f0978992065df:PUT:close_session","backend-resource-cf5f0978992065df:POST:close_session","backend-resource-cf5f0978992065df:POST:current_session","backend-resource-cf5f0978992065df:GET:list_counters"],"unresolvedViewset":false,"reviewStatus":"registered resource enumerated; behavioral review pending"}],"operations":[{"id":"backend-resource-cf5f0978992065df:GET:list","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"GET","path":"/api/{installed_plugin_prefix}/cash-session/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/","action":"list","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":242,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"declared/inherited method","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:242:list","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]},{"id":"backend-resource-cf5f0978992065df:POST:create","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"POST","path":"/api/{installed_plugin_prefix}/cash-session/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/","action":"create","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":81,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"declared/inherited method","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:81:create","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:54:validate_location_access","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:45:get_location_obj"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]},{"id":"backend-resource-cf5f0978992065df:PUT:close_session","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"PUT","path":"/api/{installed_plugin_prefix}/cash-session/close/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/close/","action":"close_session","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":135,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"@action declaration","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:135:close_session","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:54:validate_location_access","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:45:get_location_obj"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]},{"id":"backend-resource-cf5f0978992065df:POST:close_session","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"POST","path":"/api/{installed_plugin_prefix}/cash-session/close/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/close/","action":"close_session","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":135,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"@action declaration","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:135:close_session","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:54:validate_location_access","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:45:get_location_obj"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]},{"id":"backend-resource-cf5f0978992065df:POST:current_session","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"POST","path":"/api/{installed_plugin_prefix}/cash-session/current/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/current/","action":"current_session","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":191,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"@action declaration","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:191:current_session","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:54:validate_location_access","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:45:get_location_obj"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]},{"id":"backend-resource-cf5f0978992065df:GET:list_counters","resourceId":"backend-resource-cf5f0978992065df","repository":"repositories/platform/mansoq-odoo-be","boundary":"optional-plugin/local-service","method":"GET","path":"/api/{installed_plugin_prefix}/cash-session/counters/","declaredPattern":"/api/{installed_plugin_prefix}/cash-session/counters/","action":"list_counters","viewset":"CashSessionViewSet","classId":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","detail":false,"allowedByDeclaredHttpMethods":true,"mountStatus":"plugin/local mount; actual prefix and enablement require deployment verification","routeEvidence":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"handlerSource":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":279,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"registrationConditions":[],"evidenceKind":"@action declaration","methodEvidenceIds":["repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:279:list_counters","repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:77:_serialize_counter"],"schemaIds":{},"classPermissionEvidence":[],"filterEvidence":[],"reviewStatus":"static contract extracted; runtime/permission/payload behavior review pending","pathParameters":[{"name":"installed_plugin_prefix","in":"deployment mount","type":"deployment-selected mount prefix","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/urls.py","line":19,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}]}],"methodEvidence":[{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:242:list","name":"list","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"List all sessions in the facility, optionally filtered by status.\n\nGET /facility/{facility_external_id}/cash-session/?status=open","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":242,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"facility_external_id","type":"unspecified","required":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":242,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[{"name":"status","in":"query","type":"not declared at read site","required":"not established","readStyle":"get","dynamicName":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":249,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"permissionChecks":[],"declaredErrors":[{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":276,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[{"value":null,"symbol":"status.HTTP_200_OK","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":270,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py:322:get_queryset","name":"get_queryset","owner":"repositories/platform/mansoq-core:mansoq.emr.api.viewsets.base.EMRBaseViewSet","summary":"","source":{"path":"repositories/platform/mansoq-core/mansoq/emr/api/viewsets/base.py","line":322,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[],"parametersRead":[],"permissionChecks":[],"declaredErrors":[],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:41:get_facility_obj","name":"get_facility_obj","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Get facility from URL kwargs.","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":41,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[],"parametersRead":[],"permissionChecks":[],"declaredErrors":[],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:73:_serialize_session","name":"_serialize_session","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Serialize session data from Odoo response.","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":73,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"session_data","type":"dict","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":73,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:81:create","name":"create","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Open a new cash session for the authenticated user.\n\nPOST /facility/{facility_external_id}/cash-session/\n{\n    \"counter_x_care_id\": \"UUID\",\n    \"opening_balance\": 5000.00\n}","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":81,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"facility_external_id","type":"unspecified","required":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":81,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":94,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":119,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":132,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[{"value":null,"symbol":"status.HTTP_201_CREATED","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":121,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:54:validate_location_access","name":"validate_location_access","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Validate that the authenticated user has access to the location.\n\nReturns:\n    FacilityLocation object if access is granted\n\nRaises:\n    NotFound: If location doesn't exist in facility\n    PermissionDenied: If user doesn't have access","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":54,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"location_external_id","type":"str","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":54,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[{"permission":"can_list_facility_location_obj","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":68,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"declaredErrors":[{"exception":"PermissionDenied","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":69,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:45:get_location_obj","name":"get_location_obj","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Get location by external ID within the facility.","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":45,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"location_external_id","type":"str","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":45,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[{"exception":"NotFound","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":52,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:135:close_session","name":"close_session","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Close the current cash session for the authenticated user.\n\nPUT /facility/{facility_external_id}/cash-session/close/\n{\n    \"counter_x_care_id\": \"UUID\",\n    \"declared_amount\": 45000.00,\n    \"denominations\": {\"500\": 50, \"200\": 100}\n}","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":135,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"facility_external_id","type":"unspecified","required":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":135,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":149,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":175,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":188,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[{"value":null,"symbol":"status.HTTP_200_OK","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":177,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:191:current_session","name":"current_session","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Get the current open session for the authenticated user at a location.\n\nPOST /facility/{facility_external_id}/cash-session/current/\n{\n    \"counter_x_care_id\": \"UUID\"\n}","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":191,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"facility_external_id","type":"unspecified","required":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":191,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[{"name":"counter_x_care_id","in":"body","type":"not declared at read site","required":"not established","readStyle":"get","dynamicName":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":200,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"permissionChecks":[],"declaredErrors":[{"exception":"ValidationError","message":"counter_x_care_id is required","dynamicMessage":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":203,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":240,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[{"value":null,"symbol":"status.HTTP_200_OK","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":226,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}},{"value":null,"symbol":"status.HTTP_200_OK","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":234,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:279:list_counters","name":"list_counters","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"List all available counters in the facility with their session status.\n\nGET /facility/{facility_external_id}/cash-session/counters/","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":279,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"facility_external_id","type":"unspecified","required":false,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":279,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[{"exception":"ValidationError","message":null,"dynamicMessage":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":305,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"explicitResponseStatuses":[{"value":null,"symbol":"status.HTTP_200_OK","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":295,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"},{"id":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py:77:_serialize_counter","name":"_serialize_counter","owner":"repositories/platform/mansoq-odoo-be:mansoq_odoo.resources.cash_session.viewset.CashSessionViewSet","summary":"Serialize counter data from Odoo response.","source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":77,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"signatureParameters":[{"name":"counter_data","type":"dict","required":true,"source":{"path":"repositories/platform/mansoq-odoo-be/src/mansoq_odoo/resources/cash_session/viewset.py","line":77,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"}}],"parametersRead":[],"permissionChecks":[],"declaredErrors":[],"explicitResponseStatuses":[],"conditions":[],"schemaIds":[],"schemaUsages":[],"unconditionalRaise":false,"reviewStatus":"static declaration extracted; behavioral/security review pending"}],"schemas":[],"frameworkSettings":[{"name":"DEFAULT_AUTHENTICATION_CLASSES","value":["config.authentication.CustomJWTAuthentication","config.authentication.CustomBasicAuthentication","rest_framework.authentication.SessionAuthentication","rest_framework.authentication.TokenAuthentication"],"source":{"path":"repositories/platform/mansoq-core/config/settings/base.py","line":372,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"scope":"source default; deployment overrides and action-level policies may differ"},{"name":"DEFAULT_PERMISSION_CLASSES","value":["rest_framework.permissions.IsAuthenticated","mansoq.security.utils.permission_class.MansoqAuthentication"],"source":{"path":"repositories/platform/mansoq-core/config/settings/base.py","line":372,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"scope":"source default; deployment overrides and action-level policies may differ"},{"name":"DEFAULT_PAGINATION_CLASS","value":"mansoq.utils.pagination.mansoq_pagination.MansoqLimitOffsetPagination","source":{"path":"repositories/platform/mansoq-core/config/settings/base.py","line":372,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"scope":"source default; deployment overrides and action-level policies may differ"},{"name":"PAGE_SIZE","value":14,"source":{"path":"repositories/platform/mansoq-core/config/settings/base.py","line":372,"commit":"f6e9f05f76d443b26ebd2369f67d3c3bd52257ca"},"scope":"source default; deployment overrides and action-level policies may differ"}]},"frontend":{"operations":[],"schemas":[]},"services":{"operations":[]},"boundaries":[]}