{"result":{"depiction_url":null,"edges":{"in_module":{"objects":[{"created":"2026-10-22T10:28:13Z","object_id":{"id":3105,"is_a":["text","documentation","reference","module"],"name":"doc_external_9_mod_paysub","title":"mod_paysub","uri":"https:\/\/zotonic.com\/id\/3105"},"seq":1}],"predicate":{"id":333,"is_a":["meta","predicate"],"name":"in_module","title":{"_type":"trans","tr":{"en":"In module"}},"uri":"https:\/\/zotonic.com\/id\/in_module"}},"subject":{"objects":[{"created":"2026-10-22T10:28:13Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-10-22T10:28:13Z","object_id":{"id":2563,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_frontend_developer","title":"Frontend developer","uri":"https:\/\/zotonic.com\/id\/2563"},"seq":2},{"created":"2026-10-22T10:28:13Z","object_id":{"id":2564,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_backend_developer","title":"Backend developer","uri":"https:\/\/zotonic.com\/id\/2564"},"seq":3},{"created":"2026-10-22T10:28:13Z","object_id":{"id":2586,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_search_and_discovery","title":"Search and discovery","uri":"https:\/\/zotonic.com\/id\/2586"},"seq":4},{"created":"2026-10-22T10:28:13Z","object_id":{"id":2592,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_authorization_and_access_control","title":"Authorization and access control","uri":"https:\/\/zotonic.com\/id\/2592"},"seq":5},{"created":"2026-10-22T10:28:13Z","object_id":{"id":2625,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_model","title":"Model","uri":"https:\/\/zotonic.com\/id\/2625"},"seq":6}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":3108,"is_a":["text","documentation","reference","model"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/3108"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_external_9_m_paysub_search","page_url":{"en":"https:\/\/zotonic.com\/docs\/3108\/m_paysub_search","x-default":"https:\/\/zotonic.com\/docs\/3108\/m_paysub_search"},"preview_url":null,"resource":{"version":15,"pivot_location_lat":null,"title":"m_paysub_search","is_authoritative":true,"body":"<p>Provide geographic filter choices and subscription searches for Paysub.<\/p>\n<h2>Model paths<\/h2>\n<p><code>m.paysub_search.list.countries<\/code> returns a list of maps with <code>code<\/code> and\nlocalized <code>name<\/code>, sorted by name. Countries come from resource pivot fields\nof linked customers. <code>m.paysub_search.list.cities[country]<\/code> returns sorted\ncity values for the selected country.<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% for country in m.paysub_search.list.countries %}\n    {{ country.name|escape }}\n{% endfor %}\n<\/code><\/pre>\n<p>Both paths require <code>m_paysub:is_allowed_paysub\/1<\/code>, otherwise they return\n<code>{error, eacces}<\/code>. The callback wraps successful lists as <code>{ok, {List, Rest}}<\/code>;\nunsupported paths return <code>{error, notyet}<\/code>.<\/p>\n<h2>Search integration<\/h2>\n<p><code>mod_paysub<\/code> exposes the named searches <code>paysub_subscriptions<\/code>,\n<code>paysub_invoices<\/code>, <code>paysub_payments<\/code> and <code>paysub_products<\/code> through <code>m.search<\/code>.\nFor example:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% with m.search.paged[{paysub_subscriptions status=&quot;all_active&quot;}] as result %}\n    {% for sub in result %}{{ sub.status|escape }}{% endfor %}\n{% endwith %}\n<\/code><\/pre>\n<p>The module observer checks Paysub management permission before these searches.\nSubscriptions accept <code>rsc_id<\/code>, <code>price_id<\/code>, <code>product_id<\/code>, <code>user_group_id<\/code>,\n<code>psp<\/code>, <code>status<\/code>, <code>country<\/code>, <code>city<\/code> and <code>postcode<\/code>. Postcodes use a prefix match;\ncountry and city filters use resource pivot fields. Invoice and payment\nsearches optionally restrict by <code>rsc_id<\/code>.<\/p>\n<p>The resource query terms <code>is_paysub_subscriber<\/code> and\n<code>paysub_subscription_status<\/code> filter resources by subscription state.\n<code>is_subscriber<\/code> is a deprecated alias for <code>is_paysub_subscriber<\/code>.\nThe boolean subscriber term includes organization main contacts and uses\naccess states without an end-date check. Status filters such as <code>all_active<\/code>\nand <code>all_access<\/code> also exclude subscriptions whose <code>ended_at<\/code> has passed.<\/p>\n<p>The exported <code>search_query\/4<\/code> accepts a search kind, a binary-keyed query map,\na one-based <code>{Offset, Limit}<\/code> and a context. It returns a <code>search_result<\/code>\nrecord. Direct search and SQL-term helpers do not enforce the management\npermission checked by the module&#39;s named-search observer.<\/p>","slug":"m_paysub_search","doc_module_config":[],"is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"0aa80b9f263b4fd708eec509e968ec16518ea37a7d92b3dc3891888b05abb280","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"external_module_id":{"id":9,"is_a":[],"name":null,"title":null,"uri":"https:\/\/zotonic.com\/id\/9"},"git_url":"https:\/\/github.com\/zotonic\/zotonic_mod_paysub.git","category_id":{"id":322,"is_a":["meta","category"],"name":"model","title":"Models","uri":"https:\/\/test.zotonic.com\/id\/322"},"doc_source_path":".\/src\/models\/m_paysub_search.erl","publication_start":"2026-10-22T10:28:13Z","github_url":"https:\/\/github.com\/zotonic\/zotonic_mod_paysub.git","pivot_location_lng":null,"doc_source_kind":"external","name":"doc_external_9_m_paysub_search","is_unfindable":false,"is_published":true,"pivot_geocode":null,"external_module_title":"Paid Subscriptions","created":"2026-10-22T10:28:13Z","uri":null,"doc_status":"current","is_dependent":false,"is_external_module":true,"publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"3a4ee4d7434205778e4318c0c2e1576884e5678b","creator_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"modified":"2026-10-22T10:28:14Z","title_slug":"m_paysub_search"},"uri":"https:\/\/zotonic.com\/id\/3108","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/3108"}},"status":"ok"}