├── .gitignore ├── .gitlab-ci.yml ├── MANIFEST.in ├── README.md ├── getpos-react ├── .eslintrc.cjs ├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package.json ├── proxyOptions.js ├── public │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt ├── server.js ├── src │ ├── App.css │ ├── App.jsx │ ├── App.test.jsx │ ├── api │ │ └── index.jsx │ ├── assets │ │ └── images │ │ │ ├── Booking.png │ │ │ ├── Credit.png │ │ │ ├── Delete.png │ │ │ ├── Logo2.png │ │ │ ├── Search-icon.png │ │ │ ├── btn-cross.png │ │ │ ├── btn-tick.png │ │ │ ├── calc-close.png │ │ │ ├── card.png │ │ │ ├── cash.png │ │ │ ├── cross.png │ │ │ ├── drop-arrow.png │ │ │ ├── email.png │ │ │ ├── empty-cart.png │ │ │ ├── icon-card.png │ │ │ ├── icon-cash.png │ │ │ ├── icon-changePwd.svg │ │ │ ├── icon-customer.svg │ │ │ ├── icon-edit.png │ │ │ ├── icon-finance.svg │ │ │ ├── icon-home.svg │ │ │ ├── icon-logout.svg │ │ │ ├── icon-order.svg │ │ │ ├── icon-profile.svg │ │ │ ├── icon-rightArrow.png │ │ │ ├── icon-search.png │ │ │ ├── logo.png │ │ │ ├── logout.png │ │ │ ├── no-img.png │ │ │ ├── no-profile-img.png │ │ │ ├── oldlogo.svg │ │ │ ├── print.png │ │ │ ├── profile-image.png │ │ │ └── white_logo.png │ ├── axiosInstance.jsx │ ├── common │ │ └── CartContext.jsx │ ├── components │ │ ├── Addcustomer.jsx │ │ ├── BasicInfo.jsx │ │ ├── Cart.jsx │ │ ├── CashPaymentPopup.jsx │ │ ├── ChangePassword.jsx │ │ ├── CloseShiftScreen.jsx │ │ ├── Finance.jsx │ │ ├── Footer.jsx │ │ ├── Header.jsx │ │ ├── LandingPage.jsx │ │ ├── Layout.jsx │ │ ├── LoginScreen.jsx │ │ ├── MainScreen.jsx │ │ ├── OpenShiftContext.jsx │ │ ├── OpenShiftScreen.jsx │ │ ├── OrderBox.jsx │ │ ├── OrderDetailModal.jsx │ │ ├── PrintFormateOfOrder.jsx │ │ ├── PrivateRoute.jsx │ │ ├── ProductCard.jsx │ │ ├── ProductCatalog.jsx │ │ ├── ProductPopup.jsx │ │ ├── PromoCodePopup.jsx │ │ ├── ReservationPopup.jsx │ │ ├── Sidebar.jsx │ │ ├── TableAvailability.jsx │ │ ├── ThemeSettingContext.jsx │ │ ├── barcode.jsx │ │ ├── debounce.jsx │ │ ├── getLocation.jsx │ │ ├── pagination.jsx │ │ └── style.css │ ├── hooks │ │ └── useIsSmallScreen.jsx │ ├── index.css │ ├── logo.svg │ ├── main.jsx │ ├── modules │ │ └── LandingPage │ │ │ └── index.jsx │ ├── pages │ │ ├── CustomerPage.jsx │ │ ├── HomePage.jsx │ │ ├── LoginPage.jsx │ │ ├── OrderPage.jsx │ │ └── ProfilePage.jsx │ ├── reportWebVitals.jsx │ ├── routes.jsx │ ├── setupTests.jsx │ └── utils │ │ └── imageUtils.jsx ├── vite.config.js └── yarn.lock ├── license.txt ├── nbpos ├── Customization │ ├── assignUser.py │ └── custom_header.py ├── __init__.py ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── controllers.py ├── custom_api │ └── v1 │ │ ├── cost_center.py │ │ ├── coupon_and_giftcard.py │ │ ├── customer.py │ │ ├── demo_data.py │ │ ├── getpos_login.py │ │ ├── hub_manager.py │ │ ├── item.py │ │ ├── location.py │ │ ├── master.py │ │ ├── payment.py │ │ ├── pos_profile.py │ │ ├── sales_invoice.py │ │ ├── sales_order.py │ │ ├── status_updater.py │ │ ├── warehouse.py │ │ └── workspace.py ├── fixtures │ ├── custom_docperm.json │ ├── custom_field.json │ ├── print_format.json │ ├── role.json │ └── web_page.json ├── hooks.py ├── modules.txt ├── nbpos │ ├── __init__.py │ ├── after_migrate.py │ ├── custom │ │ ├── account.json │ │ ├── cost_center.json │ │ ├── customer.json │ │ ├── email_template.json │ │ ├── item.json │ │ ├── item_barcode.json │ │ ├── item_group.json │ │ ├── item_tax.json │ │ ├── packed_item.json │ │ ├── party_account.json │ │ ├── pricing_rule.json │ │ ├── sales_invoice.json │ │ ├── sales_invoice_item.json │ │ ├── sales_order.json │ │ ├── sales_order_item.json │ │ └── warehouse.json │ ├── doctype │ │ ├── __init__.py │ │ ├── allergens │ │ │ ├── __init__.py │ │ │ ├── allergens.js │ │ │ ├── allergens.json │ │ │ ├── allergens.py │ │ │ └── test_allergens.py │ │ ├── attribute_items │ │ │ ├── __init__.py │ │ │ ├── attribute_items.json │ │ │ └── attribute_items.py │ │ ├── attributes │ │ │ ├── __init__.py │ │ │ ├── attributes.js │ │ │ ├── attributes.json │ │ │ ├── attributes.py │ │ │ └── test_attributes.py │ │ ├── combo │ │ │ ├── __init__.py │ │ │ ├── combo.js │ │ │ ├── combo.json │ │ │ ├── combo.py │ │ │ └── test_combo.py │ │ ├── combo_item │ │ │ ├── __init__.py │ │ │ ├── combo_item.json │ │ │ └── combo_item.py │ │ ├── gift_card │ │ │ ├── __init__.py │ │ │ ├── gift_card.js │ │ │ ├── gift_card.json │ │ │ ├── gift_card.py │ │ │ └── test_gift_card.py │ │ ├── hub_manager │ │ │ ├── __init__.py │ │ │ ├── hub_manager.js │ │ │ ├── hub_manager.json │ │ │ ├── hub_manager.py │ │ │ └── test_hub_manager.py │ │ ├── hub_manager_detail │ │ │ ├── __init__.py │ │ │ ├── hub_manager_detail.json │ │ │ └── hub_manager_detail.py │ │ ├── item_allergens │ │ │ ├── __init__.py │ │ │ ├── item_allergens.json │ │ │ └── item_allergens.py │ │ ├── item_group_multiselect │ │ │ ├── __init__.py │ │ │ ├── item_group_multiselect.js │ │ │ ├── item_group_multiselect.json │ │ │ ├── item_group_multiselect.py │ │ │ └── test_item_group_multiselect.py │ │ ├── item_type │ │ │ ├── __init__.py │ │ │ ├── item_type.js │ │ │ ├── item_type.json │ │ │ ├── item_type.py │ │ │ └── test_item_type.py │ │ ├── kitchen_kds │ │ │ ├── __init__.py │ │ │ ├── kitchen_kds.js │ │ │ ├── kitchen_kds.json │ │ │ ├── kitchen_kds.py │ │ │ └── test_kitchen_kds.py │ │ ├── nbpos_setting │ │ │ ├── __init__.py │ │ │ ├── nbpos_setting.js │ │ │ ├── nbpos_setting.json │ │ │ ├── nbpos_setting.py │ │ │ └── test_nbpos_setting.py │ │ ├── platform_settings │ │ │ ├── __init__.py │ │ │ ├── platform_settings.js │ │ │ ├── platform_settings.json │ │ │ ├── platform_settings.py │ │ │ └── test_platform_settings.py │ │ ├── pos_closing_shift │ │ │ ├── __init__.py │ │ │ ├── closing_shift_details.html │ │ │ ├── pos_closing_shift.js │ │ │ ├── pos_closing_shift.json │ │ │ ├── pos_closing_shift.py │ │ │ └── test_pos_closing_shift.py │ │ ├── pos_closing_shift_detail │ │ │ ├── __init__.py │ │ │ ├── pos_closing_shift_detail.json │ │ │ └── pos_closing_shift_detail.py │ │ ├── pos_closing_shift_taxes │ │ │ ├── __init__.py │ │ │ ├── pos_closing_shift_taxes.json │ │ │ └── pos_closing_shift_taxes.py │ │ ├── pos_opening_shift │ │ │ ├── __init__.py │ │ │ ├── pos_opening_shift.js │ │ │ ├── pos_opening_shift.json │ │ │ ├── pos_opening_shift.py │ │ │ ├── pos_opening_shift_list.js │ │ │ └── test_pos_opening_shift.py │ │ ├── pos_opening_shift_detail │ │ │ ├── __init__.py │ │ │ ├── pos_opening_shift_detail.json │ │ │ └── pos_opening_shift_detail.py │ │ ├── pos_terminal │ │ │ ├── __init__.py │ │ │ ├── pos_terminal.js │ │ │ ├── pos_terminal.json │ │ │ ├── pos_terminal.py │ │ │ └── test_pos_terminal.py │ │ ├── privacy_policy │ │ │ ├── __init__.py │ │ │ ├── privacy_policy.js │ │ │ ├── privacy_policy.json │ │ │ ├── privacy_policy.py │ │ │ └── test_privacy_policy.py │ │ ├── privacy_policy_and_terms │ │ │ ├── __init__.py │ │ │ ├── privacy_policy_and_terms.js │ │ │ ├── privacy_policy_and_terms.json │ │ │ ├── privacy_policy_and_terms.py │ │ │ └── test_privacy_policy_and_terms.py │ │ ├── related_item │ │ │ ├── __init__.py │ │ │ ├── related_item.json │ │ │ └── related_item.py │ │ ├── sales_invoice_reference │ │ │ ├── __init__.py │ │ │ ├── sales_invoice_reference.json │ │ │ └── sales_invoice_reference.py │ │ ├── sync_register │ │ │ ├── __init__.py │ │ │ ├── sync_register.js │ │ │ ├── sync_register.json │ │ │ ├── sync_register.py │ │ │ └── test_sync_register.py │ │ ├── theme_settings │ │ │ ├── __init__.py │ │ │ ├── test_theme_settings.py │ │ │ ├── theme_settings.js │ │ │ ├── theme_settings.json │ │ │ └── theme_settings.py │ │ ├── ward │ │ │ ├── __init__.py │ │ │ ├── test_ward.py │ │ │ ├── ward.js │ │ │ ├── ward.json │ │ │ └── ward.py │ │ ├── ward_detail │ │ │ ├── __init__.py │ │ │ ├── ward_detail.json │ │ │ └── ward_detail.py │ │ └── web_theme_settings │ │ │ ├── __init__.py │ │ │ ├── test_web_theme_settings.py │ │ │ ├── web_theme_settings.js │ │ │ ├── web_theme_settings.json │ │ │ └── web_theme_settings.py │ ├── hooks │ │ ├── __init__.py │ │ ├── cost_center.py │ │ ├── customer.py │ │ ├── global_defaults.py │ │ ├── item.py │ │ ├── item_group.py │ │ ├── item_price.py │ │ ├── pricing_rule.py │ │ ├── sales_invoice.py │ │ ├── sales_order.py │ │ ├── version.py │ │ └── warehouse.py │ ├── report │ │ ├── __init__.py │ │ └── x_and_z_report │ │ │ ├── __init__.py │ │ │ ├── x_and_z_report.js │ │ │ ├── x_and_z_report.json │ │ │ └── x_and_z_report.py │ ├── schedulers │ │ ├── expired_gift_card_settlement.py │ │ └── opencart_integration.py │ └── workspace │ │ └── getpos │ │ └── getpos.json ├── overrides │ ├── get_delivery_note.py │ ├── sales_invoice.py │ └── verification.py ├── patches.txt ├── patches │ ├── delete_fields.py │ └── setup_dummy_data.py ├── public │ ├── getpos-react │ │ ├── assets │ │ │ ├── empty-cart-4sut5lKX.png │ │ │ ├── favicon-Cp4CXsEh.ico │ │ │ ├── index-DrXFW2WB.js │ │ │ ├── index-SwKm2W5L.css │ │ │ ├── logo-B5zZg7br.png │ │ │ └── no-img-jQRv5CPY.png │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── robots.txt │ ├── images │ │ ├── Group 282.svg │ │ ├── Group 283.svg │ │ ├── Group 786.svg │ │ ├── Group 796.svg │ │ ├── Icon awesome-users.png │ │ ├── Path 6183.png │ │ ├── User Circle.svg │ │ ├── app_icon.ico │ │ ├── bootle.jpeg │ │ ├── done.svg │ │ ├── icons8-done.svg │ │ ├── logo1.png │ │ └── no_image.png │ ├── js │ │ ├── doctype_js │ │ │ ├── account.js │ │ │ ├── cost_center.js │ │ │ ├── customer.js │ │ │ ├── email_template.js │ │ │ ├── item.js │ │ │ ├── pricing_rule.js │ │ │ ├── sales_order.js │ │ │ └── warehouse.js │ │ └── nbpos.js │ └── node_modules ├── setupWiz.py ├── templates │ ├── __init__.py │ ├── includes │ │ └── login │ │ │ └── login.js │ └── pages │ │ ├── __init__.py │ │ ├── credit_note_email.html │ │ ├── gift_card_template.html │ │ └── sales_invoice_email.html └── www │ ├── __init__.py │ └── getpos-react.html ├── node_modules ├── .vite │ └── deps │ │ ├── _metadata.json │ │ └── package.json └── .yarn-integrity ├── package.json ├── requirements.txt ├── setup.py └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | agribora/docs/current -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # You can override the included template(s) by including variable overrides 2 | # SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings 3 | # Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings 4 | # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings 5 | # Note that environment variables can be set in several places 6 | # See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence 7 | stages: 8 | - test 9 | sast: 10 | stage: test 11 | include: 12 | - template: Security/SAST.gitlab-ci.yml 13 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include nbpos *.css 8 | recursive-include nbpos *.csv 9 | recursive-include nbpos *.html 10 | recursive-include nbpos *.ico 11 | recursive-include nbpos *.js 12 | recursive-include nbpos *.json 13 | recursive-include nbpos *.md 14 | recursive-include nbpos *.png 15 | recursive-include nbpos *.py 16 | recursive-include nbpos *.svg 17 | recursive-include nbpos *.txt 18 | recursive-exclude nbpos *.pyc 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

4 | GETPOS 5 |

6 | Simple, yet powerful POS solutions for businesses 7 |
8 | 9 | ## Introduction 10 | 11 | A cloud-based Get POS solution is a computerized system designed for your retail store, restaurant, multi-store, and supermarket to manage transactions, orders, inventory, and in-store product sales in one go. 12 | 13 | This custom POS system is built to increase revenue and save time for every retail and hospitality business chain that offers multi-location features such as inventory transfers, network pricing, and advanced reports. 14 | 15 | It builds on top of [ERPNext](https://github.com/frappe/erpnext) and the [Frappe Framework](https://github.com/frappe/frappe) - incredible FOSS projects built and maintained by the incredible folks at Frappe. Go check these out if you haven't already! 16 | 17 | ## Key Features 18 | - Inventory Management 19 | - Order Management 20 | - Employee Management 21 | - Supplier Management 22 | - Reporting 23 | - Accounts & Payroll 24 | - Multi-location Management 25 | 26 | For a detailed overview of these features, please [refer to the documentation](https://wiki.nestorbird.com/wiki/get-pos). 27 | 28 | ## Installation 29 | 30 | #### Frappe Cloud 31 | Simply signup with Frappe Cloud for a free trial and create a new site. Select Frappe Version-14 and select ERPNext and getPOS from Apps to Install. You can get started in a few minutes with a new site and a fresh install to try out the simple and cool features of the App. 32 | 33 | 34 | #### Manual Installation (Self hosted) 35 | 36 | Once you've [set up a Frappe site](https://frappeframework.com/docs/v14/user/en/installation/), installing GETPOS is simple: 37 | 38 | 1. Download the app using the Bench CLI. 39 | 40 | ```bash 41 | bench get-app --branch [branch name] https://gitlab.nestorbird.com/nestorbird/getpos/getpos.git 42 | ``` 43 | 44 | Replace `[branch name]` with the appropriate branch as per your setup: 45 | 46 | | Frappe Branch | GETPOS Branch | 47 | |---------------|-------------------------| 48 | | version-15 | version-1.4 | 49 | 50 | 51 | If it isn't specified, the `--branch` option will default to `getpos-1.4`. 52 | 53 | 2. Install the app on your site. 54 | 55 | ```bash 56 | bench --site [site name] install-app nbpos 57 | ``` 58 | 59 | ## Contributing 60 | - [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines) 61 | - [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines) 62 | 63 | ## License 64 | [GNU General Public License (v3)](https://github.com/ashishsaretia/GETPOS/blob/deployment-development/license.txt) 65 | 66 | ## Support 67 | For support please visit or click [here](https://wiki.nestorbird.com/wiki/support) 68 | -------------------------------------------------------------------------------- /getpos-react/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /getpos-react/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /getpos-react/README.md: -------------------------------------------------------------------------------- 1 | # React + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | -------------------------------------------------------------------------------- /getpos-react/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import react from 'eslint-plugin-react' 4 | import reactHooks from 'eslint-plugin-react-hooks' 5 | import reactRefresh from 'eslint-plugin-react-refresh' 6 | 7 | export default [ 8 | { ignores: ['dist'] }, 9 | { 10 | files: ['**/*.{js,jsx}'], 11 | languageOptions: { 12 | ecmaVersion: 2020, 13 | globals: globals.browser, 14 | parserOptions: { 15 | ecmaVersion: 'latest', 16 | ecmaFeatures: { jsx: true }, 17 | sourceType: 'module', 18 | }, 19 | }, 20 | settings: { react: { version: '18.3' } }, 21 | plugins: { 22 | react, 23 | 'react-hooks': reactHooks, 24 | 'react-refresh': reactRefresh, 25 | }, 26 | rules: { 27 | ...js.configs.recommended.rules, 28 | ...react.configs.recommended.rules, 29 | ...react.configs['jsx-runtime'].rules, 30 | ...reactHooks.configs.recommended.rules, 31 | 'react/jsx-no-target-blank': 'off', 32 | 'react-refresh/only-export-components': [ 33 | 'warn', 34 | { allowConstantExport: true }, 35 | ], 36 | }, 37 | }, 38 | ] 39 | -------------------------------------------------------------------------------- /getpos-react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Get POS 9 | 10 | 11 |
12 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /getpos-react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-pos", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build --base=/assets/nbpos/getpos-react/ && yarn copy-html-entry", 8 | "lint": "eslint .", 9 | "preview": "vite preview", 10 | "copy-html-entry": "cp ../nbpos/public/getpos-react/index.html ../nbpos/www/getpos-react.html" 11 | }, 12 | "dependencies": { 13 | "frappe-react-sdk": "^1.9.0", 14 | "moment": "^2.30.1", 15 | "react": "^18.3.1", 16 | "react-dom": "^18.3.1", 17 | "react-router-dom": "^6.26.1" 18 | }, 19 | "devDependencies": { 20 | "@eslint/js": "^9.9.0", 21 | "@testing-library/jest-dom": "^5.17.0", 22 | "@testing-library/react": "^13.4.0", 23 | "@testing-library/user-event": "^13.5.0", 24 | "@types/react": "^18.3.3", 25 | "@types/react-dom": "^18.3.0", 26 | "@vitejs/plugin-react": "^4.3.1", 27 | "antd": "^5.18.0", 28 | "axios": "^1.7.2", 29 | "bootstrap": "^5.3.3", 30 | "cors": "^2.8.5", 31 | "eslint": "^9.9.0", 32 | "eslint-plugin-react": "^7.35.0", 33 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 34 | "eslint-plugin-react-refresh": "^0.4.9", 35 | "frappe-react-sdk": "^1.7.0", 36 | "globals": "^15.9.0", 37 | "history": "^5.3.0", 38 | "js-cookie": "^3.0.5", 39 | "lodash": "^4.17.21", 40 | "react": "^18.3.1", 41 | "react-barcode-reader": "^0.0.2", 42 | "react-dom": "^18.3.1", 43 | "react-router-dom": "^6.23.1", 44 | "react-scripts": "5.0.1", 45 | "react-slick": "^0.30.2", 46 | "scanner-library": "^0.0.1", 47 | "slick-carousel": "^1.8.1", 48 | "swiper": "^11.1.5", 49 | "use-scan-detection": "^0.2.3", 50 | "vite": "^5.4.1", 51 | "web-vitals": "^2.1.4" 52 | }, 53 | "eslintConfig": { 54 | "extends": [ 55 | "react-app", 56 | "react-app/jest" 57 | ] 58 | }, 59 | "browserslist": { 60 | "production": [ 61 | ">0.2%", 62 | "not dead", 63 | "not op_mini all" 64 | ], 65 | "development": [ 66 | "last 1 chrome version", 67 | "last 1 firefox version", 68 | "last 1 safari version" 69 | ] 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /getpos-react/proxyOptions.js: -------------------------------------------------------------------------------- 1 | const common_site_config = require('../../../sites/common_site_config.json'); 2 | const { webserver_port } = common_site_config; 3 | 4 | export default { 5 | '^/(app|api|assets|files|private)': { 6 | target: `http://127.0.0.1:${webserver_port}`, 7 | ws: true, 8 | router: function(req) { 9 | const site_name = req.headers.host.split(':')[0]; 10 | return `http://${site_name}:${webserver_port}`; 11 | } 12 | }, 13 | 14 | }; 15 | -------------------------------------------------------------------------------- /getpos-react/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/public/favicon.ico -------------------------------------------------------------------------------- /getpos-react/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/public/logo192.png -------------------------------------------------------------------------------- /getpos-react/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/public/logo512.png -------------------------------------------------------------------------------- /getpos-react/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /getpos-react/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /getpos-react/server.js: -------------------------------------------------------------------------------- 1 | // server.js 2 | require('dotenv').config(); 3 | const express = require('express'); 4 | const axios = require('axios'); 5 | const bodyParser = require('body-parser'); 6 | const cors = require('cors'); 7 | 8 | const app = express(); 9 | 10 | app.use(cors({ origin: 'http://localhost:3000' })); 11 | app.use(bodyParser.json()); 12 | 13 | app.post('/api/authenticate', async (req, res) => { 14 | const { client_id, client_secret, auth_token_url } = req.body; 15 | 16 | const params = new URLSearchParams(); 17 | params.append('grant_type', 'client_credentials'); 18 | params.append('client_id', client_id); 19 | params.append('client_secret', client_secret); 20 | params.append('scope', 'urn:viva:payments:core:api'); 21 | 22 | try { 23 | const response = await axios.post(`${auth_token_url}/connect/token`, params, { 24 | headers: { 25 | 'Content-Type': 'application/x-www-form-urlencoded', 26 | }, 27 | }); 28 | res.json(response.data); 29 | } catch (error) { 30 | console.error('Error obtaining access token:', error); 31 | res.status(500).json({ error: 'Failed to obtain access token' }); 32 | } 33 | }); 34 | 35 | const PORT = process.env.PORT || 5000; 36 | app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); 37 | -------------------------------------------------------------------------------- /getpos-react/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /getpos-react/src/App.jsx: -------------------------------------------------------------------------------- 1 | import "bootstrap/dist/css/bootstrap.min.css"; 2 | import React from "react"; 3 | import AppRoutes from "./routes"; 4 | import "./App.css"; 5 | 6 | 7 | 8 | function App() { 9 | return ( 10 |
11 | 12 |
13 | ) 14 | } 15 | 16 | export default App 17 | -------------------------------------------------------------------------------- /getpos-react/src/App.test.jsx: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /getpos-react/src/api/index.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | const APIs = { 4 | getGuestCustomer: '/api/method/nbpos.custom_api.v1.master.get_theme_settings', 5 | login: '/api/method/nbpos.custom_api.v1.nbpos_login.login', 6 | getOpeningData : '/api/method/nbpos.custom_api.v1.pos_profile.get_opening_data', 7 | createOpeningShift:'/api/method/nbpos.custom_api.v1.pos_profile.create_opening_voucher', 8 | createClosingShift:'/api/method/nbpos.nbpos.doctype.pos_closing_shift.pos_closing_shift.submit_closing_shift', 9 | getCategoriesAndProducts: '/api/method/nbpos.custom_api.v1.item.get_items', 10 | getAllCustomers: '/api/method/nbpos.custom_api.v1.customer.get_all_customer', 11 | getSalesOrderList: '/api/method/nbpos.custom_api.v1.sales_order.get_sales_order_list', 12 | changePassword: '/api/method/nbpos.custom_api.v1.nbpos_login.change_password', 13 | getBasicInfo: '/api/method/nbpos.custom_api.v1.hub_manager.get_details_by_hubmanager', 14 | createCustomer:'/api/method/nbpos.custom_api.v1.customer.create_customer', 15 | editCustomer: '/api/method/nbpos.custom_api.v1.customer.edit_customer', 16 | createOrder:'/api/method/nbpos.custom_api.v1.sales_order.create_sales_order_kiosk', 17 | returnSalesOrder: '/api/method/nbpos.custom_api.v1.sales_order.return_sales_order', 18 | getCouponCodeList: '/api/method/nbpos.custom_api.v1.coupon_and_giftcard.coupon_code_details', 19 | validatePromoCode:'/api/method/nbpos.custom_api.v1.coupon_and_giftcard.validate_coupon_code', 20 | getCustomerDetails:'/api/method/nbpos.custom_api.v1.customer.get_customer', 21 | getlocation:'/api/method/nbpos.custom_api.v1.location.get_location', 22 | 23 | validateGiftCode:'api/method/nbpos.custom_api.v1.coupon_and_giftcard.validate_gift_card', 24 | sendMail:"api/method/nbpos.custom_api.v1.sales_invoice.resend_sales_invoice_email", 25 | getShiftDetails:"/api/method/nbpos.nbpos.doctype.pos_closing_shift.pos_closing_shift.get_shift_details", 26 | get_user: '/api/method/nbpos.custom_api.v1.getpos_login.get_user', 27 | 28 | }; 29 | 30 | export default APIs; 31 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/Booking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/Booking.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/Credit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/Credit.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/Delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/Delete.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/Logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/Logo2.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/Search-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/Search-icon.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/btn-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/btn-cross.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/btn-tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/btn-tick.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/calc-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/calc-close.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/card.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/cash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/cash.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/cross.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/drop-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/drop-arrow.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/email.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/empty-cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/empty-cart.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/icon-card.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-cash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/icon-cash.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-changePwd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-customer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/icon-edit.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-order.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-profile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-rightArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/icon-rightArrow.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/icon-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/icon-search.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/logo.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/logout.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/no-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/no-img.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/no-profile-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/no-profile-img.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/print.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/profile-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/profile-image.png -------------------------------------------------------------------------------- /getpos-react/src/assets/images/white_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/assets/images/white_logo.png -------------------------------------------------------------------------------- /getpos-react/src/axiosInstance.jsx: -------------------------------------------------------------------------------- 1 | import { Modal } from "antd"; 2 | import axios from "axios"; 3 | import { createBrowserHistory } from "history"; 4 | import Cookies from "js-cookie"; 5 | 6 | const CustomIcon = 💀; 7 | const axiosInstance = axios.create({ 8 | headers: { 9 | "Content-Type": "application/json", 10 | "X-Frappe-CSRF-Token": window.csrf_token ||'', 11 | }, 12 | }); 13 | 14 | const history = createBrowserHistory(); 15 | 16 | axiosInstance.interceptors.response.use( 17 | response => response, 18 | error => { 19 | if (error.response && error.response.data) { 20 | const { exc_type, exception } = error.response.data; 21 | 22 | if (exc_type === "PermissionError" || exc_type === "ValidationError") { 23 | handleGuestUser(); 24 | } 25 | else if (exception && exception.includes("User None is disabled. Please contact your System Manager.")) { 26 | handleGuestUser(); 27 | } 28 | else if (error.message === "Network Error" || error.message === "Request failed with status code 500") { 29 | Modal.warning({ 30 | title: "Please check your network connection.", 31 | icon: CustomIcon, 32 | onOk: () => { 33 | window.location.reload(); 34 | } 35 | }); 36 | } 37 | else if (localStorage.getItem("user") == null &&localStorage.getItem("selectedProfile") == null || localStorage.getItem("user")===""&&localStorage.getItem("selectedProfile") === ""|| localStorage.length === 0) { 38 | handleGuestUser(); 39 | } 40 | } 41 | return Promise.reject(error); 42 | } 43 | ); 44 | 45 | const handleGuestUser = () => { 46 | Cookies.remove('sid'); 47 | Cookies.remove('system_user'); 48 | Cookies.remove('user_id'); 49 | Cookies.remove('user_image'); 50 | localStorage.removeItem("user"); 51 | localStorage.removeItem("sid"); 52 | localStorage.removeItem("api_key"); 53 | localStorage.removeItem("api_secret"); 54 | 55 | if (window.location.pathname !== '/') { 56 | history.push('/getpos-react'); 57 | window.location.reload(); 58 | } else { 59 | history.push('/getpos-react/'); 60 | } 61 | }; 62 | 63 | export default axiosInstance; 64 | -------------------------------------------------------------------------------- /getpos-react/src/components/BasicInfo.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import { changePassword, fetchBasicInfo } from "../modules/LandingPage"; 3 | import { useOpenShift } from "./OpenShiftContext"; 4 | import { Spin } from "antd"; 5 | 6 | const BasicInfo = () => { 7 | const [email, setEmail] = useState(""); 8 | // const [user, setUser] = useState(""); 9 | const [password, setPassword] = useState(""); 10 | const [message, setMessage] = useState(null); 11 | const [error, setError] = useState(null); 12 | const [profileInfo, setProfileInfo] = useState({}); 13 | const [loading, setLoading] = useState(true); 14 | const { openShiftData } = useOpenShift(); 15 | const { cashBalance, digitalBalance, selectedProfile } = openShiftData; 16 | const [selectedTab, setSelectedTab] = useState("Basic Info"); 17 | 18 | const handleChangePassword = async () => { 19 | try { 20 | const response = await changePassword(email, password); 21 | if (response.message.success_key === 1) { 22 | setMessage("Password changed successfully"); 23 | setError(null); 24 | } else { 25 | setMessage(null); 26 | setError("Failed to change password"); 27 | } 28 | } catch (error) { 29 | setMessage(null); 30 | setError("Error changing password"); 31 | } 32 | }; 33 | 34 | const userString = localStorage.getItem("user"); 35 | const user = userString ? JSON.parse(userString) : null; 36 | 37 | useEffect(() => { 38 | const loadProfileInfo = async () => { 39 | try { 40 | const data = await fetchBasicInfo(user.email); 41 | setProfileInfo(data); 42 | } catch (error) { 43 | setError("Error fetching profile information"); 44 | } finally { 45 | setLoading(false); 46 | } 47 | }; 48 | 49 | loadProfileInfo(); 50 | }, []); 51 | 52 | return ( 53 |
54 |

Basic Info

55 |
56 | {loading ? ( 57 | 58 | ) : error ? ( 59 |

{error}

60 | ) : ( 61 |
62 |

{profileInfo.full_name}

63 |

Hub Manager

64 | {/*

{profileInfo.hub_manager}

65 |

{profileInfo.mobile_no || "N/A"}

*/} 66 |

{profileInfo.email}

67 |
68 | )} 69 |
70 |
71 | ); 72 | }; 73 | 74 | export default BasicInfo; 75 | -------------------------------------------------------------------------------- /getpos-react/src/components/Finance.jsx: -------------------------------------------------------------------------------- 1 | // src/components/Finance.js 2 | import React, { useEffect, useState } from "react"; 3 | import { fetchBasicInfo } from "../modules/LandingPage"; 4 | import { Spin } from "antd"; 5 | 6 | const Finance = ({ balance }) => { 7 | const [error, setError] = useState(null); 8 | const [loading, setLoading] = useState(true); 9 | const [profileInfo, setProfileInfo] = useState({}); 10 | const user = JSON.parse( 11 | localStorage.getItem("user") 12 | ); 13 | useEffect(() => { 14 | const loadProfileInfo = async () => { 15 | try { 16 | const data = await fetchBasicInfo(user.email); 17 | setProfileInfo(data); 18 | } catch (error) { 19 | setError("Error fetching profile information"); 20 | } finally { 21 | setLoading(false); 22 | } 23 | }; 24 | 25 | loadProfileInfo(); 26 | }, []); 27 | return ( 28 |
29 |

Finance

30 |
31 | {loading ? ( 32 | 33 | ) : error ? ( 34 |

{error}

35 | ) : ( 36 |
37 |
CASH BALANCE
38 |

{profileInfo.balance}

39 |
40 | )} 41 |
42 |
43 | ); 44 | }; 45 | 46 | export default Finance; 47 | -------------------------------------------------------------------------------- /getpos-react/src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { NavLink } from "react-router-dom"; 3 | import Home from "../assets/images/icon-home.svg"; 4 | import Order from "../assets/images/icon-order.svg"; 5 | import Customer from "../assets/images/icon-customer.svg"; 6 | import Profile from "../assets/images/icon-profile.svg"; 7 | import Logout from "../assets/images/logout.png"; 8 | 9 | 10 | const Footer = () => { 11 | return ( 12 | 71 | ); 72 | }; 73 | 74 | export default Footer; 75 | -------------------------------------------------------------------------------- /getpos-react/src/components/Layout.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import Header from "./Header"; 3 | import Footer from "./Footer"; 4 | 5 | const Layout = ({ children, showFooter = true, showDropdown = true }) => { 6 | const [user, setUser] = useState(null); 7 | 8 | useEffect(() => { 9 | // Retrieve user information from local storage 10 | const userData = localStorage.getItem('user'); 11 | if (userData) { 12 | setUser(JSON.parse(userData)); 13 | } 14 | }, []); 15 | 16 | return ( 17 |
18 |
19 |
{children}
20 | {showFooter &&
} 21 |
22 | ); 23 | }; 24 | 25 | export default Layout; 26 | -------------------------------------------------------------------------------- /getpos-react/src/components/OpenShiftContext.jsx: -------------------------------------------------------------------------------- 1 | // OpenShiftContext.js 2 | import React, { createContext, useContext, useState, useEffect } from "react"; 3 | 4 | const OpenShiftContext = createContext(); 5 | 6 | export const OpenShiftProvider = ({ children }) => { 7 | const [openShiftData, setOpenShiftData] = useState(() => { 8 | const savedData = localStorage.getItem("openShiftData"); 9 | return savedData ? JSON.parse(savedData) : { selectedProfile: '' }; // Initialize with an object that includes selectedProfile 10 | }); 11 | 12 | useEffect(() => { 13 | if (openShiftData) { 14 | // console.log("Saving openShiftData to localStorage:", openShiftData); 15 | localStorage.setItem("openShiftData", JSON.stringify(openShiftData)); 16 | } 17 | }, [openShiftData]); 18 | 19 | return ( 20 | 21 | {children} 22 | 23 | ); 24 | }; 25 | 26 | export const useOpenShift = () => useContext(OpenShiftContext); 27 | -------------------------------------------------------------------------------- /getpos-react/src/components/PrivateRoute.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Navigate } from "react-router-dom"; 3 | import { useFrappeAuth } from "frappe-react-sdk"; // Import FrappeAuth to get currentUser 4 | import { Spin } from "antd"; 5 | const PrivateRoute = ({ 6 | element: Component, 7 | requiredKeys, 8 | redirectPath = "/login", 9 | ...rest 10 | }) => { 11 | const { currentUser, isLoading } = useFrappeAuth(); // Get currentUser from Frappe auth 12 | 13 | // Function to check if all required keys are in localStorage 14 | const checkLocalStorageKeys = (keys) => { 15 | return keys.every((key) => localStorage.getItem(key)); // Ensure all required keys are in localStorage 16 | }; 17 | 18 | const storedUser = JSON.parse(localStorage.getItem("user")); // Get the user from localStorage 19 | 20 | // Check if required localStorage data exists and if the currentUser matches the localStorage user 21 | const hasRequiredData = 22 | checkLocalStorageKeys(requiredKeys) && 23 | currentUser && 24 | storedUser && 25 | currentUser === storedUser.email; 26 | 27 | // Redirect to login page if not authorized or if Frappe authentication is still loading 28 | if (isLoading) { 29 | return ( 30 |
31 | 32 |
33 | ); // Show loading spinner or message while checking 34 | } 35 | 36 | return hasRequiredData ? ( 37 | 38 | ) : ( 39 | 40 | ); 41 | }; 42 | 43 | export default PrivateRoute; 44 | -------------------------------------------------------------------------------- /getpos-react/src/components/ProductCard.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import NoImage from "../assets/images/no-img.png"; 3 | import useScanDetection from "use-scan-detection"; 4 | import { getItemByScan } from "../modules/LandingPage"; 5 | import { Modal } from "antd"; 6 | import { useThemeSettings } from "./ThemeSettingContext"; 7 | 8 | const ProductCard = ({ product, onAddToCart }) => { 9 | const formatPrice = (price) => { 10 | return price ? price.toFixed(2) : "NA"; 11 | }; 12 | 13 | const [scannedValue, setScannedValue] = useState(""); 14 | const themeSettings = useThemeSettings(); 15 | 16 | return ( 17 |
qty?.stock_qty === 0) ? "disabled" : "" 20 | }`} 21 | > 22 |
23 | {product?.name} 27 |
28 |
29 | {product?.item_type} 30 |

{product?.name}

31 | 32 | {product?.stock?.map((qty) => qty?.stock_qty)} 33 | 34 |
35 | 36 | {themeSettings?.currency_symbol || "$"} 37 | {formatPrice(product?.product_price) || "NA"} 38 | 39 | 42 |
43 |
44 |
45 | ); 46 | }; 47 | 48 | export default ProductCard; 49 | -------------------------------------------------------------------------------- /getpos-react/src/components/ProductCatalog.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import ProductCard from "./ProductCard"; 3 | import Pagination from "./pagination"; // Import the Pagination component 4 | 5 | const ProductCatalog = ({ categoryName, products, onAddToCart }) => { 6 | const [currentPage, setCurrentPage] = useState(1); // Page state 7 | const [productsPerPage, setProductsPerPage] = useState(10); // Products per page 8 | 9 | // Reset page when category changes 10 | useEffect(() => { 11 | setCurrentPage(1); 12 | }, [categoryName]); 13 | 14 | // Adjust number of products per page based on screen size 15 | useEffect(() => { 16 | const handleResize = () => { 17 | const width = window.innerWidth; 18 | if (width >= 1720) { 19 | setProductsPerPage(10); 20 | } else if (width >= 1430) { 21 | setProductsPerPage(8); 22 | } else if (width >= 1230) { 23 | setProductsPerPage(8); 24 | } 25 | else if (width >= 1150) { 26 | setProductsPerPage(6); 27 | } else { 28 | setProductsPerPage(4); 29 | } 30 | }; 31 | 32 | window.addEventListener("resize", handleResize); 33 | handleResize(); // Set initial value based on current window size 34 | 35 | return () => { 36 | window.removeEventListener("resize", handleResize); 37 | }; 38 | }, []); 39 | 40 | // Calculate the indexes for slicing the products array 41 | const indexOfLastProduct = currentPage * productsPerPage; 42 | const indexOfFirstProduct = indexOfLastProduct - productsPerPage; 43 | const currentProducts = products.slice(indexOfFirstProduct, indexOfLastProduct); // Current page products 44 | 45 | // Determine total number of pages 46 | const totalPages = Math.ceil(products.length / productsPerPage); 47 | 48 | // Handle page changes 49 | const handlePageChange = (newPage) => { 50 | setCurrentPage(newPage); // Update to the selected page 51 | }; 52 | 53 | return ( 54 |
55 |

{categoryName}

56 |
57 | {currentProducts.length > 0 ? ( 58 | currentProducts.map((product) => ( 59 | 64 | )) 65 | ) : ( 66 |

No products available

67 | )} 68 |
69 | {totalPages > 1 && ( 70 | 75 | )} 76 |
77 | ); 78 | }; 79 | 80 | export default ProductCatalog; 81 | -------------------------------------------------------------------------------- /getpos-react/src/components/Sidebar.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Drawer } from "antd"; 3 | 4 | const Sidebar = ({ categories, onSelectCategory, selectedCategory, isVisible, onClose, isSmallScreen }) => { 5 | const sidebarContent = ( 6 |
7 |
    8 | {categories.length > 0 ? ( 9 | categories.map((category) => ( 10 |
  • onSelectCategory(category.item_group)} 13 | className={selectedCategory === category.item_group ? "active" : ""} 14 | > 15 | {category.item_group} 16 |
  • 17 | )) 18 | ) : ( 19 |
  • No categories available
  • 20 | )} 21 |
22 |
23 | 24 | ); 25 | 26 | return isSmallScreen ? ( 27 | 35 | {sidebarContent} 36 | 37 | ) : ( 38 | <>{sidebarContent} 39 | ); 40 | }; 41 | 42 | export default Sidebar; 43 | -------------------------------------------------------------------------------- /getpos-react/src/components/TableAvailability.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { Modal, Button } from "antd"; 3 | 4 | const DynamicTableAvailabilityPopup = ({ visible, onClose, onSubmit }) => { 5 | const [selectedTables, setSelectedTables] = useState([]); 6 | 7 | // Mock API data for tables 8 | const tableData = { 9 | tableCategories: [ 10 | { 11 | category: "6 Seater Tables", 12 | tables: [ 13 | { id: "01", available: true }, 14 | { id: "02", available: true }, 15 | { id: "03", available: false }, 16 | { id: "04", available: true }, 17 | { id: "05", available: false }, 18 | { id: "06", available: true }, 19 | ], 20 | }, 21 | { 22 | category: "4 Seater Tables", 23 | tables: [ 24 | { id: "13", available: false }, 25 | { id: "14", available: true }, 26 | { id: "15", available: true }, 27 | { id: "16", available: true }, 28 | ], 29 | }, 30 | ], 31 | }; 32 | 33 | const handleTableSelect = (id) => { 34 | setSelectedTables((prevSelected) => { 35 | if (prevSelected.includes(id)) { 36 | return prevSelected.filter((table) => table !== id); 37 | } else { 38 | return [...prevSelected, id]; 39 | } 40 | }); 41 | }; 42 | const handleBookClick = () => { 43 | onSubmit(selectedTables); 44 | }; 45 | 46 | const renderTables = (tables) => 47 | tables.map((table) => ( 48 |
table.available && handleTableSelect(table.id)} 54 | > 55 | {table.id} 56 |
57 | )); 58 | 59 | return ( 60 | 61 |

TABLE AVAILABILITY

62 |
63 | {tableData.tableCategories.map((category) => ( 64 |
65 |

{category.category}

66 |
{renderTables(category.tables)}
67 |
68 | ))} 69 |
70 |
71 | 74 | 81 |
82 |
83 | ); 84 | }; 85 | 86 | export default DynamicTableAvailabilityPopup; 87 | -------------------------------------------------------------------------------- /getpos-react/src/components/ThemeSettingContext.jsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState, useEffect, useContext } from 'react'; 2 | import { getGuestCustomer } from '../modules/LandingPage'; // Adjust the import based on your API file location 3 | 4 | const ThemeSettingsContext = createContext(); 5 | 6 | export const useThemeSettings = () => { 7 | return useContext(ThemeSettingsContext); 8 | }; 9 | 10 | export const ThemeSettingsProvider = ({ children }) => { 11 | const [themeSettings, setThemeSettings] = useState(null); 12 | 13 | const handleGetGuestCustomer = async () => { 14 | try { 15 | const res = await getGuestCustomer(); 16 | if (res.status === 200) { 17 | // console.log(res.data.message.data); 18 | setThemeSettings(res.data.message.data); 19 | } else { 20 | console.log('Error in getting the Guest Customer'); 21 | } 22 | } catch (error) { 23 | console.log('Error in fetching guest customer:', error.message); 24 | } 25 | }; 26 | 27 | useEffect(() => { 28 | handleGetGuestCustomer(); 29 | }, []); 30 | 31 | return ( 32 | 33 | {children} 34 | 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /getpos-react/src/components/barcode.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState, useContext } from 'react'; 2 | import { getItemByScan } from '../modules/LandingPage'; 3 | import { Modal } from 'antd'; 4 | import { CartContext } from '../common/CartContext'; 5 | 6 | const BarcodeScanner = () => { 7 | const [code, setCode] = useState(""); 8 | let barcodeScan = ""; 9 | 10 | const { addItemToCart } = useContext(CartContext); 11 | useEffect(() => { 12 | let scanTimeout; 13 | 14 | function handleKeyDown(e) { 15 | if (e.keyCode === 13 && barcodeScan.length > 3) { 16 | handleScan(barcodeScan); 17 | barcodeScan = ""; 18 | clearTimeout(scanTimeout); 19 | } else if (e.keyCode !== 16) { 20 | barcodeScan += e.key; 21 | 22 | clearTimeout(scanTimeout); 23 | scanTimeout = setTimeout(() => { 24 | barcodeScan = ""; 25 | }, 200); 26 | } 27 | } 28 | 29 | document.addEventListener('keydown', handleKeyDown); 30 | 31 | return function cleanup() { 32 | document.removeEventListener('keydown', handleKeyDown); 33 | clearTimeout(scanTimeout); 34 | } 35 | }, []); 36 | 37 | const handleScan = async (barCodeString) => { 38 | setCode(barCodeString); 39 | await getItem(barCodeString); // Ensure getItem is awaited 40 | }; 41 | 42 | const getItem = async (code) => { 43 | try { 44 | const res = await getItemByScan(code); 45 | if (res.status === 200) { 46 | 47 | const items = res.data.message[0].items; 48 | 49 | items.forEach(item => { 50 | addItemToCart({ 51 | id: item.id, 52 | name: item.name, 53 | quantity: 1, // Default quantity 54 | price: item.product_price // Corrected price property 55 | }); 56 | }); 57 | } else { 58 | Modal.warning({ 59 | title: 'Item Not Found', 60 | content: 'The scanned item was not found.', 61 | }); 62 | } 63 | } catch (error) { 64 | Modal.error({ 65 | title: 'Error', 66 | content: 'An error occurred while fetching the item.', 67 | }); 68 | } 69 | }; 70 | 71 | return ( 72 | "" 73 | ); 74 | }; 75 | 76 | export default BarcodeScanner; 77 | -------------------------------------------------------------------------------- /getpos-react/src/components/debounce.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | export function useDebounce(value, delay) { 4 | const [debouncedValue, setDebouncedValue] = useState(value); 5 | 6 | useEffect(() => { 7 | const handler = setTimeout(() => { 8 | setDebouncedValue(value); 9 | }, delay); 10 | 11 | return () => { 12 | clearTimeout(handler); 13 | }; 14 | }, [value, delay]); 15 | 16 | return debouncedValue; 17 | } 18 | -------------------------------------------------------------------------------- /getpos-react/src/components/pagination.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Pagination = ({ totalItems, currentPage, onPageChange, itemsPerPage ,totalPages}) => { 5 | const totalPage = Math.ceil(totalItems / itemsPerPage); 6 | const [currPage, setCurrPage] = useState(currentPage); 7 | 8 | useEffect(() => { 9 | setCurrPage(currentPage); // Sync with parent if `currentPage` prop changes 10 | }, [currentPage]); 11 | 12 | const handlePagesDecrement = () => { 13 | if (currPage === 1) return; 14 | const newPage = currPage - 1; 15 | setCurrPage(newPage); 16 | onPageChange(newPage); 17 | }; 18 | 19 | const handlePagesIncrement = () => { 20 | if (currPage === totalPage) return; 21 | const newPage = currPage + 1; 22 | setCurrPage(newPage); 23 | onPageChange(newPage); 24 | }; 25 | 26 | return ( 27 | <> 28 |
29 | 36 |
{currPage}
37 | 44 |
45 | 46 | ); 47 | }; 48 | 49 | Pagination.propTypes = { 50 | totalItems: PropTypes.number.isRequired, 51 | currentPage: PropTypes.number.isRequired, 52 | onPageChange: PropTypes.func.isRequired, 53 | itemsPerPage: PropTypes.number.isRequired, 54 | }; 55 | 56 | export default Pagination; 57 | -------------------------------------------------------------------------------- /getpos-react/src/hooks/useIsSmallScreen.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | 3 | const useIsSmallScreen = (breakpoint = 768) => { 4 | const [isSmallScreen, setIsSmallScreen] = useState(window.innerWidth < breakpoint); 5 | 6 | useEffect(() => { 7 | const handleResize = () => { 8 | setIsSmallScreen(window.innerWidth < breakpoint); 9 | }; 10 | 11 | window.addEventListener("resize", handleResize); 12 | return () => window.removeEventListener("resize", handleResize); 13 | }, [breakpoint]); 14 | 15 | return isSmallScreen; 16 | }; 17 | 18 | export default useIsSmallScreen; 19 | -------------------------------------------------------------------------------- /getpos-react/src/index.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/getpos-react/src/index.css -------------------------------------------------------------------------------- /getpos-react/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /getpos-react/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import './index.css' 3 | import { FrappeProvider } from "frappe-react-sdk"; 4 | import App from "./App"; 5 | import { StrictMode } from 'react'; 6 | import { CartProvider } from "./common/CartContext"; 7 | 8 | createRoot(document.getElementById('root')).render( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | , 18 | ) 19 | -------------------------------------------------------------------------------- /getpos-react/src/pages/HomePage.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import MainScreen from "../components/MainScreen"; 3 | 4 | const HomePage = () => { 5 | return ; 6 | }; 7 | 8 | export default HomePage; 9 | -------------------------------------------------------------------------------- /getpos-react/src/pages/LoginPage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | // import LoginScreen from '../components/LoginScreen'; 3 | import LandingPage from '../components/LandingPage'; 4 | const LoginPage = () => { 5 | return ( 6 |
7 | {/* */} 8 | 9 |
10 | ); 11 | }; 12 | 13 | export default LoginPage; -------------------------------------------------------------------------------- /getpos-react/src/reportWebVitals.jsx: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /getpos-react/src/setupTests.jsx: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /getpos-react/src/utils/imageUtils.jsx: -------------------------------------------------------------------------------- 1 | import NoImage from "../assets/images/no-img.png"; 2 | 3 | export const getImageUrl = (imagePath) => { 4 | const baseUrl = "https://getposdev.frappe.cloud"; 5 | return imagePath ? `${baseUrl}${imagePath}` : NoImage; 6 | }; 7 | 8 | -------------------------------------------------------------------------------- /getpos-react/vite.config.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { defineConfig } from 'vite'; 3 | import react from '@vitejs/plugin-react' 4 | import proxyOptions from './proxyOptions'; 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [react()], 9 | 10 | server: { 11 | port: 8080, 12 | proxy: proxyOptions, 13 | secure:false 14 | }, 15 | resolve: { 16 | alias: { 17 | '@': path.resolve(__dirname, 'src') 18 | } 19 | }, 20 | build: { 21 | outDir: '../nbpos/public/getpos-react', 22 | emptyOutDir: true, 23 | target: 'es2015', 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /nbpos/Customization/assignUser.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | def assign_role(doc, method): 4 | # Assign the role "GetPos User" to the user 5 | if not frappe.db.exists("Role", "GetPos User"): 6 | return 7 | doc.add_roles("GetPos User") 8 | 9 | # Generate an API key if not already generated 10 | if not doc.api_key: 11 | doc.api_key = frappe.generate_hash() 12 | doc.api_secret = frappe.generate_hash() 13 | doc.save() 14 | -------------------------------------------------------------------------------- /nbpos/Customization/custom_header.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | def set_user_active(): 4 | from frappe.website.utils import clear_cache 5 | clear_cache() 6 | # frappe.cache.set_value(frappe.session.csrf_token, frappe.session.csrf_token) 7 | 8 | 9 | def set_user_inactive(): 10 | frappe.cache.delete_key(frappe.session.csrf_token) 11 | -------------------------------------------------------------------------------- /nbpos/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | __version__ = '0.0.1' 3 | 4 | from frappe.core.doctype.user.user import User 5 | 6 | 7 | from nbpos.overrides.verification import custom_send_login_mail 8 | 9 | User.send_login_mail=custom_send_login_mail 10 | -------------------------------------------------------------------------------- /nbpos/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/config/__init__.py -------------------------------------------------------------------------------- /nbpos/config/desktop.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | def get_data(): 4 | return [ 5 | { 6 | "module_name": "getpos", 7 | "color": "grey", 8 | "icon": "octicon octicon-file-directory", 9 | "type": "module", 10 | "label": _("GETPOS") 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /nbpos/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/nbpos" 6 | # docs_base_url = "https://[org_name].github.io/nbpos" 7 | # headline = "App that does everything" 8 | # sub_heading = "Yes, you got that right the first time, everything" 9 | 10 | def get_context(context): 11 | context.brand_html = "getpos" 12 | -------------------------------------------------------------------------------- /nbpos/controllers.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | def frappe_response(http_status_code, message): 4 | frappe.local.response["http_status_code"] = http_status_code 5 | return message 6 | 7 | 8 | 9 | def handle_exception(e): 10 | frappe.clear_messages() 11 | frappe.log_error(f"Error: {e}") 12 | return frappe_response(500, f"Error: {e}") -------------------------------------------------------------------------------- /nbpos/custom_api/v1/cost_center.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from nbpos.controllers import frappe_response,handle_exception 3 | import frappe 4 | @frappe.whitelist(allow_guest=True) 5 | def get_cost_center_by_pin(): 6 | body = frappe.local.form_dict 7 | pin = body.get("custom_pin") 8 | cost_center = body.get("cost_center") 9 | 10 | if not pin or not cost_center: 11 | missing_param = "custom_pin" if not pin else "cost_center" 12 | return frappe_response(400, f"{missing_param} is missing") 13 | 14 | custom_pin = frappe.db.get_value("Cost Center",cost_center,'custom_pin') 15 | if int(custom_pin) == int(pin): 16 | return frappe_response(200, {"is_verified": True}) 17 | 18 | else: 19 | return frappe_response(200, {"is_verified": False}) 20 | -------------------------------------------------------------------------------- /nbpos/custom_api/v1/location.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | @frappe.whitelist() 4 | def get_location(): 5 | body = frappe.local.form_dict 6 | if body.get("search_location"): 7 | filter_condition = f'%{body.get("search_location")}%' 8 | return frappe.db.sql(""" 9 | SELECT DISTINCT custom_location 10 | FROM `tabCost Center` WHERE disabled=0 and custom_location LIKE %s 11 | ORDER BY custom_location ASC; 12 | """, (filter_condition,) ,as_dict=1) 13 | 14 | 15 | elif (body.get("custom_location")): 16 | base_url = frappe.db.get_single_value('nbpos Setting', 'base_url') 17 | return frappe.db.sql(""" 18 | SELECT custom_location, custom_address, cost_center_name, name, 19 | CONCAT(%(base_url)s, custom_attach_image) AS custom_attach_image 20 | FROM `tabCost Center` 21 | WHERE disabled = 0 AND custom_location = %(custom_location)s 22 | ORDER BY creation DESC 23 | """, { 24 | 'base_url': base_url, 25 | 'custom_location': body.get("custom_location") 26 | }, as_dict=1) 27 | 28 | 29 | else: 30 | return frappe.db.sql(""" 31 | SELECT Distinct(custom_location) 32 | FROM `tabCost Center` WHERE custom_location is NOT NULL and disabled=0 33 | ORDER BY custom_location ASC; 34 | """,as_dict=1) 35 | 36 | 37 | 38 | @frappe.whitelist(allow_guest=True) 39 | def get_all_location_list(): 40 | return frappe.db.sql(""" 41 | SELECT DISTINCT custom_location 42 | FROM `tabCost Center` 43 | WHERE disabled=0 and custom_location IS NOT NULL 44 | ORDER BY custom_location ASC; 45 | """,as_dict=True) -------------------------------------------------------------------------------- /nbpos/custom_api/v1/status_updater.py: -------------------------------------------------------------------------------- 1 | ## -*- coding: utf-8 -*- 2 | # # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | import frappe 7 | from frappe.utils import comma_or, nowdate, getdate 8 | from frappe import _ 9 | from frappe.model.document import Document 10 | 11 | class OverAllowanceError(frappe.ValidationError): pass 12 | 13 | def validate_status(status, options): 14 | if status not in options: 15 | frappe.throw(_("Status must be one of {0}").format(comma_or(options))) 16 | 17 | status_map = { 18 | "POS Opening Shift": [ 19 | ["Draft", None], 20 | ["Open", "eval:self.docstatus == 1 and not self.pos_closing_shift"], 21 | ["Closed", "eval:self.docstatus == 1 and self.pos_closing_shift"], 22 | ["Cancelled", "eval:self.docstatus == 2"], 23 | ] 24 | } 25 | 26 | class StatusUpdater(Document): 27 | 28 | def set_status(self, update=False, status=None, update_modified=True): 29 | if self.is_new(): 30 | if self.get('amended_from'): 31 | self.status = 'Draft' 32 | return 33 | 34 | if self.doctype in status_map: 35 | _status = self.status 36 | if status and update: 37 | self.db_set("status", status) 38 | 39 | sl = status_map[self.doctype][:] 40 | sl.reverse() 41 | for s in sl: 42 | if not s[1]: 43 | self.status = s[0] 44 | break 45 | elif s[1].startswith("eval:"): 46 | if frappe.safe_eval(s[1][5:], None, { "self": self.as_dict(), "getdate": getdate, 47 | "nowdate": nowdate, "get_value": frappe.db.get_value }): 48 | self.status = s[0] 49 | break 50 | elif getattr(self, s[1])(): 51 | self.status = s[0] 52 | break 53 | 54 | if self.status != _status and self.status not in ("Cancelled", "Partially Ordered", 55 | "Ordered", "Issued", "Transferred"): 56 | self.add_comment("Label", _(self.status)) 57 | 58 | if update: 59 | self.db_set('status', self.status, update_modified = update_modified) 60 | -------------------------------------------------------------------------------- /nbpos/custom_api/v1/warehouse.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | def get_warehouse_for_cost_center(cost_center): 3 | warehouse = frappe.db.get_value('Warehouse', {'custom_cost_center': cost_center}, 'name') 4 | return warehouse 5 | -------------------------------------------------------------------------------- /nbpos/custom_api/v1/workspace.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.model.document import Document 3 | 4 | @frappe.whitelist(allow_guest=True) 5 | def workspace_hide(): 6 | frappe.set_user("Administrator") 7 | workspace_docs = frappe.get_all("Workspace", filters={"name": ["in", ["Buying", "Manufacturing","Assets","Quality","Projects","Support","Website","Tools","Home","ERPNext Settings","Integrations","ERPNext Integrations","Build"]]}) 8 | for doc in workspace_docs: 9 | workspace = frappe.get_doc("Workspace", doc.name) 10 | workspace.is_hidden = 1 11 | try: 12 | workspace.save() 13 | except Exception as e: 14 | print(f"Error saving workspace {workspace.name}: {str(e)}") 15 | 16 | frappe.db.commit() 17 | 18 | -------------------------------------------------------------------------------- /nbpos/fixtures/role.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "desk_access": 1, 4 | "disabled": 0, 5 | "docstatus": 0, 6 | "doctype": "Role", 7 | "home_page": null, 8 | "is_custom": 0, 9 | "modified": "2024-12-23 12:28:08.937883", 10 | "name": "GetPos User", 11 | "restrict_to_domain": null, 12 | "role_name": "GetPos User", 13 | "two_factor_auth": 0 14 | } 15 | ] -------------------------------------------------------------------------------- /nbpos/fixtures/web_page.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "breadcrumbs": null, 4 | "content_type": "Markdown", 5 | "context_script": null, 6 | "css": null, 7 | "docstatus": 0, 8 | "doctype": "Web Page", 9 | "dynamic_route": 0, 10 | "dynamic_template": 0, 11 | "enable_comments": 0, 12 | "end_date": null, 13 | "full_width": 1, 14 | "header": null, 15 | "insert_style": 0, 16 | "javascript": "", 17 | "main_section": null, 18 | "main_section_html": null, 19 | "main_section_md": "Do Not Refresh.\nYour transaction is in process.", 20 | "meta_description": null, 21 | "meta_image": null, 22 | "meta_title": null, 23 | "modified": "2024-04-30 15:46:53.409178", 24 | "module": "nbpos", 25 | "name": "payment-process", 26 | "page_blocks": [], 27 | "published": 1, 28 | "route": "payment-process", 29 | "show_sidebar": 0, 30 | "show_title": 0, 31 | "slideshow": null, 32 | "start_date": null, 33 | "text_align": "Center", 34 | "title": "Payment Process", 35 | "website_sidebar": null 36 | } 37 | ] -------------------------------------------------------------------------------- /nbpos/modules.txt: -------------------------------------------------------------------------------- 1 | nbpos 2 | -------------------------------------------------------------------------------- /nbpos/nbpos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/after_migrate.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def main(): 5 | customize_website_settings() 6 | 7 | 8 | def customize_website_settings(): 9 | settings = frappe.get_doc("Website Settings") 10 | settings.footer_powered = "Powered by NestorBird" 11 | settings.copyright = " " 12 | settings.disable_signup = 1 13 | settings.hide_footer_signup = 1 14 | settings.save() -------------------------------------------------------------------------------- /nbpos/nbpos/custom/account.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [ 3 | { 4 | "_assign": null, 5 | "_comments": null, 6 | "_liked_by": null, 7 | "_user_tags": null, 8 | "allow_in_quick_entry": 0, 9 | "allow_on_submit": 0, 10 | "bold": 0, 11 | "collapsible": 0, 12 | "collapsible_depends_on": null, 13 | "columns": 0, 14 | "creation": "2021-10-27 20:02:59.585907", 15 | "default": null, 16 | "depends_on": "eval:doc.parent_account == 'Cash In Hand - NP'", 17 | "description": null, 18 | "docstatus": 0, 19 | "dt": "Account", 20 | "fetch_from": null, 21 | "fetch_if_empty": 0, 22 | "fieldname": "hub_manager", 23 | "fieldtype": "Link", 24 | "hidden": 0, 25 | "hide_border": 0, 26 | "hide_days": 0, 27 | "hide_seconds": 0, 28 | "idx": 15, 29 | "ignore_user_permissions": 0, 30 | "ignore_xss_filter": 0, 31 | "in_global_search": 0, 32 | "in_list_view": 0, 33 | "in_preview": 0, 34 | "in_standard_filter": 0, 35 | "insert_after": "account_type", 36 | "label": "Hub Manager", 37 | "length": 0, 38 | "mandatory_depends_on": null, 39 | "modified": "2021-10-27 20:02:59.585907", 40 | "modified_by": "Administrator", 41 | "name": "Account-hub_manager", 42 | "no_copy": 0, 43 | "non_negative": 0, 44 | "options": "Hub Manager", 45 | "owner": "Administrator", 46 | "parent": null, 47 | "parentfield": null, 48 | "parenttype": null, 49 | "permlevel": 0, 50 | "precision": "", 51 | "print_hide": 0, 52 | "print_hide_if_no_value": 0, 53 | "print_width": null, 54 | "read_only": 0, 55 | "read_only_depends_on": null, 56 | "report_hide": 0, 57 | "reqd": 0, 58 | "search_index": 0, 59 | "translatable": 0, 60 | "unique": 0, 61 | "width": null 62 | } 63 | ], 64 | "custom_perms": [], 65 | "doctype": "Account", 66 | "property_setters": [], 67 | "sync_on_migrate": 1 68 | } -------------------------------------------------------------------------------- /nbpos/nbpos/custom/email_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [ 3 | { 4 | "_assign": null, 5 | "_comments": null, 6 | "_liked_by": null, 7 | "_user_tags": null, 8 | "allow_in_quick_entry": 0, 9 | "allow_on_submit": 0, 10 | "bold": 0, 11 | "collapsible": 0, 12 | "collapsible_depends_on": null, 13 | "columns": 0, 14 | "creation": "2024-05-24 13:21:06.157277", 15 | "default": null, 16 | "depends_on": null, 17 | "description": null, 18 | "docstatus": 0, 19 | "dt": "Email Template", 20 | "fetch_from": null, 21 | "fetch_if_empty": 0, 22 | "fieldname": "custom_default_coupon_code_notification", 23 | "fieldtype": "Check", 24 | "hidden": 0, 25 | "hide_border": 0, 26 | "hide_days": 0, 27 | "hide_seconds": 0, 28 | "idx": 2, 29 | "ignore_user_permissions": 0, 30 | "ignore_xss_filter": 0, 31 | "in_global_search": 0, 32 | "in_list_view": 0, 33 | "in_preview": 0, 34 | "in_standard_filter": 0, 35 | "insert_after": "use_html", 36 | "is_system_generated": 0, 37 | "is_virtual": 0, 38 | "label": "Default Coupon Code Notification", 39 | "length": 0, 40 | "mandatory_depends_on": null, 41 | "modified": "2024-05-24 13:21:06.157277", 42 | "modified_by": "Administrator", 43 | "module": null, 44 | "name": "Email Template-custom_default_coupon_code_notification", 45 | "no_copy": 0, 46 | "non_negative": 0, 47 | "options": null, 48 | "owner": "Administrator", 49 | "permlevel": 0, 50 | "precision": "", 51 | "print_hide": 0, 52 | "print_hide_if_no_value": 0, 53 | "print_width": null, 54 | "read_only": 0, 55 | "read_only_depends_on": null, 56 | "report_hide": 0, 57 | "reqd": 0, 58 | "search_index": 0, 59 | "sort_options": 0, 60 | "translatable": 0, 61 | "unique": 0, 62 | "width": null 63 | } 64 | ], 65 | "custom_perms": [], 66 | "doctype": "Email Template", 67 | "links": [], 68 | "property_setters": [ 69 | { 70 | "_assign": null, 71 | "_comments": null, 72 | "_liked_by": null, 73 | "_user_tags": null, 74 | "creation": "2024-05-24 13:21:06.020137", 75 | "default_value": null, 76 | "doc_type": "Email Template", 77 | "docstatus": 0, 78 | "doctype_or_field": "DocType", 79 | "field_name": null, 80 | "idx": 0, 81 | "is_system_generated": 0, 82 | "modified": "2024-05-24 13:21:06.020137", 83 | "modified_by": "Administrator", 84 | "module": null, 85 | "name": "Email Template-main-field_order", 86 | "owner": "Administrator", 87 | "property": "field_order", 88 | "property_type": "Data", 89 | "row_name": null, 90 | "value": "[\"subject\", \"use_html\", null, \"response_html\", \"response\", \"section_break_4\", \"email_reply_help\"]" 91 | } 92 | ], 93 | "sync_on_migrate": 1 94 | } -------------------------------------------------------------------------------- /nbpos/nbpos/custom/item_barcode.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [], 3 | "custom_perms": [], 4 | "doctype": "Item Barcode", 5 | "links": [], 6 | "property_setters": [ 7 | { 8 | "_assign": null, 9 | "_comments": null, 10 | "_liked_by": null, 11 | "_user_tags": null, 12 | "creation": "2022-02-28 20:16:36.465626", 13 | "default_value": null, 14 | "doc_type": "Item Barcode", 15 | "docstatus": 0, 16 | "doctype_or_field": "DocField", 17 | "field_name": "barcode", 18 | "idx": 0, 19 | "is_system_generated": 0, 20 | "modified": "2024-07-16 14:37:00.249759", 21 | "modified_by": "Administrator", 22 | "module": null, 23 | "name": "Item Barcode-barcode-hidden", 24 | "owner": "Administrator", 25 | "property": "hidden", 26 | "property_type": "Check", 27 | "row_name": null, 28 | "value": "0" 29 | } 30 | ], 31 | "sync_on_migrate": 1 32 | } -------------------------------------------------------------------------------- /nbpos/nbpos/custom/item_tax.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [], 3 | "custom_perms": [], 4 | "doctype": "Item Tax", 5 | "links": [], 6 | "property_setters": [ 7 | { 8 | "_assign": null, 9 | "_comments": null, 10 | "_liked_by": null, 11 | "_user_tags": null, 12 | "creation": "2024-07-17 11:28:54.650990", 13 | "default_value": null, 14 | "doc_type": "Item Tax", 15 | "docstatus": 0, 16 | "doctype_or_field": "DocField", 17 | "field_name": "valid_from", 18 | "idx": 0, 19 | "is_system_generated": 0, 20 | "modified": "2024-07-17 11:28:54.650990", 21 | "modified_by": "Administrator", 22 | "module": null, 23 | "name": "Item Tax-valid_from-reqd", 24 | "owner": "Administrator", 25 | "property": "reqd", 26 | "property_type": "Check", 27 | "row_name": null, 28 | "value": "1" 29 | } 30 | ], 31 | "sync_on_migrate": 1 32 | } -------------------------------------------------------------------------------- /nbpos/nbpos/custom/packed_item.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [], 3 | "custom_perms": [], 4 | "doctype": "Packed Item", 5 | "links": [], 6 | "property_setters": [ 7 | { 8 | "_assign": null, 9 | "_comments": null, 10 | "_liked_by": null, 11 | "_user_tags": null, 12 | "creation": "2021-10-14 13:46:34.752720", 13 | "default_value": null, 14 | "doc_type": "Packed Item", 15 | "docstatus": 0, 16 | "doctype_or_field": "DocField", 17 | "field_name": "rate", 18 | "idx": 0, 19 | "is_system_generated": 0, 20 | "modified": "2024-05-14 11:39:13.574974", 21 | "modified_by": "Administrator", 22 | "module": null, 23 | "name": "Packed Item-rate-read_only", 24 | "owner": "Administrator", 25 | "property": "read_only", 26 | "property_type": "Check", 27 | "row_name": null, 28 | "value": "1" 29 | } 30 | ], 31 | "sync_on_migrate": 1 32 | } -------------------------------------------------------------------------------- /nbpos/nbpos/custom/party_account.json: -------------------------------------------------------------------------------- 1 | { 2 | "custom_fields": [ 3 | { 4 | "_assign": null, 5 | "_comments": null, 6 | "_liked_by": null, 7 | "_user_tags": null, 8 | "allow_in_quick_entry": 0, 9 | "allow_on_submit": 0, 10 | "bold": 0, 11 | "collapsible": 0, 12 | "collapsible_depends_on": null, 13 | "columns": 0, 14 | "creation": "2021-10-13 12:51:35.401320", 15 | "default": null, 16 | "depends_on": null, 17 | "description": null, 18 | "docstatus": 0, 19 | "dt": "Party Account", 20 | "fetch_from": null, 21 | "fetch_if_empty": 0, 22 | "fieldname": "debtor_creditor_number", 23 | "fieldtype": "Data", 24 | "hidden": 0, 25 | "hide_border": 0, 26 | "hide_days": 0, 27 | "hide_seconds": 0, 28 | "idx": 0, 29 | "ignore_user_permissions": 0, 30 | "ignore_xss_filter": 0, 31 | "in_global_search": 0, 32 | "in_list_view": 0, 33 | "in_preview": 0, 34 | "in_standard_filter": 0, 35 | "insert_after": "account", 36 | "is_system_generated": 1, 37 | "is_virtual": 0, 38 | "label": "Debtor/Creditor Number", 39 | "length": 0, 40 | "mandatory_depends_on": null, 41 | "modified": "2021-10-13 12:51:35.401320", 42 | "modified_by": "Administrator", 43 | "module": null, 44 | "name": "Party Account-debtor_creditor_number", 45 | "no_copy": 0, 46 | "non_negative": 0, 47 | "options": null, 48 | "owner": "Administrator", 49 | "permlevel": 0, 50 | "precision": "", 51 | "print_hide": 0, 52 | "print_hide_if_no_value": 0, 53 | "print_width": null, 54 | "read_only": 0, 55 | "read_only_depends_on": null, 56 | "report_hide": 0, 57 | "reqd": 0, 58 | "search_index": 0, 59 | "sort_options": 0, 60 | "translatable": 0, 61 | "unique": 0, 62 | "width": null 63 | } 64 | ], 65 | "custom_perms": [], 66 | "doctype": "Party Account", 67 | "links": [], 68 | "property_setters": [], 69 | "sync_on_migrate": 1 70 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/allergens/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/allergens/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/allergens/allergens.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Allergens', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/allergens/allergens.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "autoname": "field:allergens", 5 | "creation": "2024-05-07 13:38:04.586382", 6 | "default_view": "List", 7 | "doctype": "DocType", 8 | "editable_grid": 1, 9 | "engine": "InnoDB", 10 | "field_order": [ 11 | "allergens", 12 | "icon" 13 | ], 14 | "fields": [ 15 | { 16 | "fieldname": "icon", 17 | "fieldtype": "Attach Image", 18 | "label": "Icon", 19 | "reqd": 1 20 | }, 21 | { 22 | "fieldname": "allergens", 23 | "fieldtype": "Data", 24 | "in_list_view": 1, 25 | "label": "Allergens", 26 | "reqd": 1, 27 | "unique": 1 28 | } 29 | ], 30 | "index_web_pages_for_search": 1, 31 | "links": [], 32 | "modified": "2024-05-07 14:34:00.848014", 33 | "modified_by": "Administrator", 34 | "module": "nbpos", 35 | "name": "Allergens", 36 | "naming_rule": "By fieldname", 37 | "owner": "Administrator", 38 | "permissions": [ 39 | { 40 | "create": 1, 41 | "delete": 1, 42 | "email": 1, 43 | "export": 1, 44 | "print": 1, 45 | "read": 1, 46 | "report": 1, 47 | "role": "System Manager", 48 | "share": 1, 49 | "write": 1 50 | } 51 | ], 52 | "sort_field": "modified", 53 | "sort_order": "DESC", 54 | "states": [] 55 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/allergens/allergens.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class Allergens(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/allergens/test_allergens.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestAllergens(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attribute_items/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/attribute_items/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attribute_items/attribute_items.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-06-21 09:40:30.883474", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "item", 10 | "item_name", 11 | "price" 12 | ], 13 | "fields": [ 14 | { 15 | "fieldname": "item", 16 | "fieldtype": "Link", 17 | "in_list_view": 1, 18 | "label": "Item", 19 | "options": "Item" 20 | }, 21 | { 22 | "fieldname": "price", 23 | "fieldtype": "Currency", 24 | "in_list_view": 1, 25 | "label": "Price" 26 | }, 27 | { 28 | "fetch_from": "item.item_name", 29 | "fieldname": "item_name", 30 | "fieldtype": "Data", 31 | "in_list_view": 1, 32 | "label": "Item Name" 33 | } 34 | ], 35 | "index_web_pages_for_search": 1, 36 | "istable": 1, 37 | "links": [], 38 | "modified": "2024-07-29 14:37:39.322633", 39 | "modified_by": "Administrator", 40 | "module": "nbpos", 41 | "name": "Attribute Items", 42 | "owner": "Administrator", 43 | "permissions": [], 44 | "sort_field": "modified", 45 | "sort_order": "DESC", 46 | "states": [] 47 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attribute_items/attribute_items.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class AttributeItems(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attributes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/attributes/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attributes/attributes.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | 5 | frappe.ui.form.on('Attributes', { 6 | refresh(frm) { 7 | frm.set_query('parent_item', function(doc, cdt, cdn) { 8 | return { 9 | "filters": { 10 | "custom_item": "Standard Item" 11 | } 12 | }; 13 | }); 14 | 15 | frm.set_query('item', 'attribute_items', function(doc, cdt, cdn) { 16 | var d = locals[cdt][cdn]; 17 | return { 18 | "filters": { 19 | "custom_item": "Attribute/Modifier" 20 | } 21 | }; 22 | }); 23 | } 24 | }) 25 | 26 | 27 | 28 | frappe.ui.form.on('Attribute Items', { 29 | item: function(frm, cdt, cdn) { 30 | var child = locals[cdt][cdn]; 31 | if (child.item) { 32 | frappe.call({ 33 | method: 'getpos.getpos.hooks.item_price.get_item_price', 34 | args: { 35 | item_code: child.item 36 | }, 37 | callback: function(r) { 38 | if (r.message) { 39 | frappe.model.set_value(cdt, cdn, 'price', r.message.price_list_rate); 40 | } else { 41 | frappe.model.set_value(cdt, cdn, 'price', 0); 42 | } 43 | } 44 | }); 45 | } 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attributes/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "autoname": "format:{attribute_heading}-{parent_item}", 4 | "creation": "2024-06-21 09:31:33.608461", 5 | "default_view": "List", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "attribute_heading", 11 | "parent_item", 12 | "column_break_zhyr0", 13 | "mandatory", 14 | "count", 15 | "section_break_naza7", 16 | "attribute_items", 17 | "cost_center" 18 | ], 19 | "fields": [ 20 | { 21 | "fieldname": "parent_item", 22 | "fieldtype": "Link", 23 | "label": "Parent Item", 24 | "options": "Item", 25 | "reqd": 1 26 | }, 27 | { 28 | "fieldname": "attribute_items", 29 | "fieldtype": "Table", 30 | "label": "Attribute Items", 31 | "options": "Attribute Items", 32 | "reqd": 1 33 | }, 34 | { 35 | "fieldname": "attribute_heading", 36 | "fieldtype": "Data", 37 | "in_list_view": 1, 38 | "label": "Attribute Heading", 39 | "reqd": 1 40 | }, 41 | { 42 | "fieldname": "count", 43 | "fieldtype": "Data", 44 | "label": "SELECT COUNT" 45 | }, 46 | { 47 | "default": "0", 48 | "fieldname": "mandatory", 49 | "fieldtype": "Check", 50 | "label": "Mandatory" 51 | }, 52 | { 53 | "fieldname": "column_break_zhyr0", 54 | "fieldtype": "Column Break" 55 | }, 56 | { 57 | "fieldname": "section_break_naza7", 58 | "fieldtype": "Section Break" 59 | }, 60 | { 61 | "fieldname": "cost_center", 62 | "fieldtype": "Link", 63 | "label": "Cost Center", 64 | "options": "Cost Center" 65 | } 66 | ], 67 | "index_web_pages_for_search": 1, 68 | "links": [], 69 | "modified": "2024-08-03 14:01:38.884132", 70 | "modified_by": "Administrator", 71 | "module": "nbpos", 72 | "name": "Attributes", 73 | "naming_rule": "Expression", 74 | "owner": "Administrator", 75 | "permissions": [ 76 | { 77 | "create": 1, 78 | "delete": 1, 79 | "email": 1, 80 | "export": 1, 81 | "print": 1, 82 | "read": 1, 83 | "report": 1, 84 | "role": "System Manager", 85 | "share": 1, 86 | "write": 1 87 | } 88 | ], 89 | "sort_field": "modified", 90 | "sort_order": "DESC", 91 | "states": [] 92 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attributes/attributes.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | import frappe 5 | from frappe.model.document import Document 6 | 7 | class Attributes(Document): 8 | def after_insert(doc, method=None): 9 | selected_count = sum(1 for item in doc.attribute_items) 10 | doc.count = selected_count 11 | 12 | def validate(doc, method=None): 13 | if doc.count is None: 14 | doc.count = 0 15 | selected_count = sum(1 for item in doc.attribute_items) 16 | if int(doc.count)>int(selected_count): 17 | frappe.throw("Count can't be greater than Attribute Items") 18 | if doc.mandatory==1 and int(doc.count)<1: 19 | doc.count=1 -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/attributes/test_attributes.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestAttributes(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/combo/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo/combo.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Combo', { 5 | refresh(frm) { 6 | frm.set_query('parent_combo_item', function(doc, cdt, cdn) { 7 | return { 8 | "filters": { 9 | "custom_item": "Combo Item" 10 | } 11 | }; 12 | }); 13 | 14 | frm.set_query('item', 'combo_item', function(doc, cdt, cdn) { 15 | var d = locals[cdt][cdn]; 16 | return { 17 | "filters": { 18 | "custom_item": "Standard Item" 19 | } 20 | }; 21 | }); 22 | } 23 | }) 24 | 25 | 26 | frappe.ui.form.on('Combo Item', { 27 | item: function(frm, cdt, cdn) { 28 | var child = locals[cdt][cdn]; 29 | if (child.item) { 30 | frappe.call({ 31 | method: 'getpos.getpos.hooks.item_price.get_item_price', 32 | args: { 33 | item_code: child.item 34 | }, 35 | callback: function(r) { 36 | if (r.message) { 37 | frappe.model.set_value(cdt, cdn, 'item_price', r.message.price_list_rate); 38 | } else { 39 | frappe.model.set_value(cdt, cdn, 'item_price', 0); 40 | } 41 | } 42 | }); 43 | } 44 | } 45 | }); 46 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo/combo.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "autoname": "format:{combo_heading}-{parent_combo_item}", 4 | "creation": "2024-07-04 19:42:46.789434", 5 | "default_view": "List", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "combo_heading", 11 | "parent_combo_item", 12 | "column_break_jqsor", 13 | "mandatory", 14 | "count", 15 | "section_break_lolck", 16 | "combo_item", 17 | "cost_center" 18 | ], 19 | "fields": [ 20 | { 21 | "fieldname": "combo_heading", 22 | "fieldtype": "Data", 23 | "in_list_view": 1, 24 | "label": "Combo Heading", 25 | "reqd": 1 26 | }, 27 | { 28 | "fieldname": "parent_combo_item", 29 | "fieldtype": "Link", 30 | "in_list_view": 1, 31 | "label": "Parent Combo Item", 32 | "options": "Item", 33 | "reqd": 1 34 | }, 35 | { 36 | "fieldname": "count", 37 | "fieldtype": "Int", 38 | "label": "SELECT COUNT" 39 | }, 40 | { 41 | "fieldname": "combo_item", 42 | "fieldtype": "Table", 43 | "label": "Combo Item", 44 | "options": "Combo Item" 45 | }, 46 | { 47 | "fieldname": "column_break_jqsor", 48 | "fieldtype": "Column Break" 49 | }, 50 | { 51 | "default": "0", 52 | "fieldname": "mandatory", 53 | "fieldtype": "Check", 54 | "label": "Mandatory" 55 | }, 56 | { 57 | "fieldname": "section_break_lolck", 58 | "fieldtype": "Section Break" 59 | }, 60 | { 61 | "fieldname": "cost_center", 62 | "fieldtype": "Link", 63 | "label": "Cost Center", 64 | "options": "Cost Center" 65 | } 66 | ], 67 | "index_web_pages_for_search": 1, 68 | "links": [], 69 | "modified": "2024-08-03 14:03:47.983933", 70 | "modified_by": "Administrator", 71 | "module": "nbpos", 72 | "name": "Combo", 73 | "naming_rule": "Expression", 74 | "owner": "Administrator", 75 | "permissions": [ 76 | { 77 | "create": 1, 78 | "delete": 1, 79 | "email": 1, 80 | "export": 1, 81 | "print": 1, 82 | "read": 1, 83 | "report": 1, 84 | "role": "System Manager", 85 | "share": 1, 86 | "write": 1 87 | } 88 | ], 89 | "sort_field": "modified", 90 | "sort_order": "DESC", 91 | "states": [] 92 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo/combo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | import frappe 5 | from frappe.model.document import Document 6 | 7 | class Combo(Document): 8 | def after_insert(doc, method=None): 9 | selected_count = sum(1 for item in doc.combo_item) 10 | doc.count = selected_count 11 | def validate(doc, method=None): 12 | if doc.count is None: 13 | doc.count = 0 14 | selected_count = sum(1 for item in doc.combo_item) 15 | if int(doc.count)>int(selected_count): 16 | frappe.throw("Count can't be greater than Combo Items") 17 | if doc.mandatory==1 and int(doc.count)<1: 18 | doc.count=1 19 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo/test_combo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestCombo(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo_item/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/combo_item/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo_item/combo_item.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-07-04 19:44:47.083333", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "item", 10 | "item_name", 11 | "item_price" 12 | ], 13 | "fields": [ 14 | { 15 | "fieldname": "item", 16 | "fieldtype": "Link", 17 | "in_list_view": 1, 18 | "label": "Item", 19 | "options": "Item" 20 | }, 21 | { 22 | "fieldname": "item_price", 23 | "fieldtype": "Currency", 24 | "in_list_view": 1, 25 | "label": "Item Price" 26 | }, 27 | { 28 | "fetch_from": "item.item_name", 29 | "fieldname": "item_name", 30 | "fieldtype": "Data", 31 | "in_list_view": 1, 32 | "label": "Item Name" 33 | } 34 | ], 35 | "index_web_pages_for_search": 1, 36 | "istable": 1, 37 | "links": [], 38 | "modified": "2024-07-29 14:38:40.523230", 39 | "modified_by": "Administrator", 40 | "module": "nbpos", 41 | "name": "Combo Item", 42 | "owner": "Administrator", 43 | "permissions": [], 44 | "sort_field": "modified", 45 | "sort_order": "DESC", 46 | "states": [] 47 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/combo_item/combo_item.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class ComboItem(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/gift_card/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/gift_card/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/gift_card/gift_card.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | // frappe.ui.form.on("Gift Card", { 5 | // refresh(frm) { 6 | 7 | // }, 8 | // }); 9 | frappe.ui.form.on("Gift Card", { 10 | gift_card_name: function (frm) { 11 | if (frm.doc.__islocal === 1) { 12 | frm.trigger("make_code"); 13 | } 14 | }, 15 | make_code: function (frm) { 16 | frm.doc.code = Math.random().toString(12).substring(2, 12).toUpperCase(); 17 | frm.refresh_field("code"); 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/gift_card/test_gift_card.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestGiftCard(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/hub_manager/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager/hub_manager.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Hub Manager', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager/hub_manager.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "autoname": "field:hub_manager", 5 | "creation": "2021-10-13 13:26:27.297648", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": ["hub_manager", "wards", "column_break_3", "series"], 10 | "fields": [ 11 | { 12 | "fieldname": "hub_manager", 13 | "fieldtype": "Link", 14 | "in_list_view": 1, 15 | "label": "Hub Manager", 16 | "options": "User", 17 | "reqd": 1, 18 | "unique": 1 19 | }, 20 | { 21 | "fieldname": "wards", 22 | "fieldtype": "Table", 23 | "label": "wards", 24 | "options": "Ward Detail" 25 | }, 26 | { 27 | "fieldname": "column_break_3", 28 | "fieldtype": "Column Break" 29 | }, 30 | { 31 | "fieldname": "series", 32 | "fieldtype": "Data", 33 | "label": "series" 34 | } 35 | ], 36 | "index_web_pages_for_search": 1, 37 | "links": [ 38 | { 39 | "group": "Warehouse", 40 | "link_doctype": "Warehouse", 41 | "link_fieldname": "hub_manager" 42 | } 43 | ], 44 | "modified": "2022-01-27 15:13:19.642083", 45 | "modified_by": "Administrator", 46 | "module": "nbpos", 47 | "name": "Hub Manager", 48 | "owner": "Administrator", 49 | "permissions": [ 50 | { 51 | "create": 1, 52 | "delete": 1, 53 | "email": 1, 54 | "export": 1, 55 | "print": 1, 56 | "read": 1, 57 | "report": 1, 58 | "role": "System Manager", 59 | "share": 1, 60 | "write": 1 61 | } 62 | ], 63 | "sort_field": "modified", 64 | "sort_order": "DESC", 65 | "track_changes": 1 66 | } 67 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager/hub_manager.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | import frappe 5 | from frappe.model.document import Document 6 | from frappe.utils import cstr 7 | 8 | 9 | class HubManager(Document): 10 | def validate(self): 11 | self.set_naming_series() 12 | 13 | def on_update(self): 14 | self.add_hub_manager_to_customer() 15 | self.remove_hub_manager_from_customer() 16 | 17 | 18 | def set_naming_series(self): 19 | if not self.series: 20 | first_name, last_name = frappe.db.get_value('User', self.hub_manager, ['first_name', 'last_name']) 21 | if not last_name: 22 | abbr = first_name[0].upper() 23 | else: 24 | abbr = first_name[0].upper() + last_name[0].upper() 25 | hub_manager_list = frappe.db.get_list('Hub Manager', 26 | filters={ 27 | 'series': ['like', abbr + '%'] 28 | }, 29 | fields=['name']) 30 | if hub_manager_list: 31 | self.series = abbr + '-' + cstr(len(hub_manager_list)) + "-.YYYY." + "-.MM." + "-." + "#" 32 | else: 33 | self.series = abbr + "-.YYYY." + "-.MM." + "-." + "#" 34 | 35 | 36 | def add_hub_manager_to_customer(self): 37 | for item in self.wards: 38 | if item.is_assigned == 1: 39 | customer_list = frappe.get_list('Customer', { 40 | 'ward': item.ward, 41 | 'hub_manager': ["!=", self.hub_manager], 42 | 'disabled': 0, 43 | }, 44 | ['name']) 45 | if customer_list: 46 | for customer in customer_list: 47 | doc = frappe.get_doc('Customer', customer.name) 48 | doc.hub_manager = self.hub_manager 49 | doc.save() 50 | 51 | def remove_hub_manager_from_customer(self): 52 | ward_list = [] 53 | for item in self.wards: 54 | if item.is_assigned == 1: 55 | ward_list.append(item.ward) 56 | customer_list = frappe.get_list('Customer', { 57 | 'ward': ["not in", ward_list], 58 | 'hub_manager': self.hub_manager, 59 | 'disabled': 0 60 | }, 61 | ["name"]) 62 | if customer_list: 63 | for customer in customer_list: 64 | doc = frappe.get_doc('Customer', customer.name) 65 | doc.hub_manager = '' 66 | doc.save() 67 | 68 | @frappe.whitelist(allow_guest=True) 69 | def get_hub_manager(ward): 70 | hub_manager = frappe.db.get_value('Ward Detail', 71 | { 72 | 'ward': ward, 73 | 'is_assigned': 1, 74 | 'parenttype': 'Hub Manager'}, 75 | ['parent']) 76 | return hub_manager 77 | 78 | @frappe.whitelist(allow_guest=True) 79 | def get_hub_manager_list(): 80 | hub_managers = [] 81 | hub_manager_list=frappe.db.sql(""" 82 | SELECT 83 | name 84 | FROM `tabHub Manager`""",as_dict = 1) 85 | for item in hub_manager_list: 86 | hub_managers.append(item.name) 87 | return hub_managers -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager/test_hub_manager.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestHubManager(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager_detail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/hub_manager_detail/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager_detail/hub_manager_detail.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2021-10-13 13:39:20.463468", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": ["hub_manager"], 9 | "fields": [ 10 | { 11 | "fieldname": "hub_manager", 12 | "fieldtype": "Link", 13 | "in_list_view": 1, 14 | "label": "Hub Manager", 15 | "options": "Hub Manager", 16 | "reqd": 1 17 | } 18 | ], 19 | "index_web_pages_for_search": 1, 20 | "istable": 1, 21 | "links": [], 22 | "modified": "2022-01-27 15:15:37.047481", 23 | "modified_by": "Administrator", 24 | "module": "nbpos", 25 | "name": "Hub Manager Detail", 26 | "owner": "Administrator", 27 | "permissions": [], 28 | "sort_field": "modified", 29 | "sort_order": "DESC", 30 | "track_changes": 1 31 | } 32 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/hub_manager_detail/hub_manager_detail.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class HubManagerDetail(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_allergens/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/item_allergens/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_allergens/item_allergens.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-05-07 14:20:31.274069", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "allergens" 10 | ], 11 | "fields": [ 12 | { 13 | "fieldname": "allergens", 14 | "fieldtype": "Link", 15 | "in_list_view": 1, 16 | "label": "Allergens", 17 | "options": "Allergens", 18 | "reqd": 1 19 | } 20 | ], 21 | "index_web_pages_for_search": 1, 22 | "istable": 1, 23 | "links": [], 24 | "modified": "2024-05-07 15:17:45.388933", 25 | "modified_by": "Administrator", 26 | "module": "nbpos", 27 | "name": "Item Allergens", 28 | "owner": "Administrator", 29 | "permissions": [], 30 | "sort_field": "modified", 31 | "sort_order": "DESC", 32 | "states": [] 33 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_allergens/item_allergens.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class ItemAllergens(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_group_multiselect/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/item_group_multiselect/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_group_multiselect/item_group_multiselect.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Item Group Multiselect', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_group_multiselect/item_group_multiselect.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2022-03-01 13:39:08.184425", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": ["item_group"], 9 | "fields": [ 10 | { 11 | "fieldname": "item_group", 12 | "fieldtype": "Link", 13 | "in_list_view": 1, 14 | "label": "Item Group", 15 | "options": "Item Group", 16 | "reqd": 1 17 | } 18 | ], 19 | "index_web_pages_for_search": 1, 20 | "istable": 1, 21 | "links": [], 22 | "modified": "2022-03-01 13:39:20.970017", 23 | "modified_by": "Administrator", 24 | "module": "nbpos", 25 | "name": "Item Group Multiselect", 26 | "owner": "Administrator", 27 | "permissions": [], 28 | "sort_field": "modified", 29 | "sort_order": "DESC" 30 | } 31 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_group_multiselect/item_group_multiselect.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class ItemGroupMultiselect(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_group_multiselect/test_item_group_multiselect.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestItemGroupMultiselect(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_type/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/item_type/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_type/item_type.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Item Type', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_type/item_type.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "autoname": "field:item_type", 5 | "creation": "2024-05-07 13:39:44.275950", 6 | "default_view": "List", 7 | "doctype": "DocType", 8 | "editable_grid": 1, 9 | "engine": "InnoDB", 10 | "field_order": [ 11 | "item_type" 12 | ], 13 | "fields": [ 14 | { 15 | "fieldname": "item_type", 16 | "fieldtype": "Data", 17 | "in_list_view": 1, 18 | "label": "Item Type", 19 | "reqd": 1, 20 | "unique": 1 21 | } 22 | ], 23 | "index_web_pages_for_search": 1, 24 | "links": [], 25 | "modified": "2024-05-07 14:32:42.386755", 26 | "modified_by": "Administrator", 27 | "module": "nbpos", 28 | "name": "Item Type", 29 | "naming_rule": "By fieldname", 30 | "owner": "Administrator", 31 | "permissions": [ 32 | { 33 | "create": 1, 34 | "delete": 1, 35 | "email": 1, 36 | "export": 1, 37 | "print": 1, 38 | "read": 1, 39 | "report": 1, 40 | "role": "System Manager", 41 | "share": 1, 42 | "write": 1 43 | } 44 | ], 45 | "sort_field": "modified", 46 | "sort_order": "DESC", 47 | "states": [] 48 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_type/item_type.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class ItemType(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/item_type/test_item_type.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestItemType(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/kitchen_kds/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/kitchen_kds/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/kitchen_kds/kitchen_kds.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Kitchen-Kds', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/kitchen_kds/kitchen_kds.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-04-25 18:47:04.851991", 5 | "default_view": "List", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "order_id", 11 | "type", 12 | "custom_order_request", 13 | "column_break_izzg9", 14 | "estimated_time", 15 | "status", 16 | "creation1", 17 | "source", 18 | "cost_center" 19 | ], 20 | "fields": [ 21 | { 22 | "fieldname": "order_id", 23 | "fieldtype": "Data", 24 | "label": "Order Id" 25 | }, 26 | { 27 | "fieldname": "type", 28 | "fieldtype": "Select", 29 | "label": "Type", 30 | "options": "\nTakeaway\nDine In" 31 | }, 32 | { 33 | "fieldname": "estimated_time", 34 | "fieldtype": "Int", 35 | "label": "Estimated Time" 36 | }, 37 | { 38 | "fieldname": "status", 39 | "fieldtype": "Select", 40 | "label": "Status", 41 | "options": "\nOpen\nCompleted" 42 | }, 43 | { 44 | "fieldname": "column_break_izzg9", 45 | "fieldtype": "Column Break" 46 | }, 47 | { 48 | "fieldname": "creation1", 49 | "fieldtype": "Datetime", 50 | "label": "Creation" 51 | }, 52 | { 53 | "fieldname": "custom_order_request", 54 | "fieldtype": "Small Text", 55 | "label": "Order Request" 56 | }, 57 | { 58 | "fieldname": "source", 59 | "fieldtype": "Data", 60 | "label": "Source" 61 | }, 62 | { 63 | "fieldname": "cost_center", 64 | "fieldtype": "Link", 65 | "label": "Cost Center", 66 | "options": "Cost Center" 67 | } 68 | ], 69 | "index_web_pages_for_search": 1, 70 | "links": [], 71 | "modified": "2024-08-03 13:13:33.561592", 72 | "modified_by": "Administrator", 73 | "module": "nbpos", 74 | "name": "Kitchen-Kds", 75 | "owner": "Administrator", 76 | "permissions": [ 77 | { 78 | "create": 1, 79 | "delete": 1, 80 | "email": 1, 81 | "export": 1, 82 | "print": 1, 83 | "read": 1, 84 | "report": 1, 85 | "role": "System Manager", 86 | "share": 1, 87 | "write": 1 88 | } 89 | ], 90 | "sort_field": "modified", 91 | "sort_order": "DESC", 92 | "states": [] 93 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/kitchen_kds/kitchen_kds.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class KitchenKds(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/kitchen_kds/test_kitchen_kds.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestKitchenKds(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/nbpos_setting/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/nbpos_setting/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/nbpos_setting/nbpos_setting.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('nbpos Setting', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/nbpos_setting/nbpos_setting.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2021-11-02 13:16:37.109225", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "base_url", 10 | "sales_history_count", 11 | "booking_list_count", 12 | "is_demo_setup" 13 | ], 14 | "fields": [ 15 | { 16 | "fieldname": "base_url", 17 | "fieldtype": "Data", 18 | "label": "Base URL" 19 | }, 20 | { 21 | "default": "6", 22 | "description": "above mentioned number of sales history list will be send into sales history api", 23 | "fieldname": "sales_history_count", 24 | "fieldtype": "Int", 25 | "in_list_view": 1, 26 | "label": "Sales History count" 27 | }, 28 | { 29 | "fieldname": "booking_list_count", 30 | "fieldtype": "Int", 31 | "label": "Booking List Count" 32 | }, 33 | { 34 | "default": "0", 35 | "fieldname": "is_demo_setup", 36 | "fieldtype": "Check", 37 | "label": "is Demo Setup" 38 | } 39 | ], 40 | "index_web_pages_for_search": 1, 41 | "issingle": 1, 42 | "links": [], 43 | "modified": "2025-01-27 15:32:34.524606", 44 | "modified_by": "Administrator", 45 | "module": "nbpos", 46 | "name": "nbpos Setting", 47 | "owner": "Administrator", 48 | "permissions": [ 49 | { 50 | "create": 1, 51 | "delete": 1, 52 | "email": 1, 53 | "print": 1, 54 | "read": 1, 55 | "role": "System Manager", 56 | "share": 1, 57 | "write": 1 58 | } 59 | ], 60 | "sort_field": "modified", 61 | "sort_order": "DESC", 62 | "states": [], 63 | "track_changes": 1 64 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/nbpos_setting/nbpos_setting.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class nbposSetting(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/nbpos_setting/test_nbpos_setting.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestnbposSetting(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/platform_settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/platform_settings/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/platform_settings/platform_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | // frappe.ui.form.on("Platform Settings", { 5 | // refresh(frm) { 6 | 7 | // }, 8 | // }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/platform_settings/platform_settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-09-05 15:24:06.928376", 5 | "doctype": "DocType", 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "platform_name", 9 | "api_key", 10 | "store_key", 11 | "cost_center", 12 | "user", 13 | "customer_email" 14 | ], 15 | "fields": [ 16 | { 17 | "fieldname": "platform_name", 18 | "fieldtype": "Select", 19 | "in_list_view": 1, 20 | "label": "Platform Name", 21 | "options": "\nopencart\namazon\nshopify", 22 | "reqd": 1 23 | }, 24 | { 25 | "fieldname": "api_key", 26 | "fieldtype": "Data", 27 | "in_list_view": 1, 28 | "label": "Api key", 29 | "reqd": 1 30 | }, 31 | { 32 | "fieldname": "store_key", 33 | "fieldtype": "Data", 34 | "in_list_view": 1, 35 | "label": "Store Key", 36 | "reqd": 1 37 | }, 38 | { 39 | "fieldname": "cost_center", 40 | "fieldtype": "Link", 41 | "label": "Cost Center", 42 | "options": "Cost Center" 43 | }, 44 | { 45 | "fieldname": "user", 46 | "fieldtype": "Link", 47 | "label": "User", 48 | "options": "User" 49 | }, 50 | { 51 | "fieldname": "customer_email", 52 | "fieldtype": "Data", 53 | "label": "Customer Email" 54 | } 55 | ], 56 | "index_web_pages_for_search": 1, 57 | "links": [], 58 | "modified": "2024-09-05 15:51:52.821367", 59 | "modified_by": "Administrator", 60 | "module": "nbpos", 61 | "name": "Platform Settings", 62 | "owner": "Administrator", 63 | "permissions": [ 64 | { 65 | "create": 1, 66 | "delete": 1, 67 | "email": 1, 68 | "export": 1, 69 | "print": 1, 70 | "read": 1, 71 | "report": 1, 72 | "role": "System Manager", 73 | "share": 1, 74 | "write": 1 75 | } 76 | ], 77 | "sort_field": "modified", 78 | "sort_order": "DESC", 79 | "states": [] 80 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/platform_settings/platform_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | 8 | class PlatformSettings(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/platform_settings/test_platform_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestPlatformSettings(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_closing_shift/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift/test_pos_closing_shift.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2020, NestorBird and contributors 3 | # See license.txt 4 | 5 | from __future__ import unicode_literals 6 | 7 | # import frappe 8 | import unittest 9 | 10 | class TestPOSClosingShift(unittest.TestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_detail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_closing_shift_detail/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_detail/pos_closing_shift_detail.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2020-09-29 02:59:27.107324", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "mode_of_payment", 9 | "opening_amount", 10 | "closing_amount", 11 | "expected_amount", 12 | "difference" 13 | ], 14 | "fields": [ 15 | { 16 | "fieldname": "mode_of_payment", 17 | "fieldtype": "Link", 18 | "in_list_view": 1, 19 | "label": "Mode of Payment", 20 | "options": "Mode of Payment", 21 | "reqd": 1 22 | }, 23 | { 24 | "fieldname": "opening_amount", 25 | "fieldtype": "Currency", 26 | "in_list_view": 1, 27 | "label": "Opening Amount", 28 | "options": "company:company_currency", 29 | "read_only": 1, 30 | "reqd": 1 31 | }, 32 | { 33 | "fieldname": "closing_amount", 34 | "fieldtype": "Currency", 35 | "in_list_view": 1, 36 | "label": "Closing Amount", 37 | "options": "company:company_currency", 38 | "reqd": 1 39 | }, 40 | { 41 | "fieldname": "expected_amount", 42 | "fieldtype": "Currency", 43 | "in_list_view": 1, 44 | "label": "Expected Amount", 45 | "options": "company:company_currency", 46 | "read_only": 1, 47 | "reqd": 1 48 | }, 49 | { 50 | "fieldname": "difference", 51 | "fieldtype": "Currency", 52 | "in_list_view": 1, 53 | "label": "Difference", 54 | "options": "company:company_currency", 55 | "read_only": 1 56 | } 57 | ], 58 | "istable": 1, 59 | "links": [], 60 | "modified": "2020-09-29 02:59:35.699400", 61 | "modified_by": "Administrator", 62 | "module": "nbpos", 63 | "name": "POS Closing Shift Detail", 64 | "owner": "Administrator", 65 | "permissions": [], 66 | "quick_entry": 1, 67 | "sort_field": "modified", 68 | "sort_order": "DESC", 69 | "track_changes": 1 70 | } 71 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_detail/pos_closing_shift_detail.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | # import frappe 7 | from frappe.model.document import Document 8 | 9 | class POSClosingShiftDetail(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_taxes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_closing_shift_taxes/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_taxes/pos_closing_shift_taxes.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2020-09-29 03:00:46.321522", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": ["account_head", "rate", "amount"], 8 | "fields": [ 9 | { 10 | "fieldname": "account_head", 11 | "fieldtype": "Link", 12 | "in_list_view": 1, 13 | "label": "Account Head", 14 | "options": "Account", 15 | "read_only": 1 16 | }, 17 | { 18 | "fieldname": "rate", 19 | "fieldtype": "Percent", 20 | "in_list_view": 1, 21 | "label": "Rate", 22 | "read_only": 1 23 | }, 24 | { 25 | "fieldname": "amount", 26 | "fieldtype": "Currency", 27 | "in_list_view": 1, 28 | "label": "Amount", 29 | "read_only": 1 30 | } 31 | ], 32 | "istable": 1, 33 | "links": [], 34 | "modified": "2020-09-29 03:00:46.321522", 35 | "modified_by": "Administrator", 36 | "module": "nbpos", 37 | "name": "POS Closing Shift Taxes", 38 | "owner": "Administrator", 39 | "permissions": [], 40 | "quick_entry": 1, 41 | "sort_field": "modified", 42 | "sort_order": "DESC", 43 | "track_changes": 1 44 | } 45 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_closing_shift_taxes/pos_closing_shift_taxes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | # import frappe 7 | from frappe.model.document import Document 8 | 9 | class POSClosingShiftTaxes(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_opening_shift/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift/pos_opening_shift.js: -------------------------------------------------------------------------------- 1 | // # Copyright (c) 2020, NestorBird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('POS Opening Shift', { 5 | setup(frm) { 6 | if (frm.doc.docstatus == 0) { 7 | frm.trigger('set_posting_date_read_only'); 8 | frm.set_value('period_start_date', frappe.datetime.now_datetime()); 9 | frm.set_value('user', frappe.session.user); 10 | } 11 | frm.set_query("user", function (doc) { 12 | return { 13 | query: "nbpos.nbpos.doctype.pos_closing_shift.pos_closing_shift.get_cashiers", 14 | filters: { 'parent': doc.pos_profile } 15 | }; 16 | }); 17 | frm.set_query("pos_profile", function (doc) { 18 | return { 19 | filters: { 'company': doc.company } 20 | }; 21 | }); 22 | }, 23 | 24 | refresh(frm) { 25 | // set default posting date / time 26 | if (frm.doc.docstatus == 0) { 27 | if (!frm.doc.posting_date) { 28 | frm.set_value('posting_date', frappe.datetime.nowdate()); 29 | } 30 | frm.trigger('set_posting_date_read_only'); 31 | } 32 | }, 33 | 34 | set_posting_date_read_only(frm) { 35 | if (frm.doc.docstatus == 0 && frm.doc.set_posting_date) { 36 | frm.set_df_property('posting_date', 'read_only', 0); 37 | } else { 38 | frm.set_df_property('posting_date', 'read_only', 1); 39 | } 40 | }, 41 | 42 | set_posting_date(frm) { 43 | frm.trigger('set_posting_date_read_only'); 44 | }, 45 | 46 | pos_profile: (frm) => { 47 | if (frm.doc.pos_profile) { 48 | frappe.db.get_doc("POS Profile", frm.doc.pos_profile) 49 | .then(({ payments }) => { 50 | if (payments.length) { 51 | frm.doc.balance_details = []; 52 | payments.forEach(({ mode_of_payment }) => { 53 | frm.add_child("balance_details", { mode_of_payment }); 54 | }) 55 | frm.refresh_field("balance_details"); 56 | } 57 | }); 58 | } 59 | } 60 | }); -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift/pos_opening_shift.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | import frappe 7 | from frappe import _ 8 | from frappe.utils import cint 9 | from frappe.model.document import Document 10 | from nbpos.custom_api.v1.status_updater import StatusUpdater 11 | 12 | 13 | class POSOpeningShift(StatusUpdater): 14 | def validate(self): 15 | self.validate_pos_profile_and_cashier() 16 | self.set_status() 17 | 18 | def validate_pos_profile_and_cashier(self): 19 | if self.company != frappe.db.get_value("POS Profile", self.pos_profile, "company"): 20 | frappe.throw(_("POS Profile {} does not belongs to company {}".format(self.pos_profile, self.company))) 21 | 22 | if not cint(frappe.db.get_value("User", self.user, "enabled")): 23 | frappe.throw(_("User {} has been disabled. Please select valid user/cashier".format(self.user))) 24 | 25 | def on_submit(self): 26 | self.set_status(update=True) 27 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift/pos_opening_shift_list.js: -------------------------------------------------------------------------------- 1 | // # Copyright (c) 2020, NestorBird and contributors 2 | // License: GNU General Public License v3. See license.txt 3 | 4 | // render 5 | frappe.listview_settings['POS Opening Shift'] = { 6 | get_indicator: function (doc) { 7 | var status_color = { 8 | "Draft": "grey", 9 | "Open": "orange", 10 | "Closed": "green", 11 | "Cancelled": "red" 12 | 13 | }; 14 | return [__(doc.status), status_color[doc.status], "status,=," + doc.status]; 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift/test_pos_opening_shift.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # # Copyright (c) 2020, NestorBird and contributors 3 | # See license.txt 4 | from __future__ import unicode_literals 5 | 6 | # import frappe 7 | import unittest 8 | 9 | class TestPOSOpeningShift(unittest.TestCase): 10 | pass 11 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift_detail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_opening_shift_detail/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift_detail/pos_opening_shift_detail.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2020-09-22 14:11:51.000467", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": ["mode_of_payment", "amount"], 8 | "fields": [ 9 | { 10 | "fieldname": "mode_of_payment", 11 | "fieldtype": "Link", 12 | "in_list_view": 1, 13 | "label": "Mode of Payment", 14 | "options": "Mode of Payment", 15 | "reqd": 1 16 | }, 17 | { 18 | "default": "0", 19 | "fieldname": "amount", 20 | "fieldtype": "Currency", 21 | "in_list_view": 1, 22 | "label": "Opening Amount", 23 | "options": "company:company_currency", 24 | "reqd": 1 25 | } 26 | ], 27 | "istable": 1, 28 | "links": [], 29 | "modified": "2020-09-23 02:29:31.193208", 30 | "modified_by": "Administrator", 31 | "module": "nbpos", 32 | "name": "POS Opening Shift Detail", 33 | "owner": "Administrator", 34 | "permissions": [], 35 | "quick_entry": 1, 36 | "sort_field": "modified", 37 | "sort_order": "DESC", 38 | "track_changes": 1 39 | } 40 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_opening_shift_detail/pos_opening_shift_detail.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | # import frappe 7 | from frappe.model.document import Document 8 | 9 | class POSOpeningShiftDetail(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_terminal/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/pos_terminal/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_terminal/pos_terminal.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('POS Terminal', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_terminal/pos_terminal.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2023-11-22 23:54:08.848929", 5 | "default_view": "List", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "user", 11 | "pos_profile", 12 | "pos_opening_entry", 13 | "pos_closing_entry", 14 | "last_sync" 15 | ], 16 | "fields": [ 17 | { 18 | "fieldname": "user", 19 | "fieldtype": "Link", 20 | "in_list_view": 1, 21 | "label": "User", 22 | "options": "User", 23 | "reqd": 1 24 | }, 25 | { 26 | "fieldname": "pos_profile", 27 | "fieldtype": "Link", 28 | "in_list_view": 1, 29 | "label": "POS Profile", 30 | "options": "POS Profile", 31 | "reqd": 1 32 | }, 33 | { 34 | "fieldname": "pos_opening_entry", 35 | "fieldtype": "Link", 36 | "in_list_view": 1, 37 | "label": "POS Opening Entry", 38 | "options": "POS Opening Entry", 39 | "reqd": 1 40 | }, 41 | { 42 | "fieldname": "pos_closing_entry", 43 | "fieldtype": "Link", 44 | "in_list_view": 1, 45 | "label": "POS Closing Entry", 46 | "options": "POS Closing Entry", 47 | "reqd": 1 48 | }, 49 | { 50 | "fieldname": "last_sync", 51 | "fieldtype": "Datetime", 52 | "label": "Last Sync" 53 | } 54 | ], 55 | "index_web_pages_for_search": 1, 56 | "links": [], 57 | "modified": "2023-11-22 23:55:08.731929", 58 | "modified_by": "Administrator", 59 | "module": "nbpos", 60 | "name": "POS Terminal", 61 | "owner": "Administrator", 62 | "permissions": [ 63 | { 64 | "create": 1, 65 | "delete": 1, 66 | "email": 1, 67 | "export": 1, 68 | "print": 1, 69 | "read": 1, 70 | "report": 1, 71 | "role": "System Manager", 72 | "share": 1, 73 | "write": 1 74 | } 75 | ], 76 | "sort_field": "modified", 77 | "sort_order": "DESC", 78 | "states": [] 79 | } 80 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_terminal/pos_terminal.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class POSTerminal(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/pos_terminal/test_pos_terminal.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestPOSTerminal(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/privacy_policy/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy/privacy_policy.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Privacy Policy', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy/privacy_policy.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_import": 1, 4 | "allow_rename": 1, 5 | "autoname": "field:title", 6 | "creation": "2021-11-03 15:04:12.709785", 7 | "doctype": "DocType", 8 | "document_type": "Setup", 9 | "engine": "InnoDB", 10 | "field_order": ["title", "disabled", "privacy_policy", "privacy_policy_help"], 11 | "fields": [ 12 | { 13 | "fieldname": "title", 14 | "fieldtype": "Data", 15 | "label": "Title", 16 | "no_copy": 1, 17 | "oldfieldname": "title", 18 | "oldfieldtype": "Data", 19 | "reqd": 1, 20 | "unique": 1 21 | }, 22 | { 23 | "default": "0", 24 | "fieldname": "disabled", 25 | "fieldtype": "Check", 26 | "in_list_view": 1, 27 | "label": "Disabled" 28 | }, 29 | { 30 | "allow_in_quick_entry": 1, 31 | "fieldname": "privacy_policy", 32 | "fieldtype": "Text Editor", 33 | "in_global_search": 1, 34 | "label": "Privacy Policy", 35 | "oldfieldname": "terms", 36 | "oldfieldtype": "Text Editor" 37 | }, 38 | { 39 | "fieldname": "privacy_policy_help", 40 | "fieldtype": "HTML", 41 | "label": "Privacy Policy Help" 42 | } 43 | ], 44 | "icon": "icon-legal", 45 | "links": [], 46 | "modified": "2022-01-27 15:14:56.988195", 47 | "modified_by": "Administrator", 48 | "module": "nbpos", 49 | "name": "Privacy Policy", 50 | "owner": "Administrator", 51 | "permissions": [ 52 | { 53 | "create": 1, 54 | "delete": 1, 55 | "email": 1, 56 | "export": 1, 57 | "import": 1, 58 | "print": 1, 59 | "read": 1, 60 | "report": 1, 61 | "role": "Sales Master Manager", 62 | "share": 1, 63 | "write": 1 64 | }, 65 | { 66 | "read": 1, 67 | "role": "Sales User" 68 | }, 69 | { 70 | "read": 1, 71 | "role": "Purchase User" 72 | }, 73 | { 74 | "create": 1, 75 | "delete": 1, 76 | "email": 1, 77 | "print": 1, 78 | "read": 1, 79 | "report": 1, 80 | "role": "System Manager", 81 | "share": 1, 82 | "write": 1 83 | }, 84 | { 85 | "create": 1, 86 | "delete": 1, 87 | "email": 1, 88 | "print": 1, 89 | "read": 1, 90 | "report": 1, 91 | "role": "Accounts User", 92 | "share": 1, 93 | "write": 1 94 | }, 95 | { 96 | "read": 1, 97 | "role": "Stock User" 98 | } 99 | ], 100 | "quick_entry": 1, 101 | "show_name_in_global_search": 1, 102 | "sort_field": "modified", 103 | "sort_order": "ASC" 104 | } 105 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy/privacy_policy.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class PrivacyPolicy(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy/test_privacy_policy.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestPrivacyPolicy(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy_and_terms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/privacy_policy_and_terms/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy_and_terms/privacy_policy_and_terms.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Privacy Policy and Terms', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy_and_terms/privacy_policy_and_terms.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_import": 1, 4 | "allow_rename": 1, 5 | "autoname": "field:title", 6 | "creation": "2021-11-03 15:04:12.709785", 7 | "doctype": "DocType", 8 | "document_type": "Setup", 9 | "engine": "InnoDB", 10 | "field_order": [ 11 | "title", 12 | "disabled", 13 | "privacy_policy", 14 | "privacy_policy_help", 15 | "terms_and_conditions" 16 | ], 17 | "fields": [ 18 | { 19 | "fieldname": "title", 20 | "fieldtype": "Data", 21 | "label": "Title", 22 | "no_copy": 1, 23 | "oldfieldname": "title", 24 | "oldfieldtype": "Data", 25 | "reqd": 1, 26 | "unique": 1 27 | }, 28 | { 29 | "default": "0", 30 | "fieldname": "disabled", 31 | "fieldtype": "Check", 32 | "in_list_view": 1, 33 | "label": "Disabled" 34 | }, 35 | { 36 | "allow_in_quick_entry": 1, 37 | "fieldname": "privacy_policy", 38 | "fieldtype": "HTML Editor", 39 | "in_global_search": 1, 40 | "label": "Privacy Policy", 41 | "oldfieldname": "terms", 42 | "oldfieldtype": "Text Editor" 43 | }, 44 | { 45 | "fieldname": "privacy_policy_help", 46 | "fieldtype": "HTML", 47 | "label": "Privacy Policy Help" 48 | }, 49 | { 50 | "fieldname": "terms_and_conditions", 51 | "fieldtype": "HTML Editor", 52 | "label": "Terms and Conditions" 53 | } 54 | ], 55 | "icon": "icon-legal", 56 | "links": [], 57 | "modified": "2022-01-27 15:07:49.788276", 58 | "modified_by": "Administrator", 59 | "module": "nbpos", 60 | "name": "Privacy Policy and Terms", 61 | "owner": "Administrator", 62 | "permissions": [ 63 | { 64 | "create": 1, 65 | "delete": 1, 66 | "email": 1, 67 | "export": 1, 68 | "import": 1, 69 | "print": 1, 70 | "read": 1, 71 | "report": 1, 72 | "role": "Sales Master Manager", 73 | "share": 1, 74 | "write": 1 75 | }, 76 | { 77 | "read": 1, 78 | "role": "Sales User" 79 | }, 80 | { 81 | "read": 1, 82 | "role": "Purchase User" 83 | }, 84 | { 85 | "create": 1, 86 | "delete": 1, 87 | "email": 1, 88 | "print": 1, 89 | "read": 1, 90 | "report": 1, 91 | "role": "System Manager", 92 | "share": 1, 93 | "write": 1 94 | }, 95 | { 96 | "create": 1, 97 | "delete": 1, 98 | "email": 1, 99 | "print": 1, 100 | "read": 1, 101 | "report": 1, 102 | "role": "Accounts User", 103 | "share": 1, 104 | "write": 1 105 | }, 106 | { 107 | "read": 1, 108 | "role": "Stock User" 109 | } 110 | ], 111 | "quick_entry": 1, 112 | "show_name_in_global_search": 1, 113 | "sort_field": "modified", 114 | "sort_order": "ASC" 115 | } 116 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy_and_terms/privacy_policy_and_terms.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class PrivacyPolicyandTerms(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/privacy_policy_and_terms/test_privacy_policy_and_terms.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestPrivacyPolicyandTerms(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/related_item/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/related_item/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/related_item/related_item.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-04-24 17:10:08.703178", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "item", 10 | "price" 11 | ], 12 | "fields": [ 13 | { 14 | "fieldname": "item", 15 | "fieldtype": "Link", 16 | "in_list_view": 1, 17 | "label": "Item", 18 | "options": "Item" 19 | }, 20 | { 21 | "fieldname": "price", 22 | "fieldtype": "Data", 23 | "in_list_view": 1, 24 | "label": "Price" 25 | } 26 | ], 27 | "index_web_pages_for_search": 1, 28 | "istable": 1, 29 | "links": [], 30 | "modified": "2024-05-27 12:56:59.882796", 31 | "modified_by": "Administrator", 32 | "module": "nbpos", 33 | "name": "Related Item", 34 | "owner": "Administrator", 35 | "permissions": [], 36 | "sort_field": "modified", 37 | "sort_order": "DESC", 38 | "states": [] 39 | } -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/related_item/related_item.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class RelatedItem(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sales_invoice_reference/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/sales_invoice_reference/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sales_invoice_reference/sales_invoice_reference.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2020-09-29 02:58:12.486831", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "sales_invoice", 9 | "posting_date", 10 | "column_break_3", 11 | "customer", 12 | "grand_total" 13 | ], 14 | "fields": [ 15 | { 16 | "fieldname": "sales_invoice", 17 | "fieldtype": "Link", 18 | "in_list_view": 1, 19 | "label": "Sales Invoice", 20 | "options": "Sales Invoice", 21 | "reqd": 1 22 | }, 23 | { 24 | "fetch_from": "pos_invoice.posting_date", 25 | "fieldname": "posting_date", 26 | "fieldtype": "Date", 27 | "in_list_view": 1, 28 | "label": "Date", 29 | "reqd": 1 30 | }, 31 | { 32 | "fieldname": "column_break_3", 33 | "fieldtype": "Column Break" 34 | }, 35 | { 36 | "fetch_from": "pos_invoice.customer", 37 | "fieldname": "customer", 38 | "fieldtype": "Link", 39 | "label": "Customer", 40 | "options": "Customer", 41 | "read_only": 1, 42 | "reqd": 1 43 | }, 44 | { 45 | "fetch_from": "pos_invoice.grand_total", 46 | "fieldname": "grand_total", 47 | "fieldtype": "Currency", 48 | "in_list_view": 1, 49 | "label": "Amount", 50 | "reqd": 1 51 | } 52 | ], 53 | "istable": 1, 54 | "links": [], 55 | "modified": "2020-09-29 02:58:12.486831", 56 | "modified_by": "Administrator", 57 | "module": "nbpos", 58 | "name": "Sales Invoice Reference", 59 | "owner": "Administrator", 60 | "permissions": [], 61 | "quick_entry": 1, 62 | "sort_field": "modified", 63 | "sort_order": "DESC", 64 | "track_changes": 1 65 | } 66 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sales_invoice_reference/sales_invoice_reference.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2020, NestorBird and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | # import frappe 7 | from frappe.model.document import Document 8 | 9 | class SalesInvoiceReference(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sync_register/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/sync_register/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sync_register/sync_register.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on("Sync Register", { 5 | refresh: function (frm) { 6 | frm.disable_save(); 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sync_register/sync_register.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2023-11-21 11:41:14.980694", 5 | "default_view": "List", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "sync_datetime", 11 | "column_break_l5idp", 12 | "force_update", 13 | "section_break_sltua", 14 | "data" 15 | ], 16 | "fields": [ 17 | { 18 | "fieldname": "sync_datetime", 19 | "fieldtype": "Datetime", 20 | "in_list_view": 1, 21 | "label": "Sync Datetime", 22 | "reqd": 1 23 | }, 24 | { 25 | "fieldname": "column_break_l5idp", 26 | "fieldtype": "Column Break" 27 | }, 28 | { 29 | "default": "0", 30 | "fieldname": "force_update", 31 | "fieldtype": "Check", 32 | "in_list_view": 1, 33 | "label": "Force Update" 34 | }, 35 | { 36 | "fieldname": "data", 37 | "fieldtype": "Code", 38 | "in_list_view": 1, 39 | "label": "Data", 40 | "reqd": 1 41 | }, 42 | { 43 | "fieldname": "section_break_sltua", 44 | "fieldtype": "Section Break" 45 | } 46 | ], 47 | "in_create": 1, 48 | "index_web_pages_for_search": 1, 49 | "links": [], 50 | "modified": "2023-11-22 11:09:12.789647", 51 | "modified_by": "Administrator", 52 | "module": "nbpos", 53 | "name": "Sync Register", 54 | "owner": "Administrator", 55 | "permissions": [ 56 | { 57 | "create": 1, 58 | "delete": 1, 59 | "email": 1, 60 | "export": 1, 61 | "print": 1, 62 | "read": 1, 63 | "report": 1, 64 | "role": "System Manager", 65 | "share": 1, 66 | "write": 1 67 | } 68 | ], 69 | "sort_field": "modified", 70 | "sort_order": "DESC", 71 | "states": [], 72 | "track_changes": 1 73 | } 74 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sync_register/sync_register.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class SyncRegister(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/sync_register/test_sync_register.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestSyncRegister(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/theme_settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/theme_settings/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/theme_settings/test_theme_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestThemeSettings(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/theme_settings/theme_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Theme Settings', { 5 | refresh: function(frm) { 6 | frappe.db.get_value("Customer", {"customer_name": "Dine In"}, "name") 7 | .then(doc => { 8 | frm.set_value({dine_in: doc.message['name']}) 9 | }) 10 | frappe.db.get_value("Customer", {"customer_name": "Take Away"}, "name") 11 | .then(doc => { 12 | frm.set_value({take_away: doc.message['name']}) 13 | }) 14 | frappe.db.get_value("Customer", {"customer_name": "Guest Customer"}, "name") 15 | .then(doc => { 16 | frm.set_value({guest_customer: doc.message['name']}) 17 | }) 18 | 19 | 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/theme_settings/theme_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class ThemeSettings(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/ward/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward/test_ward.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | import unittest 6 | 7 | class TestWard(unittest.TestCase): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward/ward.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, swapnil and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Ward', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward/ward.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "autoname": "format:{abbr}-{####}", 5 | "creation": "2021-10-13 13:17:33.244519", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": ["ward", "abbr"], 10 | "fields": [ 11 | { 12 | "fieldname": "ward", 13 | "fieldtype": "Data", 14 | "in_list_view": 1, 15 | "label": "Ward", 16 | "reqd": 1, 17 | "unique": 1 18 | }, 19 | { 20 | "fieldname": "abbr", 21 | "fieldtype": "Data", 22 | "label": "Abbr" 23 | } 24 | ], 25 | "index_web_pages_for_search": 1, 26 | "links": [], 27 | "modified": "2022-01-27 15:15:19.943424", 28 | "modified_by": "Administrator", 29 | "module": "nbpos", 30 | "name": "Ward", 31 | "owner": "Administrator", 32 | "permissions": [ 33 | { 34 | "create": 1, 35 | "delete": 1, 36 | "email": 1, 37 | "export": 1, 38 | "print": 1, 39 | "read": 1, 40 | "report": 1, 41 | "role": "System Manager", 42 | "share": 1, 43 | "write": 1 44 | } 45 | ], 46 | "search_fields": "ward", 47 | "sort_field": "modified", 48 | "sort_order": "DESC", 49 | "track_changes": 1 50 | } 51 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward/ward.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | import frappe 5 | from frappe.model.document import Document 6 | 7 | class Ward(Document): 8 | pass 9 | 10 | @frappe.whitelist(allow_guest=True) 11 | def get_assigned_ward(): 12 | assigned_ward_list = [] 13 | ward_list=frappe.db.sql(""" 14 | SELECT 15 | distinct(ward) 16 | FROM `tabWard Detail` 17 | WHERE parenttype = 'Hub Manager'""",as_dict = 1) 18 | for item in ward_list: 19 | assigned_ward_list.append(item.ward) 20 | return assigned_ward_list 21 | 22 | @frappe.whitelist(allow_guest=True) 23 | def get_ward_by_hub_manager(hub_manager): 24 | assigned_ward_list = [] 25 | ward_list=frappe.db.sql(""" 26 | SELECT 27 | distinct(ward) 28 | FROM `tabWard Detail` where parent =%s""",(hub_manager),as_dict = 1) 29 | for item in ward_list: 30 | assigned_ward_list.append(item.ward) 31 | return assigned_ward_list -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward_detail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/ward_detail/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward_detail/ward_detail.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2021-10-13 13:23:32.764659", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": ["ward", "is_assigned"], 9 | "fields": [ 10 | { 11 | "columns": 2, 12 | "fieldname": "ward", 13 | "fieldtype": "Link", 14 | "in_list_view": 1, 15 | "label": "Ward", 16 | "options": "Ward", 17 | "reqd": 1 18 | }, 19 | { 20 | "columns": 2, 21 | "default": "0", 22 | "fieldname": "is_assigned", 23 | "fieldtype": "Check", 24 | "in_list_view": 1, 25 | "label": "Is assigned" 26 | } 27 | ], 28 | "index_web_pages_for_search": 1, 29 | "istable": 1, 30 | "links": [], 31 | "modified": "2022-01-27 15:12:53.658737", 32 | "modified_by": "Administrator", 33 | "module": "nbpos", 34 | "name": "Ward Detail", 35 | "owner": "Administrator", 36 | "permissions": [], 37 | "sort_field": "modified", 38 | "sort_order": "DESC", 39 | "track_changes": 1 40 | } 41 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/ward_detail/ward_detail.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, swapnil and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class WardDetail(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/web_theme_settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/doctype/web_theme_settings/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/web_theme_settings/test_web_theme_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestWebThemeSettings(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/web_theme_settings/web_theme_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Web Theme Settings', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/doctype/web_theme_settings/web_theme_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Nestorbird and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | class WebThemeSettings(Document): 8 | pass 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/hooks/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/cost_center.py: -------------------------------------------------------------------------------- 1 | import json 2 | import frappe 3 | 4 | @frappe.whitelist() 5 | def create_warehouse(self, method=None): 6 | self=json.loads(self) 7 | warehouse_detail=frappe.db.get_value("Warehouse",self.get("name"),'name') 8 | if not warehouse_detail: 9 | new_warehouse = frappe.new_doc("Warehouse") 10 | new_warehouse.warehouse_name = self.get("cost_center_name") 11 | new_warehouse.custom_cost_center = self.get("name") 12 | new_warehouse.insert() 13 | 14 | 15 | @frappe.whitelist() 16 | def fetch_all_cost_centers(): 17 | cost_centers = frappe.get_all("Cost Center", fields=["name"]) 18 | return cost_centers 19 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/customer.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | from frappe.model.naming import make_autoname 4 | 5 | 6 | @frappe.whitelist(allow_guest=True) 7 | def get_customer_by_ward(ward): 8 | assigned_customer_list = [] 9 | customer_list=frappe.db.sql(""" 10 | SELECT 11 | name 12 | FROM `tabCustomer` 13 | WHERE ward =%s and disabled = 0""",(ward),as_dict = 1) 14 | for item in customer_list: 15 | assigned_customer_list.append(item.name) 16 | return assigned_customer_list 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/global_defaults.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | def update_theme_settings(doc,method=None): 4 | default_currency =doc.default_currency 5 | theme_settings =frappe.get_doc("Theme Settings") 6 | theme_settings.default_currency =default_currency 7 | theme_settings.save() 8 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/item.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | import re 4 | 5 | def validate_item_description(doc, method): 6 | pattern = r'|' 7 | desc_data = doc.description 8 | cleaned_str = re.sub(pattern, '', desc_data) 9 | if len(cleaned_str)>20: 10 | frappe.throw("Description must be less than 20 characters") 11 | 12 | 13 | 14 | def validate_item(doc, method): 15 | if not (doc.custom_web or doc.custom_pos or doc.custom_kiosk): 16 | frappe.throw("You have to select at least one of these options: WEB, POS, or Kiosk for this item under Item Configuration.") 17 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/item_group.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | 4 | def item_group_length(doc, method=None): 5 | pass 6 | # if len(doc.item_group_name) > 15: 7 | # frappe.throw(_("Item Group Name cannot be more than 15 characters long.")) 8 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/item_price.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | 4 | @frappe.whitelist(allow_guest=True) 5 | def validate_item_price(doc,method): 6 | if doc.price_list_rate<=0: 7 | frappe.throw(_("Rate can not be Zero or Negative")) 8 | 9 | 10 | @frappe.whitelist() 11 | def get_item_price(item_code): 12 | price_list_rate = frappe.db.get_value('Item Price', {'item_code': item_code}, 'price_list_rate') 13 | if price_list_rate is not None: 14 | return {'price_list_rate': price_list_rate} 15 | else: 16 | return {'price_list_rate': 0} 17 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/sales_order.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.model.naming import make_autoname 3 | from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice 4 | from erpnext.controllers.accounts_controller import get_taxes_and_charges 5 | 6 | 7 | def on_submit(doc, method): 8 | create_sales_invoice_from_sales_order(doc) 9 | 10 | def validate(doc, method): 11 | set_warehouse(doc) 12 | # if doc.is_new(): 13 | # hub_manager_series = frappe.db.get_value('Hub Manager', doc.hub_manager, 'series') 14 | # doc.name = make_autoname(hub_manager_series) 15 | 16 | 17 | def create_sales_invoice_from_sales_order(doc): 18 | if (doc.custom_source == "WEB"): 19 | pass 20 | else: 21 | sales_invoice = make_sales_invoice(doc.name) 22 | sales_invoice.posting_date = doc.transaction_date 23 | sales_invoice.posting_time = doc.transaction_time 24 | sales_invoice.due_date = doc.transaction_date 25 | sales_invoice.update_stock = 1 26 | sales_invoice.save(ignore_permissions=1) 27 | sales_invoice.submit() 28 | 29 | def set_warehouse(doc): 30 | if not doc.set_warehouse: 31 | doc.set_warehouse = frappe.db.get_value('Warehouse', {'warehouse_name': 'Stores'}, 'name') 32 | for item in doc.items: 33 | item.warehouse = doc.set_warehouse 34 | 35 | -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/version.py: -------------------------------------------------------------------------------- 1 | import frappe, json 2 | from nbpos.custom_api.v1.item import get_items 3 | from frappe.utils import now 4 | 5 | def after_insert(doc, event=None): 6 | if doc.get('ref_doctype') in ['Item', 'Item Group','Item Tax Template','Item Price', 7 | 'Stock Entry', 'Purchase Receipt', 'Delivery Note','Sales Invoice']: 8 | 9 | if doc.get('ref_doctype') == 'Item Group': 10 | check_item_group(doc) 11 | 12 | elif doc.get('ref_doctype') == 'Item': 13 | check_item(doc) 14 | 15 | elif doc.get('ref_doctype') == 'Item Price': 16 | check_price(doc) 17 | 18 | elif doc.get('ref_doctype') == 'Item Tax Template': 19 | check_item_tax_template(doc) 20 | 21 | else: 22 | check_stock_items(doc) 23 | 24 | 25 | def check_stock_items(doc): 26 | doc = frappe.get_doc(doc.get('ref_doctype'), doc.get('docname')) 27 | if doc.items: 28 | for item in doc.items: 29 | check_item(doc={'ref_doctype':'Item', 'docname': item.item_code}) 30 | 31 | 32 | def check_item_tax_template(doc): 33 | doc = frappe.get_doc(doc.get('ref_doctype'), doc.get('docname')) 34 | item_data = frappe.db.sql(''' select parent from `tabItem Tax` where parenttype='Item' and item_tax_template= %(name)s group by parent''',{'name': doc.name}, 35 | as_dict=1 ) 36 | for item in item_data: 37 | check_item(doc={'ref_doctype':'Item', 'docname': item.parent}) 38 | 39 | 40 | 41 | def check_price(doc): 42 | doc = frappe.get_doc(doc.get('ref_doctype'), doc.get('docname')) 43 | item_group = frappe.get_cached_value('Item', doc.item_code, 'item_group') 44 | parent_item_group = frappe.get_cached_value('Item Group', item_group, fieldname="parent_item_group") 45 | if not parent_item_group == 'Extra': 46 | data = get_items(item_group = doc.get('item_group'), item_code=doc.item_code) 47 | else: 48 | data = get_items(extra_item_group = doc.get('item_group'), item_code=doc.item_code) 49 | 50 | # create_sync_reg_log(data) 51 | 52 | 53 | 54 | def check_item(doc): 55 | doc = frappe.get_doc(doc.get('ref_doctype'), doc.get('docname')) 56 | parent_item_group = frappe.get_cached_value('Item Group', doc.get('item_group'), fieldname="parent_item_group") 57 | if not parent_item_group == 'Extra': 58 | data = get_items(item_group = doc.get('item_group'), item_code=doc.name) 59 | else: 60 | data = get_items(extra_item_group = doc.get('item_group'), item_code=doc.name) 61 | 62 | # create_sync_reg_log(data) 63 | 64 | 65 | def check_item_group(doc): 66 | doc = frappe.get_doc(doc.get('ref_doctype'), doc.get('docname')) 67 | 68 | if doc.get('parent_item_group') != 'Extra': 69 | data = get_items(item_group = doc.get('name')) 70 | else: 71 | data = get_items(extra_item_group = doc.get('name')) 72 | 73 | # create_sync_reg_log(data) 74 | 75 | 76 | def create_sync_reg_log(data): 77 | frappe.get_doc({'doctype':'Sync Register','sync_datetime': now(), 'force_update': 1, 'data':json.dumps(data) }).insert(ignore_permissions=True) -------------------------------------------------------------------------------- /nbpos/nbpos/hooks/warehouse.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | 4 | 5 | def validate_hub_manager(doc, method): 6 | warehouse = frappe.get_value('Warehouse', {'hub_manager': doc.hub_manager}, 'name') 7 | if warehouse: 8 | frappe.throw(_("Already been used in some another warehouse.")) 9 | -------------------------------------------------------------------------------- /nbpos/nbpos/report/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/report/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/report/x_and_z_report/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/nbpos/report/x_and_z_report/__init__.py -------------------------------------------------------------------------------- /nbpos/nbpos/report/x_and_z_report/x_and_z_report.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Nestorbird and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.query_reports["X and Z Report"] = { 5 | "filters": [ 6 | { 7 | "fieldname": "from_date", 8 | "label": __("From Date"), 9 | "fieldtype": "Date", 10 | "default": frappe.datetime.month_start() 11 | }, 12 | { 13 | "fieldname": "to_date", 14 | "label": __("To Date"), 15 | "fieldtype": "Date", 16 | "default": frappe.datetime.month_end() 17 | }, 18 | { 19 | "fieldname": "pos_profile", 20 | "label": __("POS Profile"), 21 | "fieldtype": "Link", 22 | "options": "POS Profile" 23 | } 24 | ] 25 | }; 26 | -------------------------------------------------------------------------------- /nbpos/nbpos/report/x_and_z_report/x_and_z_report.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "columns": [], 4 | "creation": "2024-07-26 14:39:51.402452", 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "filters": [], 9 | "idx": 0, 10 | "is_standard": "Yes", 11 | "letterhead": null, 12 | "modified": "2024-07-26 14:39:51.402452", 13 | "modified_by": "Administrator", 14 | "module": "nbpos", 15 | "name": "X and Z Report", 16 | "owner": "Administrator", 17 | "prepared_report": 0, 18 | "ref_doctype": "Sales Order", 19 | "report_name": "X and Z Report", 20 | "report_type": "Script Report", 21 | "roles": [ 22 | { 23 | "role": "Accounts User" 24 | }, 25 | { 26 | "role": "Accounts Manager" 27 | }, 28 | { 29 | "role": "Auditor" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /nbpos/nbpos/schedulers/expired_gift_card_settlement.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.utils import add_days, nowdate, getdate 3 | def create_gift_card_journal_entries(): 4 | company_name = frappe.get_doc("Global Defaults").default_company 5 | company = frappe.get_doc("Company", company_name) 6 | previous_date = add_days(nowdate(), -1) 7 | expired_gift_cards = frappe.get_all("Gift Card", 8 | filters={ 9 | 'valid_upto': previous_date, 10 | 'amount_balance': ['>', 0], 11 | 'is_journal_entry': 0 12 | }, 13 | fields=['name', 'amount_balance']) 14 | for card in expired_gift_cards: 15 | journal_entry = frappe.new_doc("Journal Entry") 16 | journal_entry.voucher_type = "Journal Entry" 17 | journal_entry.company = company.name 18 | journal_entry.posting_date = getdate() 19 | journal_entry.user_remark = ( 20 | f"{card.amount_balance} $ gift card value remains unused and also surpasses the " 21 | "validity date of the gift card. Hence, gift card remaining value will be " 22 | "transferred to sales account to decrease the liability." 23 | ) 24 | journal_entry.append( 25 | "accounts", 26 | { 27 | 'account': "Gift card Revenue - " + company.abbr, 28 | 'debit_in_account_currency': float(card.amount_balance), 29 | 'credit_in_account_currency': 0.0 30 | } 31 | ) 32 | journal_entry.append( 33 | "accounts", 34 | { 35 | 'account': "Sales - " + company.abbr, 36 | 'debit_in_account_currency': 0.0, 37 | 'credit_in_account_currency': float(card.amount_balance) 38 | } 39 | ) 40 | journal_entry.save(ignore_permissions=True) 41 | journal_entry.submit() 42 | frappe.db.set_value("Gift Card", card.name, "is_journal_entry", 1) 43 | frappe.db.commit() 44 | -------------------------------------------------------------------------------- /nbpos/nbpos/workspace/getpos/getpos.json: -------------------------------------------------------------------------------- 1 | { 2 | "charts": [], 3 | "content": "[{\"id\":\"zZwaU4Evq5\",\"type\":\"header\",\"data\":{\"text\":\"GetPOS\",\"col\":12}},{\"id\":\"qYdfC9aICu\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"GetPOS\",\"col\":3}}]", 4 | "creation": "2024-10-01 12:08:53.942465", 5 | "custom_blocks": [], 6 | "docstatus": 0, 7 | "doctype": "Workspace", 8 | "for_user": "", 9 | "hide_custom": 0, 10 | "icon": "color-energy-points", 11 | "idx": 0, 12 | "indicator_color": "green", 13 | "is_hidden": 0, 14 | "label": "GetPOS", 15 | "links": [], 16 | "modified": "2024-10-01 12:10:15.312848", 17 | "modified_by": "Administrator", 18 | "module": "nbpos", 19 | "name": "GetPOS", 20 | "number_cards": [], 21 | "owner": "Administrator", 22 | "parent_page": "", 23 | "public": 1, 24 | "quick_lists": [], 25 | "roles": [], 26 | "sequence_id": 28.0, 27 | "shortcuts": [ 28 | { 29 | "color": "Grey", 30 | "doc_view": "List", 31 | "label": "GetPOS", 32 | "type": "URL", 33 | "url": "/getpos-react" 34 | } 35 | ], 36 | "title": "GetPOS" 37 | } -------------------------------------------------------------------------------- /nbpos/overrides/get_delivery_note.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.utils import cint 3 | 4 | def get_delivery_note_serial_no(item_code, qty, delivery_note): 5 | serial_nos = "" 6 | dn_serial_nos = frappe.db.sql_list( 7 | f""" select name from `tabSerial No` 8 | where item_code = %(item_code)s and delivery_document_no = %(delivery_note)s 9 | and sales_invoice is null limit {cint(qty)}""", 10 | {"item_code": item_code, "delivery_note": delivery_note}, 11 | ) 12 | 13 | if dn_serial_nos and len(dn_serial_nos) > 0: 14 | serial_nos = "\n".join(dn_serial_nos) 15 | 16 | return serial_nos -------------------------------------------------------------------------------- /nbpos/patches.txt: -------------------------------------------------------------------------------- 1 | nbpos.patches.delete_fields 2 | -------------------------------------------------------------------------------- /nbpos/patches/delete_fields.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | frappe.db.sql("""delete from `tabCustom Field` where name = 'Item-custom_fetch_cost_center' 6 | and dt='Item' and fieldname='custom_fetch_cost_center' """) 7 | 8 | frappe.db.sql("""delete from `tabCustom Field` where name = 'Item-custom_cost_center_details' 9 | and dt='Item' and fieldname='custom_cost_center_details' """) 10 | 11 | frappe.db.sql("""delete from `tabCustom Field` where name = 'Item Tax Template Detail-custom_tax_percentage' 12 | and dt='Item Tax Template Detail' and fieldname='custom_tax_percentage' """) 13 | 14 | frappe.db.sql("""delete from `tabCustom Field` where name = 'Item-custom_section_break_6cf4b' 15 | and dt='Item' and fieldname='custom_section_break_6cf4b' """) 16 | 17 | frappe.db.sql("""delete from `tabCustom Field` where name = 'Item-custom_related_items' 18 | and dt='Item' and fieldname='custom_related_items' """) -------------------------------------------------------------------------------- /nbpos/public/getpos-react/assets/empty-cart-4sut5lKX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/assets/empty-cart-4sut5lKX.png -------------------------------------------------------------------------------- /nbpos/public/getpos-react/assets/favicon-Cp4CXsEh.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/assets/favicon-Cp4CXsEh.ico -------------------------------------------------------------------------------- /nbpos/public/getpos-react/assets/logo-B5zZg7br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/assets/logo-B5zZg7br.png -------------------------------------------------------------------------------- /nbpos/public/getpos-react/assets/no-img-jQRv5CPY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/assets/no-img-jQRv5CPY.png -------------------------------------------------------------------------------- /nbpos/public/getpos-react/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/favicon.ico -------------------------------------------------------------------------------- /nbpos/public/getpos-react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Get POS 9 | 10 | 11 | 12 | 13 |
14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /nbpos/public/getpos-react/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/logo192.png -------------------------------------------------------------------------------- /nbpos/public/getpos-react/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/getpos-react/logo512.png -------------------------------------------------------------------------------- /nbpos/public/getpos-react/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /nbpos/public/getpos-react/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /nbpos/public/images/Group 786.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /nbpos/public/images/Group 796.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /nbpos/public/images/Icon awesome-users.png: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /nbpos/public/images/Path 6183.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/images/Path 6183.png -------------------------------------------------------------------------------- /nbpos/public/images/User Circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /nbpos/public/images/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/images/app_icon.ico -------------------------------------------------------------------------------- /nbpos/public/images/bootle.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/images/bootle.jpeg -------------------------------------------------------------------------------- /nbpos/public/images/done.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nbpos/public/images/icons8-done.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nbpos/public/images/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/images/logo1.png -------------------------------------------------------------------------------- /nbpos/public/images/no_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/public/images/no_image.png -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/account.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Account', { 2 | refresh: function(frm){ 3 | set_hub_manager_filter(frm); 4 | } 5 | }) 6 | 7 | function set_hub_manager_filter(frm){ 8 | frappe.db.get_list('Account', { 9 | fields: ['hub_manager'], 10 | filters: { 11 | hub_manager: ["!=", ''] 12 | }, 13 | as_list: 1 14 | }).then(records => { 15 | let hub_manager_list = [] 16 | for(let i = 0; i< records.length; i++){ 17 | hub_manager_list.push(records[i].toString()) 18 | } 19 | frm.set_query('hub_manager', () => { 20 | return { 21 | filters: { 22 | hub_manager: ['not in', hub_manager_list] 23 | } 24 | } 25 | }); 26 | }) 27 | } -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/cost_center.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on("Cost Center", { 2 | after_save: function(frm){ 3 | frappe.call({ 4 | method: 'getpos.getpos.hooks.cost_center.create_warehouse', 5 | args: { 6 | "self": frm.doc 7 | }, 8 | callback: function(r) { 9 | frm.refresh(); 10 | } 11 | }); 12 | } 13 | }); -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/customer.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on("Customer", { 2 | ward: function(frm){ 3 | if(frm.doc.ward){ 4 | frappe.call({ 5 | method: 'getpos.getpos.doctype.hub_manager.hub_manager.get_hub_manager', 6 | args: { 7 | "ward": frm.doc.ward 8 | }, 9 | callback: function(r) { 10 | frm.set_value("hub_manager", r.message); 11 | } 12 | }); 13 | } 14 | } 15 | }); -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/email_template.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on("Email Template", { 2 | refresh: function () { 3 | frm.refresh("custom_default_coupon_code_notification ") 4 | }, 5 | 6 | validate: function(frm){ 7 | if (frm.doc.custom_default_coupon_code_notification == true ) { 8 | frappe.call({ 9 | method: "nbpos.nbpos.hooks.pricing_rule.default_coupon_code_email_template", 10 | args: { 11 | doc: cur_frm.doc.name, 12 | }, 13 | callback: function(r) { 14 | if(r) { 15 | location.reload(true); 16 | } 17 | } 18 | }) 19 | } 20 | }, 21 | 22 | }); -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/item.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Item', { 2 | 3 | refresh: frm => { 4 | if (!frm.doc.__islocal) { 5 | 6 | if (frm.doc.custom_item == "Standard Item") { 7 | frm.add_custom_button(__("Create Attribute"), function() { 8 | frappe.new_doc("Attributes",{ 9 | "parent_item":frm.doc.name 10 | 11 | }) 12 | }).css({"color":"white", "background-color": "#2490EF", "font-weight": "800"}); 13 | } 14 | 15 | if (frm.doc.custom_item == "Combo Item") { 16 | frm.add_custom_button(__("Create Combo"), function() { 17 | frappe.new_doc("Combo",{ 18 | "parent_combo_item":frm.doc.name 19 | 20 | }) 21 | }).css({"color":"white", "background-color": "#2490EF", "font-weight": "800"}); 22 | } 23 | 24 | } 25 | 26 | // if (!frm.doc.__islocal) { 27 | // show_include_multigroup(frm) 28 | // } 29 | // else { 30 | // frm.set_df_property('incldues_item_group', 'hidden', 1) 31 | // } 32 | 33 | }, 34 | item_group: frm => { 35 | show_include_multigroup(frm) 36 | }, 37 | 38 | 39 | }) 40 | 41 | let show_include_multigroup = (frm) => { 42 | if (frm.doc.item_group) { 43 | frappe.db.get_doc('Item Group', frm.doc.item_group) 44 | .then(doc => { 45 | if (doc.parent_item_group === 'Extra') { 46 | console.log(doc.parent_item_group) 47 | frm.set_df_property('incldues_item_group', 'hidden', 0) 48 | } 49 | else { 50 | frm.doc.incldues_item_group =[] 51 | refresh_field('incldues_item_group') 52 | frm.set_df_property('incldues_item_group', 'hidden', 1) 53 | } 54 | }) 55 | } 56 | 57 | } 58 | 59 | frappe.ui.form.on('Related Item', { 60 | item: function(frm, cdt, cdn) { 61 | var child = locals[cdt][cdn]; 62 | if (child.item) { 63 | frappe.call({ 64 | method: 'getpos.getpos.hooks.item_price.get_item_price', 65 | args: { 66 | item_code: child.item 67 | }, 68 | callback: function(r) { 69 | if (r.message) { 70 | frappe.model.set_value(cdt, cdn, 'price', r.message.price_list_rate); 71 | } else { 72 | frappe.msgprint(__('No price found for item {0}', [child.item])); 73 | } 74 | } 75 | }); 76 | } 77 | } 78 | }); 79 | -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/pricing_rule.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | // License: GNU General Public License v3. See license.txt 3 | 4 | frappe.ui.form.on("Pricing Rule", { 5 | custom_send_mail: function (frm) { 6 | if (frm.doc.customer && !frm.is_dirty() ){ 7 | frappe.call({ 8 | method: "nbpos.nbpos.hooks.pricing_rule.coupon_code_email", 9 | args: { 10 | pricing_rule : frm.doc.name, 11 | customer : frm.doc.customer, 12 | discount_rate : frm.doc.rate, 13 | discount_percentage : frm.doc.discount_percentage, 14 | discount_amount : frm.doc.discount_amount, 15 | coupon_code_based : frm.doc.coupon_code_based, 16 | }, 17 | freeze: true, 18 | freeze_message: "Sending mail...", 19 | callback: function(response) { 20 | if(response.message){ 21 | for (const i of response.message) { 22 | { 23 | frappe.show_alert({ 24 | message:__('Email Sent on ' + i), 25 | indicator:'green' 26 | }, 4); 27 | } 28 | } 29 | } 30 | else { 31 | // 32 | } 33 | } 34 | }); 35 | } 36 | else{ 37 | frappe.msgprint("Form is not Saved") 38 | } 39 | 40 | }, 41 | }); 42 | 43 | -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/sales_order.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Sales Order', { 2 | hub_manager: function(frm){ 3 | if(frm.doc.hub_manager){ 4 | frappe.call({ 5 | method: "nbpos.nbpos.doctype.ward.ward.get_ward_by_hub_manager", 6 | args:{ 7 | hub_manager: frm.doc.hub_manager 8 | }, 9 | callback: (r)=> { 10 | frm.set_query('ward', () => { 11 | return { 12 | filters: { 13 | name: ['in', r.message] 14 | } 15 | } 16 | }); 17 | } 18 | }); 19 | } 20 | }, 21 | ward: function(frm){ 22 | if(frm.doc.ward){ 23 | frappe.call({ 24 | method: "nbpos.nbpos.hooks.customer.get_customer_by_ward", 25 | args:{ 26 | ward: frm.doc.ward 27 | }, 28 | callback: (r)=> { 29 | frm.set_query('customer', () => { 30 | return { 31 | filters: { 32 | name: ['in', r.message] 33 | } 34 | } 35 | }); 36 | } 37 | }); 38 | } 39 | } 40 | }); -------------------------------------------------------------------------------- /nbpos/public/js/doctype_js/warehouse.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Warehouse', { 2 | refresh: function(frm){ 3 | set_hub_manager_filter(frm); 4 | } 5 | }) 6 | 7 | function set_hub_manager_filter(frm){ 8 | frappe.db.get_list('Warehouse', { 9 | fields: ['hub_manager'], 10 | filters: { 11 | hub_manager: ["!=", ''] 12 | }, 13 | as_list: 1 14 | }).then(records => { 15 | let hub_manager_list = [] 16 | for(let i = 0; i< records.length; i++){ 17 | hub_manager_list.push(records[i].toString()) 18 | } 19 | frm.set_query('hub_manager', () => { 20 | return { 21 | filters: { 22 | hub_manager: ['not in', hub_manager_list] 23 | } 24 | } 25 | }); 26 | }) 27 | } -------------------------------------------------------------------------------- /nbpos/public/js/nbpos.js: -------------------------------------------------------------------------------- 1 | $(document).on("startup", function () { 2 | if (frappe.session.user == "user@nestorbird.com") { 3 | frappe.set_route("/app/point-of-sale") 4 | } 5 | 6 | }) -------------------------------------------------------------------------------- /nbpos/public/node_modules: -------------------------------------------------------------------------------- 1 | /home/erp_user/frappe-bench3/apps/getpos/node_modules -------------------------------------------------------------------------------- /nbpos/setupWiz.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | from nbpos.custom_api.v1.demo_data import upload_logo_and_set 4 | 5 | 6 | def run_setup_wizard(): 7 | try: 8 | upload_logo_and_set() 9 | except Exception as e: 10 | frappe.log_error(f"Error completing setup wizard: {str(e)}", "Setup Wizard Error") 11 | 12 | 13 | -------------------------------------------------------------------------------- /nbpos/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/templates/__init__.py -------------------------------------------------------------------------------- /nbpos/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/templates/pages/__init__.py -------------------------------------------------------------------------------- /nbpos/templates/pages/gift_card_template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Gift Card 7 | 63 | 64 | 65 |
66 |
67 |

Congratulations, {{ doc.customer or 'Customer' }}!

68 |

Use the following code to redeem your gift card:

69 |
{{ doc.code or 'Giftcard24' }}
70 |
71 |

Valid Upto: {{ doc.valid_upto if doc.valid_upto else 'Not specified' }}

72 |
73 |
74 | 77 |
78 | 79 | 80 | -------------------------------------------------------------------------------- /nbpos/www/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nestorbird/GETPOS/2de195e3fcac0daff31c88d82a8cacfb2e9b9b6b/nbpos/www/__init__.py -------------------------------------------------------------------------------- /nbpos/www/getpos-react.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Get POS 9 | 10 | 11 | 12 | 13 |
14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /node_modules/.vite/deps/_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "80e2e112", 3 | "configHash": "f3899e46", 4 | "lockfileHash": "e3b0c442", 5 | "browserHash": "abd81592", 6 | "optimized": {}, 7 | "chunks": {} 8 | } -------------------------------------------------------------------------------- /node_modules/.vite/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /node_modules/.yarn-integrity: -------------------------------------------------------------------------------- 1 | { 2 | "systemParams": "linux-x64-108", 3 | "modulesFolders": [ 4 | "node_modules" 5 | ], 6 | "flags": [ 7 | "checkFiles" 8 | ], 9 | "linkedModules": [], 10 | "topLevelPatterns": [], 11 | "lockfileEntries": {}, 12 | "files": [ 13 | ".vite/deps/_metadata.json", 14 | ".vite/deps/package.json" 15 | ], 16 | "artifacts": {} 17 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "getpos-react", 3 | "version": "1.0.0", 4 | "description": "

getpos-react

Simple, yet powerful POS solutions for businesses
", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "postinstall": "cd getpos-react && yarn install", 9 | "dev": "cd getpos-react && yarn dev", 10 | "build": "cd getpos-react && yarn build" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC" 15 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # frappe -- https://github.com/frappe/frappe is installed via 'bench init' -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("requirements.txt") as f: 4 | install_requires = f.read().strip().split("\n") 5 | 6 | # get version from __version__ variable in nbpos/__init__.py 7 | from nbpos import __version__ as version 8 | 9 | setup( 10 | name="nbpos", 11 | version=version, 12 | description="nbpos", 13 | author="Nestorbird", 14 | author_email="info@nestorbird.com", 15 | packages=find_packages(), 16 | zip_safe=False, 17 | include_package_data=True, 18 | install_requires=install_requires 19 | ) 20 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | --------------------------------------------------------------------------------