Merge branch 'master' into feature-case-sensitive-attribute-updates

This commit is contained in:
objecttothis
2026-04-02 15:17:02 +04:00
committed by GitHub
68 changed files with 1331 additions and 492 deletions

View File

@@ -1,23 +1,56 @@
node_modules
tmp
# Version control
.git
.gitignore
# Sensitive config (user may mount their own)
app/Config/Email.php
# Build artifacts
node_modules/
dist/
tmp/
*.patch
patches/
# IDE and editor files
.idea/
git-svn-diff.py
*.bash
.vscode/
.swp
*.swp
.buildpath
.project
.settings/*
.git
dist/
node_modules/
*.swp
.settings/
# Development tools and configs
tests/
phpunit.xml
.php-cs-fixer.*
phpstan.neon
*.bash
git-svn-diff.py
# Documentation
*.md
!LICENSE
branding/
# Build configs (not needed at runtime)
composer.json
composer.lock
package.json
package-lock.json
gulpfile.js
.env.example
.dockerignore
# Temporary and backup files
*.rej
*.orig
*~
*.~
*.log
app/writable/session/*
!app/writable/session/index.html
# CI
.github/
.github/workflows/
build/

61
.github/workflows/README.md vendored Normal file
View File

@@ -0,0 +1,61 @@
# GitHub Actions
This document describes the CI/CD workflows for OSPOS.
## Build and Release Workflow (`.github/workflows/build-release.yml`)
### Build Process
- Setup PHP 8.2 with required extensions
- Setup Node.js 20
- Install composer dependencies
- Install npm dependencies
- Build frontend assets with Gulp
### Docker Images
- Build and push `opensourcepos` Docker image for multiple architectures (linux/amd64, linux/arm64)
- On master: tagged with version and `latest`
- On other branches: tagged with version only
- Pushed to Docker Hub
### Releases
- Create distribution archives (tar.gz, zip)
- Create/update GitHub "unstable" release on master branch only
## Required Secrets
To use this workflow, you need to add the following secrets to your repository:
1. **DOCKER_USERNAME** - Docker Hub username for pushing images
2. **DOCKER_PASSWORD** - Docker Hub password/token for pushing images
### How to add secrets
1. Go to your repository on GitHub
2. Click **Settings****Secrets and variables****Actions**
3. Click **New repository secret**
4. Add `DOCKER_USERNAME` and `DOCKER_PASSWORD`
The `GITHUB_TOKEN` is automatically provided by GitHub Actions.
## Workflow Triggers
- **Push to master** - Runs build, Docker push (with `latest` tag), and release
- **Push to other branches** - Runs build and Docker push (version tag only)
- **Push tags** - Runs build and Docker push (version tag only)
- **Pull requests** - Runs build only (PHPUnit tests run in parallel via phpunit.yml)
## Existing Workflows
This repository also has these workflows:
- `.github/workflows/main.yml` - PHP linting with PHP-CS-Fixer
- `.github/workflows/phpunit.yml` - PHPUnit tests (runs on all PHP versions 8.1-8.4)
- `.github/workflows/php-linter.yml` - PHP linting
## Testing
PHPUnit tests are run separately via `.github/workflows/phpunit.yml` on every push and pull request, testing against PHP 8.1, 8.2, 8.3, and 8.4.
To test the build workflow:
1. Add the required secrets
2. Push to master or create a PR
3. Monitor the Actions tab in GitHub

218
.github/workflows/build-release.yml vendored Normal file
View File

@@ -0,0 +1,218 @@
name: Build and Release
on:
push:
branches:
- master
tags:
- '*'
pull_request:
branches:
- master
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
build:
name: Build
runs-on: ubuntu-22.04
outputs:
version: ${{ steps.version.outputs.version }}
version-tag: ${{ steps.version.outputs.version-tag }}
short-sha: ${{ steps.version.outputs.short-sha }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: intl, mbstring, mysqli, gd, bcmath, zip
coverage: none
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Get composer cache directory
run: echo "COMPOSER_CACHE_FILES_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV
- name: Cache composer dependencies
uses: actions/cache@v4
with:
path: ${{ env.COMPOSER_CACHE_FILES_DIR }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Get npm cache directory
run: echo "NPM_CACHE_DIR=$(npm config get cache)" >> $GITHUB_ENV
- name: Cache npm dependencies
uses: actions/cache@v4
with:
path: ${{ env.NPM_CACHE_DIR }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install composer dependencies
run: composer install --no-dev --optimize-autoloader
- name: Install npm dependencies
run: npm ci
- name: Install gulp globally
run: npm install -g gulp-cli
- name: Get version info
id: version
run: |
VERSION=$(grep "application_version" app/Config/App.php | sed "s/.*= '\(.*\)';/\1/g")
BRANCH=$(echo "${GITHUB_REF#refs/heads/}" | sed 's/feature\///')
TAG=$(echo "${GITHUB_TAG:-$BRANCH}" | tr '/' '-')
SHORT_SHA=$(git rev-parse --short=6 HEAD)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version-tag=$VERSION-$BRANCH-$SHORT_SHA" >> $GITHUB_OUTPUT
echo "short-sha=$SHORT_SHA" >> $GITHUB_OUTPUT
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
env:
GITHUB_TAG: ${{ github.ref_name }}
- name: Create .env file
run: |
cp .env.example .env
sed -i 's/production/development/g' .env
- name: Update commit hash
run: |
SHORT_SHA="${{ steps.version.outputs.short-sha }}"
sed -i "s/commit_sha1 = 'dev'/commit_sha1 = '$SHORT_SHA'/g" app/Config/OSPOS.php
- name: Build frontend assets
run: npm run build
- name: Create distribution archives
run: |
set -euo pipefail
gulp compress
VERSION="${{ steps.version.outputs.version }}"
SHORT_SHA="${{ steps.version.outputs.short-sha }}"
mv dist/opensourcepos.tar "dist/opensourcepos.$VERSION.$SHORT_SHA.tar"
mv dist/opensourcepos.zip "dist/opensourcepos.$VERSION.$SHORT_SHA.zip"
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: dist-${{ steps.version.outputs.short-sha }}
path: dist/
retention-days: 7
- name: Upload build context for Docker
uses: actions/upload-artifact@v4
with:
name: build-context-${{ steps.version.outputs.short-sha }}
path: |
.
!.git
!node_modules
retention-days: 1
docker:
name: Build Docker Image
runs-on: ubuntu-22.04
needs: build
if: github.event_name == 'push'
steps:
- name: Download build context
uses: actions/download-artifact@v4
with:
name: build-context-${{ needs.build.outputs.short-sha }}
path: .
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Determine Docker tags
id: tags
run: |
BRANCH=$(echo "${GITHUB_REF#refs/heads/}" | tr '/' '-')
if [ "$BRANCH" = "master" ]; then
echo "tags=${{ secrets.DOCKER_USERNAME }}/opensourcepos:${{ needs.build.outputs.version-tag }},${{ secrets.DOCKER_USERNAME }}/opensourcepos:latest" >> $GITHUB_OUTPUT
else
echo "tags=${{ secrets.DOCKER_USERNAME }}/opensourcepos:${{ needs.build.outputs.version-tag }}" >> $GITHUB_OUTPUT
fi
env:
GITHUB_REF: ${{ github.ref }}
- name: Build and push Docker images
uses: docker/build-push-action@v5
with:
context: .
target: ospos
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.tags.outputs.tags }}
release:
name: Create Release
needs: build
runs-on: ubuntu-22.04
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: dist-${{ needs.build.outputs.short-sha }}
path: dist/
- name: Get version info
id: version
run: |
VERSION="${{ needs.build.outputs.version }}"
SHORT_SHA=$(git rev-parse --short=6 HEAD)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "short-sha=$SHORT_SHA" >> $GITHUB_OUTPUT
- name: Create/Update unstable release
uses: softprops/action-gh-release@v2
with:
tag_name: unstable
name: Unstable OpenSourcePOS
body: |
This is a build of the latest master which might contain bugs. Use at your own risk.
Check the releases section for the latest official release.
files: |
dist/opensourcepos.${{ steps.version.outputs.version }}.${{ steps.version.outputs.short-sha }}.zip
prerelease: true
draft: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,71 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '21 12 * * 3'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -69,9 +69,6 @@ jobs:
- name: Install npm dependencies
run: npm install
- name: Build database.sql
run: npm run gulp build-database
- name: Start MariaDB
run: |
docker run -d --name mysql \
@@ -79,7 +76,6 @@ jobs:
-e MYSQL_DATABASE=ospos \
-e MYSQL_USER=admin \
-e MYSQL_PASSWORD=pointofsale \
-v $PWD/app/Database/database.sql:/docker-entrypoint-initdb.d/database.sql \
-p 3306:3306 \
mariadb:10.5
# Wait for MariaDB to be ready

View File

@@ -1,54 +0,0 @@
sudo: required
branches:
except:
- unstable
- weblate
services:
- docker
dist: jammy
language: node_js
node_js:
- 20
script:
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- docker run --rm -u $(id -u) -v $(pwd):/app opensourcepos/composer:ci4 composer install
- version=$(grep application_version app/Config/App.php | sed "s/.*=\s'\(.*\)';/\1/g")
- cp .env.example .env && sed -i 's/production/development/g' .env
- sed -i "s/commit_sha1 = 'dev'/commit_sha1 = '$rev'/g" app/Config/OSPOS.php
- echo "$version-$branch-$rev"
- npm version "$version-$branch-$rev" --force || true
- sed -i 's/opensourcepos.tar.gz/opensourcepos.$version.tgz/g' package.json
- npm ci && npm install -g gulp && npm run build
- docker build . --target ospos -t ospos
- docker build . --target ospos_test -t ospos_test
- docker run --rm ospos_test /app/vendor/bin/phpunit --testdox
- docker build app/Database/ -t "jekkos/opensourcepos:sql-$TAG"
env:
global:
- BRANCH=$(echo ${TRAVIS_BRANCH} | sed s/feature\\///)
- TAG=$(echo "${TRAVIS_TAG:-$BRANCH}" | tr '/' '-')
- date=`date +%Y%m%d%H%M%S` && branch=${TRAVIS_BRANCH} && rev=`git rev-parse --short=6 HEAD`
after_success:
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" && docker tag "ospos:latest"
"jekkos/opensourcepos:$TAG" && docker push "jekkos/opensourcepos:$TAG" && docker push "jekkos/opensourcepos:sql-$TAG"
- gulp compress
- mv dist/opensourcepos.tar.gz "dist/opensourcepos.$version.$rev.tgz"
- mv dist/opensourcepos.zip "dist/opensourcepos.$version.$rev.zip"
deploy:
- provider: releases
edge: true
file: dist/opensourcepos.$version.$rev.zip
name: "Unstable OpensourcePos"
overwrite: true
release_notes: "This is a build of the latest master which might contain bugs. Use at your own risk. Check releases section for the latest official release"
prerelease: true
tag_name: unstable
user: jekkos
api_key:
secure: "KOukL8IFf/uL/BjMyCSKjf2vylydjcWqgEx0eMqFCg3nZ4ybMaOwPORRthIfyT72/FvGX/aoxxEn0uR/AEtb+hYQXHmNS+kZdX72JCe8LpGuZ7FJ5X+Eo9mhJcsmS+smd1sC95DySSc/GolKPo+0WtJYONY/xGCLxm+9Ay4HREg="
on:
branch: master

View File

@@ -1,28 +1,22 @@
FROM php:8.2-apache AS ospos
LABEL maintainer="jekkos"
RUN apt update && apt-get install -y libicu-dev libgd-dev
RUN a2enmod rewrite
RUN docker-php-ext-install mysqli bcmath intl gd
RUN apt-get update && apt-get install -y --no-install-recommends \
libicu-dev \
libgd-dev \
&& docker-php-ext-install mysqli bcmath intl gd \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& a2enmod rewrite
RUN echo "date.timezone = \"\${PHP_TIMEZONE}\"" > /usr/local/etc/php/conf.d/timezone.ini
WORKDIR /app
COPY . /app
RUN ln -s /app/*[^public] /var/www && rm -rf /var/www/html && ln -nsf /app/public /var/www/html
RUN chmod -R 770 /app/writable/uploads /app/writable/logs /app/writable/cache && chown -R www-data:www-data /app
FROM ospos AS ospos_test
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt-get install -y libzip-dev wget git
RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -O /bin/wait-for-it.sh && chmod +x /bin/wait-for-it.sh
RUN docker-php-ext-install zip
RUN composer install -d/app
#RUN sed -i 's/backupGlobals="true"/backupGlobals="false"/g' /app/tests/phpunit.xml
WORKDIR /app/tests
CMD ["/app/vendor/phpunit/phpunit/phpunit", "/app/test/helpers"]
COPY --chown=www-data:www-data . /app
RUN chmod 770 /app/writable/uploads /app/writable/logs /app/writable/cache \
&& ln -s /app/*[^public] /var/www \
&& rm -rf /var/www/html \
&& ln -nsf /app/public /var/www/html
FROM ospos AS ospos_dev

View File

@@ -38,20 +38,21 @@ FORCE_HTTPS = true
## Local install
First of all, if you're seeing the message `system folder missing` after launching your browser, or cannot find `database.sql`, that most likely means you have cloned the repository and have not built the project. To build the project from a source commit point instead of from an official release check out [Building OSPOS](BUILD.md). Otherwise, continue with the following steps.
First of all, if you're seeing the message `system folder missing` after launching your browser, that most likely means you have cloned the repository and have not built the project. To build the project from a source commit point instead of from an official release check out [Building OSPOS](BUILD.md). Otherwise, continue with the following steps.
1. Download the a [pre-release for a specific branch](https://github.com/opensourcepos/opensourcepos/releases) or the latest stable [from GitHub here](https://github.com/opensourcepos/opensourcepos/releases). A repository clone will not work unless know how to build the project.
2. Create/locate a new MySQL database to install Open Source Point of Sale into.
3. Execute the file `app/Database/database.sql` to create the tables needed.
4. Unzip and upload Open Source Point of Sale files to the web-server.
5. Open `.env` file and modify credentials to connect to your database if needed. (First copy .env.example to .env and update)
3. Unzip and upload Open Source Point of Sale files to the web-server.
4. If `.env` does not exist, copy `.env.example` to `.env`.
5. Open `.env` and modify credentials to connect to your database if needed.
6. The database schema will be automatically created when you first access the application. Migrations run automatically on fresh installs.
7. Go to your install `public` dir via the browser.
8. Log in using
- Username: admin
- Password: pointofsale
9. If everything works, then set the `CI_ENVIRONMENT` variable to `production` in the .env file
9. Enjoy!
10. Oops, an issue? Please make sure you read the FAQ, wiki page, and you checked open and closed issues on GitHub. PHP `display_errors` is disabled by default. Create an` app/Config/.env` file from the `.env.example` to enable it in a development environment.
10. Enjoy!
11. Oops, an issue? Please make sure you read the FAQ, wiki page, and you checked open and closed issues on GitHub. PHP `display_errors` is disabled by default. Create an` app/Config/.env` file from the `.env.example` to enable it in a development environment.
## Local install using Docker

View File

@@ -8,7 +8,7 @@
</p>
<p align="center">
<a href="https://app.travis-ci.com/opensourcepos/opensourcepos" target="_blank"><img src="https://api.travis-ci.com/opensourcepos/opensourcepos.svg?branch=master" alt="Build Status"></a>
<a href="https://github.com/opensourcepos/opensourcepos/actions/workflows/build-release.yml" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/actions/workflows/build-release.yml/badge.svg" alt="Build Status"></a>
<a href="https://app.gitter.im/#/room/#opensourcepos_Lobby:gitter.im?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge" target="_blank"><img src="https://badges.gitter.im/jekkos/opensourcepos.svg" alt="Join the chat at https://app.gitter.im"></a>
<a href="https://badge.fury.io/gh/opensourcepos%2Fopensourcepos" target="_blank"><img src="https://badge.fury.io/gh/opensourcepos%2Fopensourcepos.svg" alt="Project Version"></a>
<a href="https://translate.opensourcepos.org/engage/opensourcepos/?utm_source=widget" target="_blank"><img src="https://translate.opensourcepos.org/widgets/opensourcepos/-/svg-badge.svg" alt="Translation Status"></a>
@@ -137,7 +137,7 @@ Any person or company found breaching the license agreement might find a bunch o
## 🙏 Credits
| <div align="center">DigitalOcean</div> | <div align="center">JetBrains</div> | <div align="center">Travis CI</div> |
| <div align="center">DigitalOcean</div> | <div align="center">JetBrains</div> | <div align="center">GitHub</div> |
| --- | --- | --- |
| <div align="center"><a href="https://www.digitalocean.com?utm_medium=opensource&utm_source=opensourcepos" target="_blank"><img src="https://github.com/user-attachments/assets/fbbf7433-ed35-407d-8946-fd03d236d350" alt="DigitalOcean Logo" height="50"></a></div> | <div align="center"><a href="https://www.jetbrains.com/idea/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/187f9bbe-4484-475c-9b58-5e5d5f931f09" alt="IntelliJ IDEA Logo" height="50"></a></div> | <div align="center"><a href="https://www.travis-ci.com/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/71cc2b44-83af-4510-a543-6358285f43c6" alt="Travis CI Logo" height="50"></a></div> |
| Many thanks to [DigitalOcean](https://www.digitalocean.com) for providing the project with hosting credits. | Many thanks to [JetBrains](https://www.jetbrains.com/) for providing a free license of [IntelliJ IDEA](https://www.jetbrains.com/idea/) to kindly support the development of OSPOS. | Many thanks to [Travis CI](https://www.travis-ci.com/) for providing a free continuous integration service for open source projects. |
| <div align="center"><a href="https://www.digitalocean.com?utm_medium=opensource&utm_source=opensourcepos" target="_blank"><img src="https://github.com/user-attachments/assets/fbbf7433-ed35-407d-8946-fd03d236d350" alt="DigitalOcean Logo" height="50"></a></div> | <div align="center"><a href="https://www.jetbrains.com/idea/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/187f9bbe-4484-475c-9b58-5e5d5f931f09" alt="IntelliJ IDEA Logo" height="50"></a></div> | <div align="center"><a href="https://github.com/features/actions" target="_blank"><img src="https://github.githubassets.com/images/modules/site/icons/eyebrow-panel/actions-icon.svg" alt="GitHub Actions Logo" height="50"></a></div> |
| Many thanks to [DigitalOcean](https://www.digitalocean.com) for providing the project with hosting credits. | Many thanks to [JetBrains](https://www.jetbrains.com/) for providing a free license of [IntelliJ IDEA](https://www.jetbrains.com/idea/) to kindly support the development of OSPOS. | Many thanks to [GitHub](https://github.com) for providing free continuous integration via GitHub Actions for open-source projects. |

View File

@@ -786,8 +786,8 @@ class Sales extends Secure_Controller
$data['error_message'] = lang('Sales.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
return view('sales/' . $invoice_view, $data);
$this->sale_lib->clear_all();
return view('sales/' . $invoice_view, $data);
}
}
} elseif ($this->sale_lib->is_work_order_mode()) {
@@ -820,9 +820,8 @@ class Sales extends Secure_Controller
$data['barcode'] = null;
return view('sales/work_order', $data);
$this->sale_lib->clear_mode();
$this->sale_lib->clear_all();
return view('sales/work_order', $data);
}
} elseif ($this->sale_lib->is_quote_mode()) {
$data['sales_quote'] = lang('Sales.quote');
@@ -848,9 +847,8 @@ class Sales extends Secure_Controller
$data['cart'] = $this->sale_lib->sort_and_filter_cart($data['cart']);
$data['barcode'] = null;
return view('sales/quote', $data);
$this->sale_lib->clear_mode();
$this->sale_lib->clear_all();
return view('sales/quote', $data);
}
} else {
// Save the data to the sales table
@@ -871,8 +869,8 @@ class Sales extends Secure_Controller
$data['error_message'] = lang('Sales.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
return view('sales/receipt', $data);
$this->sale_lib->clear_all();
return view('sales/receipt', $data);
}
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Migration_Initial_Schema extends Migration
{
public function __construct()
{
parent::__construct();
}
/**
* Perform a migration step.
* Only runs on fresh installs - skips if database already has tables.
*
* For testing: CI4's DatabaseTestTrait with $refresh=true handles table
* cleanup/creation automatically. This migration only loads initial schema
* on fresh databases where no application tables exist.
*/
public function up(): void
{
// Check if core application tables exist (existing install)
// Note: migrations table may exist even on fresh DB due to migration tracking
$tables = $this->db->listTables();
// Check for a core application table, not just migrations table
foreach ($tables as $table) {
// Strip prefix if present for comparison
$tableName = str_replace($this->db->getPrefix(), '', $table);
if (in_array($tableName, ['app_config', 'items', 'employees', 'people'])) {
// Database already populated - skip initial schema
// This is an existing installation upgrading from older version
return;
}
}
// Fresh install - load initial schema
helper('migration');
execute_script(APPPATH . 'Database/Migrations/sqlscripts/initial_schema.sql');
}
/**
* Revert a migration step.
* Cannot revert initial schema - would lose all data.
*/
public function down(): void
{
// Cannot safely revert initial schema
// Would require dropping all tables which would lose all data
$this->db->query('SET FOREIGN_KEY_CHECKS = 0');
foreach ($this->db->listTables() as $table) {
$this->db->query('DROP TABLE IF EXISTS `' . $table . '`');
}
$this->db->query('SET FOREIGN_KEY_CHECKS = 1');
}
}

View File

@@ -730,3 +730,148 @@ CREATE TABLE `ospos_suppliers` (
--
-- Dumping data for table `ospos_suppliers`
--
--
-- Constraints for dumped tables
--
--
-- Constraints for table `ospos_customers`
--
ALTER TABLE `ospos_customers`
ADD CONSTRAINT `ospos_customers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_employees`
--
ALTER TABLE `ospos_employees`
ADD CONSTRAINT `ospos_employees_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_inventory`
--
ALTER TABLE `ospos_inventory`
ADD CONSTRAINT `ospos_inventory_ibfk_1` FOREIGN KEY (`trans_items`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_2` FOREIGN KEY (`trans_user`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_3` FOREIGN KEY (`trans_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_items`
--
ALTER TABLE `ospos_items`
ADD CONSTRAINT `ospos_items_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_items_taxes`
--
ALTER TABLE `ospos_items_taxes`
ADD CONSTRAINT `ospos_items_taxes_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_item_kit_items`
--
ALTER TABLE `ospos_item_kit_items`
ADD CONSTRAINT `ospos_item_kit_items_ibfk_1` FOREIGN KEY (`item_kit_id`) REFERENCES `ospos_item_kits` (`item_kit_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_item_kit_items_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_permissions`
--
ALTER TABLE `ospos_permissions`
ADD CONSTRAINT `ospos_permissions_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `ospos_modules` (`module_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_permissions_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_grants`
--
ALTER TABLE `ospos_grants`
ADD CONSTRAINT `ospos_grants_ibfk_1` foreign key (`permission_id`) references `ospos_permissions` (`permission_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_grants_ibfk_2` foreign key (`person_id`) references `ospos_employees` (`person_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_receivings`
--
ALTER TABLE `ospos_receivings`
ADD CONSTRAINT `ospos_receivings_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_receivings_ibfk_2` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_receivings_items`
--
ALTER TABLE `ospos_receivings_items`
ADD CONSTRAINT `ospos_receivings_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_receivings_items_ibfk_2` FOREIGN KEY (`receiving_id`) REFERENCES `ospos_receivings` (`receiving_id`);
--
-- Constraints for table `ospos_sales`
--
ALTER TABLE `ospos_sales`
ADD CONSTRAINT `ospos_sales_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_items`
--
ALTER TABLE `ospos_sales_items`
ADD CONSTRAINT `ospos_sales_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_items_taxes`
--
ALTER TABLE `ospos_sales_items_taxes`
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`,`item_id`,`line`) REFERENCES `ospos_sales_items` (`sale_id`,`item_id`,`line`),
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_payments`
--
ALTER TABLE `ospos_sales_payments`
ADD CONSTRAINT `ospos_sales_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`);
--
-- Constraints for table `ospos_sales_suspended`
--
ALTER TABLE `ospos_sales_suspended`
ADD CONSTRAINT `ospos_sales_suspended_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_suspended_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_suspended_items`
--
ALTER TABLE `ospos_sales_suspended_items`
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_suspended_items_taxes`
--
ALTER TABLE `ospos_sales_suspended_items_taxes`
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`,`item_id`,`line`) REFERENCES `ospos_sales_suspended_items` (`sale_id`,`item_id`,`line`),
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_suspended_payments`
--
ALTER TABLE `ospos_sales_suspended_payments`
ADD CONSTRAINT `ospos_sales_suspended_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`);
--
-- Constraints for table `ospos_item_quantities`
--
ALTER TABLE `ospos_item_quantities`
ADD CONSTRAINT `ospos_item_quantities_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_item_quantities_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_suppliers`
--
ALTER TABLE `ospos_suppliers`
ADD CONSTRAINT `ospos_suppliers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_giftcards`
--
ALTER TABLE `ospos_giftcards`
ADD CONSTRAINT `ospos_giftcards_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);

View File

@@ -1,145 +0,0 @@
--
-- Constraints for dumped tables
--
--
-- Constraints for table `ospos_customers`
--
ALTER TABLE `ospos_customers`
ADD CONSTRAINT `ospos_customers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_employees`
--
ALTER TABLE `ospos_employees`
ADD CONSTRAINT `ospos_employees_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_inventory`
--
ALTER TABLE `ospos_inventory`
ADD CONSTRAINT `ospos_inventory_ibfk_1` FOREIGN KEY (`trans_items`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_2` FOREIGN KEY (`trans_user`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_3` FOREIGN KEY (`trans_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_items`
--
ALTER TABLE `ospos_items`
ADD CONSTRAINT `ospos_items_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_items_taxes`
--
ALTER TABLE `ospos_items_taxes`
ADD CONSTRAINT `ospos_items_taxes_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_item_kit_items`
--
ALTER TABLE `ospos_item_kit_items`
ADD CONSTRAINT `ospos_item_kit_items_ibfk_1` FOREIGN KEY (`item_kit_id`) REFERENCES `ospos_item_kits` (`item_kit_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_item_kit_items_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_permissions`
--
ALTER TABLE `ospos_permissions`
ADD CONSTRAINT `ospos_permissions_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `ospos_modules` (`module_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_permissions_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_grants`
--
ALTER TABLE `ospos_grants`
ADD CONSTRAINT `ospos_grants_ibfk_1` foreign key (`permission_id`) references `ospos_permissions` (`permission_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_grants_ibfk_2` foreign key (`person_id`) references `ospos_employees` (`person_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_receivings`
--
ALTER TABLE `ospos_receivings`
ADD CONSTRAINT `ospos_receivings_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_receivings_ibfk_2` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_receivings_items`
--
ALTER TABLE `ospos_receivings_items`
ADD CONSTRAINT `ospos_receivings_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_receivings_items_ibfk_2` FOREIGN KEY (`receiving_id`) REFERENCES `ospos_receivings` (`receiving_id`);
--
-- Constraints for table `ospos_sales`
--
ALTER TABLE `ospos_sales`
ADD CONSTRAINT `ospos_sales_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_items`
--
ALTER TABLE `ospos_sales_items`
ADD CONSTRAINT `ospos_sales_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_items_taxes`
--
ALTER TABLE `ospos_sales_items_taxes`
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`,`item_id`,`line`) REFERENCES `ospos_sales_items` (`sale_id`,`item_id`,`line`),
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_payments`
--
ALTER TABLE `ospos_sales_payments`
ADD CONSTRAINT `ospos_sales_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`);
--
-- Constraints for table `ospos_sales_suspended`
--
ALTER TABLE `ospos_sales_suspended`
ADD CONSTRAINT `ospos_sales_suspended_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_suspended_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_suspended_items`
--
ALTER TABLE `ospos_sales_suspended_items`
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_suspended_items_taxes`
--
ALTER TABLE `ospos_sales_suspended_items_taxes`
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`,`item_id`,`line`) REFERENCES `ospos_sales_suspended_items` (`sale_id`,`item_id`,`line`),
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_suspended_payments`
--
ALTER TABLE `ospos_sales_suspended_payments`
ADD CONSTRAINT `ospos_sales_suspended_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`);
--
-- Constraints for table `ospos_item_quantities`
--
ALTER TABLE `ospos_item_quantities`
ADD CONSTRAINT `ospos_item_quantities_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_item_quantities_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_suppliers`
--
ALTER TABLE `ospos_suppliers`
ADD CONSTRAINT `ospos_suppliers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_giftcards`
--
ALTER TABLE `ospos_giftcards`
ADD CONSTRAINT `ospos_giftcards_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);

View File

@@ -4,6 +4,8 @@ namespace App\Events;
use App\Libraries\MY_Migration;
use App\Models\Appconfig;
use CodeIgniter\Session\Handlers\DatabaseHandler;
use CodeIgniter\Session\Handlers\FileHandler;
use CodeIgniter\Session\Session;
use Config\OSPOS;
use Config\Services;
@@ -28,7 +30,8 @@ class Load_config
$migration_config = config('Migrations');
$migration = new MY_Migration($migration_config);
$this->session = session();
// Use file-based session until database is migrated
$this->session = $this->createSession($migration->is_latest());
// Database Configuration
$config = config(OSPOS::class);
@@ -53,4 +56,28 @@ class Load_config
bcscale(max(2, totals_decimals() + tax_decimals()));
}
/**
* Creates session with appropriate handler.
* Uses file-based session until database is migrated, then switches to database session.
*
* This prevents a circular dependency where login requires session, but the sessions
* database table doesn't exist yet because migrations run after login.
*/
private function createSession(bool $isDbMigrated): Session
{
$sessionConfig = config('Session');
// If database is not migrated and we're configured to use database sessions,
// temporarily fall back to file-based sessions to allow migrations to complete.
// Once migrations run, the user must re-authenticate (session is destroyed in
// load_config() when migrations are pending).
if (!$isDbMigrated && $sessionConfig->driver === DatabaseHandler::class) {
$sessionConfig = clone $sessionConfig;
$sessionConfig->driver = FileHandler::class;
$sessionConfig->savePath = WRITEPATH . 'session';
}
return Services::session($sessionConfig);
}
}

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "أحد",
"mo" => "اثنين",
"tu" => "ثلاثاء",
"we" => "أربعاء",
"th" => "خميس",
"fr" => "جمعة",
"sa" => "سبت",
"sun" => "الأحد",
"mon" => "الاثنين",
"tue" => "الثلاثاء",
"wed" => "الأربعاء",
"thu" => "الخميس",
"fri" => "الجمعة",
"sat" => "السبت",
"sunday" => "الأحد",
"monday" => "الاثنين",
"tuesday" => "الثلاثاء",
"wednesday" => "الأربعاء",
"thursday" => "الخميس",
"friday" => "الجمعة",
"saturday" => "السبت",
"jan" => "يناير",
"feb" => "فبراير",
"mar" => "مارس",
"apr" => "أبريل",
"may" => "مايو",
"jun" => "يونيو",
"jul" => "يوليو",
"aug" => "أغسطس",
"sep" => "سبتمبر",
"oct" => "أكتوبر",
"nov" => "نوفمبر",
"dec" => "ديسمبر",
"january" => "يناير",
"february" => "فبراير",
"march" => "مارس",
"april" => "أبريل",
"mayl" => "مايو",
"june" => "يونيو",
"july" => "يوليو",
"august" => "أغسطس",
"september" => "سبتمبر",
"october" => "أكتوبر",
"november" => "نوفمبر",
"december" => "ديسمبر",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "So",
"mo" => "Mo",
"tu" => "Di",
"we" => "Mi",
"th" => "Do",
"fr" => "Fr",
"sa" => "Sa",
"sun" => "Son",
"mon" => "Mon",
"tue" => "Die",
"wed" => "Mit",
"thu" => "Don",
"fri" => "Fre",
"sat" => "Sam",
"sunday" => "Sonntag",
"monday" => "Montag",
"tuesday" => "Dienstag",
"wednesday" => "Mittwoch",
"thursday" => "Donnerstag",
"friday" => "Freitag",
"saturday" => "Samstag",
"jan" => "Jan",
"feb" => "Feb",
"mar" => "Mär",
"apr" => "Apr",
"may" => "Mai",
"jun" => "Jun",
"jul" => "Jul",
"aug" => "Aug",
"sep" => "Sep",
"oct" => "Okt",
"nov" => "Nov",
"dec" => "Dez",
"january" => "Januar",
"february" => "Februar",
"march" => "März",
"april" => "April",
"mayl" => "Mai",
"june" => "Juni",
"july" => "Juli",
"august" => "August",
"september" => "September",
"october" => "Oktober",
"november" => "November",
"december" => "Dezember",
];

View File

@@ -3,18 +3,18 @@
return [
"address_1" => "Adresse 1",
"address_2" => "Adresse 2",
"admin" => "",
"admin" => "Administrator",
"city" => "Stadt",
"clerk" => "",
"clerk" => "Angestellter",
"close" => "Schließen",
"color" => "",
"color" => "Theme-Farben",
"comments" => "Kommentare",
"common" => "Allgemein",
"confirm_search" => "Sie haben eine oder mehrere Zeilen gewählt. Nach der Verarbeitung werden diese nicht mehr ausgewählt sein. Wollen Sie die Suche dennoch verarbeiten?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Bitte korrigieren Sie vor dem Speichern die angezeigten Fehler",
"country" => "Land",
"dashboard" => "",
"dashboard" => "Dashboard",
"date" => "Datum",
"delete" => "Löschen",
"det" => "Details",
@@ -26,15 +26,15 @@ return [
"export_csv_no" => "Nein",
"export_csv_yes" => "Ja",
"fields_required_message" => "Die Felder in rot sind erforderlich",
"fields_required_message_unique" => "",
"fields_required_message_unique" => "Die rot markierten Felder sind erforderlich und müssen eindeutig sein",
"first_name" => "Vorname",
"first_name_required" => "Vorname ist erforderlich.",
"first_page" => "Erste",
"gender" => "Geschlecht",
"gender_female" => "W",
"gender_male" => "M",
"gender_undefined" => "",
"icon" => "",
"gender_undefined" => "Undefiniert",
"icon" => "Symbol",
"id" => "ID",
"import" => "Import",
"import_change_file" => "Ändern",
@@ -48,21 +48,21 @@ return [
"last_page" => "Letzte",
"learn_about_project" => "für neueste Nachrichten zum Projekt.",
"list_of" => "Liste von",
"logo" => "",
"logo_mark" => "",
"logo" => "Logo",
"logo_mark" => "Marke",
"logout" => "Ausloggen",
"manager" => "",
"manager" => "Manager",
"migration_needed" => "Eine Datenbankmigration auf {0} wird nach der Anmeldung gestartet.",
"new" => "Neu",
"no" => "",
"no" => "Nein",
"no_persons_to_display" => "Keine Personen zum Anzeigen.",
"none_selected_text" => "[auswählen]",
"or" => "Oder",
"people" => "",
"people" => "Personen",
"phone_number" => "Telefon",
"phone_number_required" => "Telefon ist erforderlich",
"please_visit_my" => "Bitte beuschen Sie",
"position" => "",
"position" => "Position",
"powered_by" => "Unterstützt von",
"price" => "Preis",
"print" => "Drucken",
@@ -73,8 +73,8 @@ return [
"search" => "Suche",
"search_options" => "Suchkriterien",
"searched_for" => "Gescuht nach",
"software_short" => "",
"software_title" => "",
"software_short" => "OSPOS",
"software_title" => "Open Source Point of Sale",
"state" => "BL/Kanton",
"submit" => "Senden",
"total_spent" => "Gesamtausgaben",
@@ -83,7 +83,7 @@ return [
"website" => "Website",
"welcome" => "Willkommen",
"welcome_message" => "Willkommen bei OSPOS, zum Beginnen auf ein Modul klicken.",
"yes" => "",
"yes" => "Ja",
"you_are_using_ospos" => "Sie verwenden Open Source Point Of Sale Version",
"zip" => "PLZ",
];

View File

@@ -1,26 +1,26 @@
<?php
return [
"administrator" => "",
"administrator" => "Administrator",
"basic_information" => "Mitarbeiter-Information",
"cannot_be_deleted" => "Konnte gewählten Mitarbeiter nicht löschen, einer oder mehrere weisen Verkäufe aus.",
"change_employee" => "",
"change_employee" => "Mitarbeiter ändern",
"change_password" => "Passwort Ändern",
"clerk" => "",
"commission" => "",
"clerk" => "Angestellter",
"commission" => "Provision",
"confirm_delete" => "Wollen Sie diesen Mitarbeiter wirklich löschen?",
"confirm_restore" => "Möchten Sie die ausgewählten Mitarbeiter wiederherstellen?",
"current_password" => "Aktuelles Passwort",
"current_password_invalid" => "Aktuelles Passwort ist ungültig.",
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "Sie können keinen Administrator löschen.",
"error_updating_admin" => "Sie können keinen Administrator ändern.",
"error_deleting_demo_admin" => "Sie können den Demo-Administrator nicht löschen.",
"error_updating_demo_admin" => "Sie können den Demo-Administrator nicht verändern.",
"language" => "Sprache",
"login_info" => "Mitarbeiter Login",
"manager" => "",
"manager" => "Manager",
"new" => "Neuer Mitarbeiter",
"none_selected" => "Sie haben keine Mitarbeiter zum Löschen gewählt.",
"one_or_multiple" => "Mitarbeiter",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Der Großhandelspreis ist ein Pflichtfeld.",
"count" => "Ändere Bestand",
"csv_import_failed" => "CSV Import fehlgeschlagen",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Ungültige Lagerorte gefunden: {0}. Nur gültige Lagerorte sind erlaubt.",
"csv_import_nodata_wrongformat" => "Die hochgeladene Datei enthält keine Daten oder ist falsch formatiert.",
"csv_import_partially_failed" => "{0} Artikel-Import Fehler in Zeile: {1}. Keine Reihen wurden importiert.",
"csv_import_success" => "Artikelimport erfolgreich.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Punkte eingelöst",
"work_orders" => "Arbeitsaufträge",
"zero_and_less" => "Null und weniger",
"toggle_cost_and_profit" => "Kosten & Gewinn umschalten",
];

View File

@@ -222,4 +222,8 @@ return [
"work_order_number_duplicate" => "Arbeitsauftragsnummer muss eindeutig sein.",
"work_order_sent" => "Arbeitsauftrag gesendet an",
"work_order_unsent" => "Der Arbeitsauftrag konnte nicht gesendet werden an",
"sale_not_found" => "Verkauf nicht gefunden",
"ubl_invoice" => "UBL-Rechnung",
"download_ubl" => "UBL-Rechnung herunterladen",
"ubl_generation_failed" => "UBL-Rechnung konnte nicht erstellt werden",
];

View File

@@ -9,6 +9,9 @@ return [
"login" => "Login",
"logout" => "Logout",
"migration_needed" => "A database migration to {0} will start after login.",
"migration_required" => "Database Migration Required",
"migration_auth_message" => "Administrator credentials are required to authorize the database migration to version {0}. Please login to proceed.",
"migration_complete_redirect" => "Migration complete. Redirecting to login...",
"password" => "Password",
"required_username" => "The username field is required.",
"username" => "Username",

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "Do",
"mo" => "Lu",
"tu" => "Ma",
"we" => "Mi",
"th" => "Ju",
"fr" => "Vi",
"sa" => "",
"sun" => "Dom",
"mon" => "Lun",
"tue" => "Mar",
"wed" => "Mié",
"thu" => "Jue",
"fri" => "Vie",
"sat" => "Sáb",
"sunday" => "Domingo",
"monday" => "Lunes",
"tuesday" => "Martes",
"wednesday" => "Miércoles",
"thursday" => "Jueves",
"friday" => "Viernes",
"saturday" => "Sábado",
"jan" => "Ene",
"feb" => "Feb",
"mar" => "Mar",
"apr" => "Abr",
"may" => "May",
"jun" => "Jun",
"jul" => "Jul",
"aug" => "Ago",
"sep" => "Sep",
"oct" => "Oct",
"nov" => "Nov",
"dec" => "Dic",
"january" => "Enero",
"february" => "Febrero",
"march" => "Marzo",
"april" => "Abril",
"mayl" => "Mayo",
"june" => "Junio",
"july" => "Julio",
"august" => "Agosto",
"september" => "Septiembre",
"october" => "Octubre",
"november" => "Noviembre",
"december" => "Diciembre",
];

View File

@@ -14,8 +14,8 @@ return [
"current_password_invalid" => "Contraseña Actual Inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Error al agregar/actualizar empleado.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "No puedes eliminar un usuario administrador.",
"error_updating_admin" => "No puedes modificar un usuario administrador.",
"error_deleting_demo_admin" => "No puedes borrar el usuario admin del demo.",
"error_updating_demo_admin" => "No puedes cambiar el usuario admin del demo.",
"language" => "Idioma",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Precio al Por Mayor es un campo requerido.",
"count" => "Actualizar Inventario",
"csv_import_failed" => "Falló la importación de Hoja de Cálculo",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Ubicación(es) de stock inválida(s) encontrada(s): {0}. Solo ubicaciones de stock válidas son permitidas.",
"csv_import_nodata_wrongformat" => "El archivo subido no tiene datos o el formato es incorrecto.",
"csv_import_partially_failed" => "Hubo {0} falla(s) en la importación de producto(s) en la(s) línea(s): {1}. Ninguna fila ha sido importada.",
"csv_import_success" => "Se importaron los articulos exitosamente.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Puntos usados",
"work_orders" => "Ordenes",
"zero_and_less" => "Cero y negativos",
"toggle_cost_and_profit" => "Alternar Costo y Ganancia",
];

View File

@@ -222,5 +222,9 @@ return [
"work_order_number_duplicate" => "El numero de orden de trabajo debe ser unico.",
"work_order_sent" => "Orden de trabajo enviada a",
"work_order_unsent" => "Orden de trabajo fallida al enviar a",
"sale_not_found" => "Venta no encontrada",
"ubl_invoice" => "Factura UBL",
"download_ubl" => "Descargar Factura UBL",
"ubl_generation_failed" => "Error al generar la factura UBL",
"selected_customer" => "Cliente seleccionado",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "Do",
"mo" => "Lu",
"tu" => "Ma",
"we" => "Mi",
"th" => "Ju",
"fr" => "Vi",
"sa" => "",
"sun" => "Dom",
"mon" => "Lun",
"tue" => "Mar",
"wed" => "Mié",
"thu" => "Jue",
"fri" => "Vie",
"sat" => "Sáb",
"sunday" => "Domingo",
"monday" => "Lunes",
"tuesday" => "Martes",
"wednesday" => "Miércoles",
"thursday" => "Jueves",
"friday" => "Viernes",
"saturday" => "Sábado",
"jan" => "Ene",
"feb" => "Feb",
"mar" => "Mar",
"apr" => "Abr",
"may" => "May",
"jun" => "Jun",
"jul" => "Jul",
"aug" => "Ago",
"sep" => "Sep",
"oct" => "Oct",
"nov" => "Nov",
"dec" => "Dic",
"january" => "Enero",
"february" => "Febrero",
"march" => "Marzo",
"april" => "Abril",
"mayl" => "Mayo",
"june" => "Junio",
"july" => "Julio",
"august" => "Agosto",
"september" => "Septiembre",
"october" => "Octubre",
"november" => "Noviembre",
"december" => "Diciembre",
];

View File

@@ -3,18 +3,18 @@
return [
"address_1" => "Adresse 1",
"address_2" => "Adresse 2",
"admin" => "",
"admin" => "Administrateur",
"city" => "Ville",
"clerk" => "",
"clerk" => "Employé",
"close" => "Fermer",
"color" => "",
"color" => "Couleurs du thème",
"comments" => "Commentaires",
"common" => "commun",
"confirm_search" => "Vous avez sélectionné une ou plusieurs lignes, celles-ci ne seront plus sélectionnées après votre recherche. Voulez-vous continuer ?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Merci de corriger les erreurs identifiées avant d'enregistrer",
"country" => "Pays",
"dashboard" => "",
"dashboard" => "Tableau de bord",
"date" => "Date",
"delete" => "Supprimer",
"det" => "détails",
@@ -26,14 +26,14 @@ return [
"export_csv_no" => "Non",
"export_csv_yes" => "Oui",
"fields_required_message" => "Les champs en rouge sont requis",
"fields_required_message_unique" => "",
"fields_required_message_unique" => "Les champs en rouge sont requis et doivent être uniques",
"first_name" => "Prénom",
"first_name_required" => "Le prénom est requis.",
"first_page" => "Premier",
"gender" => "Genre",
"gender_female" => "F",
"gender_male" => "M",
"gender_undefined" => "",
"gender_undefined" => "Non défini",
"icon" => "Icône",
"id" => "Identifiant",
"import" => "Importation",
@@ -51,18 +51,18 @@ return [
"logo" => "Logo",
"logo_mark" => "Marque",
"logout" => "Déconnexion",
"manager" => "",
"manager" => "Gestionnaire",
"migration_needed" => "Une migration de la base de donnée vers {0} démarrera après le connexion.",
"new" => "Nouveau",
"no" => "Oui",
"no" => "Non",
"no_persons_to_display" => "Il n'y a personne à afficher.",
"none_selected_text" => "[Sélectionner]",
"or" => "OU",
"people" => "",
"people" => "Personnes",
"phone_number" => "Téléphone",
"phone_number_required" => "Le numéro de téléphone est requis.",
"please_visit_my" => "SVP visitez le",
"position" => "",
"position" => "Position",
"powered_by" => "Propulsé par",
"price" => "Prix",
"print" => "Imprimer",

View File

@@ -1,26 +1,26 @@
<?php
return [
"administrator" => "",
"administrator" => "Administrateur",
"basic_information" => "Fiche",
"cannot_be_deleted" => "Impossible de supprimer le(s) employé(s) sélectionné(s),car un ou plusieur a éffectué une vente, ou car vous essayez de vous supprimer vous-meme.",
"change_employee" => "",
"change_employee" => "Changer d'employé",
"change_password" => "Changement de mot de passe",
"clerk" => "",
"commission" => "",
"clerk" => "Employé",
"commission" => "Commission",
"confirm_delete" => "Êtes-vous certain de vouloir supprimer le(s) employé(s) sélectionné(s) ?",
"confirm_restore" => "Êtes-vous certain de vouloir restaurer le(s) employé(s) selectionné(s) ?",
"current_password" => "Mot de passe actuel",
"current_password_invalid" => "Le mot de passe actuel est invalide.",
"employee" => "Employé",
"error_adding_updating" => "Erreur d'ajout/édition d'employé.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "Vous ne pouvez pas supprimer un utilisateur administrateur.",
"error_updating_admin" => "Vous ne pouvez pas modifier un utilisateur administrateur.",
"error_deleting_demo_admin" => "Vous ne pouvez pas supprimer l'utilisateur de démonstration admin.",
"error_updating_demo_admin" => "Vous ne pouvez pas modifier l'utilisateur de démonstration admin.",
"language" => "Langue",
"login_info" => "Connexion",
"manager" => "",
"manager" => "Gestionnaire",
"new" => "Nouvel employé",
"none_selected" => "Aucun employé sélectionné pour la suppression.",
"one_or_multiple" => "employé(s)",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Le prix de gros est requis.",
"count" => "Mise à jour de l'inventaire",
"csv_import_failed" => "Échec d'import CSV",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Emplacement(s) de stock invalide(s) trouvé(s) : {0}. Seuls les emplacements de stock valides sont autorisés.",
"csv_import_nodata_wrongformat" => "Le CSV envoyé ne contient aucune donnée, ou elles sont dans un format erroné.",
"csv_import_partially_failed" => "Il y a eu {0} importation(s) d'articles échoué(s) au(x) ligne(s) : {1}. Aucune ligne n'a été importée.",
"csv_import_success" => "Importation des articles réussie.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Points utilisés",
"work_orders" => "Ordre Du Travail",
"zero_and_less" => "Zéro ou moin",
"toggle_cost_and_profit" => "Basculer Coût & Bénéfice",
];

View File

@@ -222,4 +222,8 @@ return [
"work_order_number_duplicate" => "Le numéro de bon de travail doit être unique.",
"work_order_sent" => "Ordre de travail envoyé à",
"work_order_unsent" => "L'ordre de travail n'a pas pu être envoyé à",
"sale_not_found" => "Vente introuvable",
"ubl_invoice" => "Facture UBL",
"download_ubl" => "Télécharger Facture UBL",
"ubl_generation_failed" => "Échec de la génération de la facture UBL",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "א",
"mo" => "ב",
"tu" => "ג",
"we" => "ד",
"th" => "ה",
"fr" => "ו",
"sa" => "ש",
"sun" => "יום א",
"mon" => "יום ב",
"tue" => "יום ג",
"wed" => "יום ד",
"thu" => "יום ה",
"fri" => "יום ו",
"sat" => "שבת",
"sunday" => "יום ראשון",
"monday" => "יום שני",
"tuesday" => "יום שלישי",
"wednesday" => "יום רביעי",
"thursday" => "יום חמישי",
"friday" => "יום שישי",
"saturday" => "יום שבת",
"jan" => "ינו",
"feb" => "פבר",
"mar" => "מרץ",
"apr" => "אפר",
"may" => "מאי",
"jun" => "יונ",
"jul" => "יול",
"aug" => "אוג",
"sep" => "ספט",
"oct" => "אוק",
"nov" => "נוב",
"dec" => "דצמ",
"january" => "ינואר",
"february" => "פברואר",
"march" => "מרץ",
"april" => "אפריל",
"mayl" => "מאי",
"june" => "יוני",
"july" => "יולי",
"august" => "אוגוסט",
"september" => "ספטמבר",
"october" => "אוקטובר",
"november" => "נובמבר",
"december" => "דצמבר",
];

View File

@@ -3,18 +3,18 @@
return [
"address_1" => "Indirizzo 1",
"address_2" => "Indirizzo 2",
"admin" => "",
"admin" => "Amministratore",
"city" => "Città",
"clerk" => "",
"clerk" => "Impiegato",
"close" => "Chiudere",
"color" => "",
"color" => "Colori del tema",
"comments" => "Commenti",
"common" => "comune",
"confirm_search" => "Hai selezionato una o più righe, queste non saranno più selezionate dopo la tua ricerca. Sei sicuro di voler procedere alla ricerca?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Correggi gli errori identificati prima di salvare",
"country" => "Paese",
"dashboard" => "",
"dashboard" => "Pannello di controllo",
"date" => "Data",
"delete" => "Cancella",
"det" => "dettagli",
@@ -26,14 +26,14 @@ return [
"export_csv_no" => "No",
"export_csv_yes" => "Si",
"fields_required_message" => "I campi in rosso sono richiesti",
"fields_required_message_unique" => "",
"fields_required_message_unique" => "I campi in rosso sono richiesti e devono essere unici",
"first_name" => "Nome",
"first_name_required" => "Campo Nome è richiesto.",
"first_page" => "Primo",
"gender" => "Sesso",
"gender_female" => "F",
"gender_male" => "M",
"gender_undefined" => "",
"gender_undefined" => "Non definito",
"icon" => "Icona",
"id" => "ID",
"import" => "Importa",
@@ -51,18 +51,18 @@ return [
"logo" => "Logo",
"logo_mark" => "Marchio",
"logout" => "Esci",
"manager" => "",
"migration_needed" => "",
"manager" => "Responsabile",
"migration_needed" => "Una migrazione del database verso {0} inizierà dopo l'accesso.",
"new" => "Nuovo",
"no" => "",
"no" => "No",
"no_persons_to_display" => "Non ci sono persone da mostrare.",
"none_selected_text" => "[Selezionare]",
"or" => "OR",
"people" => "",
"people" => "Persone",
"phone_number" => "Numero di Telefono",
"phone_number_required" => "",
"phone_number_required" => "Il numero di telefono è richiesto",
"please_visit_my" => "Visitare il",
"position" => "",
"position" => "Posizione",
"powered_by" => "Sviluppato da",
"price" => "Prezzo",
"print" => "Stampa",
@@ -83,7 +83,7 @@ return [
"website" => "Sito web",
"welcome" => "Benvenuto",
"welcome_message" => "Benvenuto in OSPOS, clicca un modulo sottostante per incominciare.",
"yes" => "",
"yes" => "",
"you_are_using_ospos" => "Stai usando la versione Open Source Point Of Sale (Punto di vendita)",
"zip" => "CAP",
];

View File

@@ -1,26 +1,26 @@
<?php
return [
"administrator" => "",
"administrator" => "Amministratore",
"basic_information" => "Informazioni",
"cannot_be_deleted" => "Eliminazione dell'impiegato/i non consentita, uno o più hanno trattato delle vendite o stai cancellando il tuo account.",
"change_employee" => "",
"change_employee" => "Cambia Impiegato",
"change_password" => "Cambia Password",
"clerk" => "",
"commission" => "",
"clerk" => "Impiegato",
"commission" => "Commissione",
"confirm_delete" => "Sei sicuro di voler eliminare l'impiegato/i selezionato?",
"confirm_restore" => "Sei sicuro di voler ripristinare gl'Impiegati selezionati?",
"current_password" => "Password Corrente",
"current_password_invalid" => "Password corrente non valida.",
"employee" => "Impiegato",
"error_adding_updating" => "Aggiunta o aggiornamento di impiegati fallito.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "Non puoi eliminare un utente amministratore.",
"error_updating_admin" => "Non puoi modificare un utente amministratore.",
"error_deleting_demo_admin" => "Non puoi eliminare l'utente admin demo.",
"error_updating_demo_admin" => "Non puoi cambiare l'utente admin demo.",
"language" => "Lingua",
"login_info" => "Login",
"manager" => "",
"manager" => "Manager",
"new" => "Nuovo Impiegato",
"none_selected" => "Non hai selezionato nessun impiegato da eliminare.",
"one_or_multiple" => "impiegato/i",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Prezzo all'ingrosso è un campo obbligatorio.",
"count" => "Aggiorna Inventario",
"csv_import_failed" => "Importazione CSV fallita",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Trovata/e locazione/i di stock non valida/e: {0}. Solo le locazioni di stock valide sono ammesse.",
"csv_import_nodata_wrongformat" => "L'upload del file non ha dati o non è formattato correttamente.",
"csv_import_partially_failed" => "Si sono verificati {0} errori di importazione degli elementi nelle righe: {1}. Nessuna riga è stata importata.",
"csv_import_success" => "Importazione CSV dell'articolo riuscita.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Punti Usati",
"work_orders" => "Ordini di lavoro",
"zero_and_less" => "Zero e meno",
"toggle_cost_and_profit" => "Commuta Costo & Profitto",
];

View File

@@ -222,4 +222,8 @@ return [
"work_order_number_duplicate" => "Numero Ordine di Lavoro deve essere unico.",
"work_order_sent" => "Ordine di lavoro inviato",
"work_order_unsent" => "Ordine di Lavoro fallito da inviare a",
"sale_not_found" => "Vendita non trovata",
"ubl_invoice" => "Fattura UBL",
"download_ubl" => "Scarica fattura UBL",
"ubl_generation_failed" => "Impossibile generare la fattura UBL",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "",
"mo" => "",
"tu" => "",
"we" => "",
"th" => "",
"fr" => "",
"sa" => "",
"sun" => "",
"mon" => "",
"tue" => "",
"wed" => "",
"thu" => "",
"fri" => "",
"sat" => "",
"sunday" => "",
"monday" => "",
"tuesday" => "",
"wednesday" => "",
"thursday" => "",
"friday" => "",
"saturday" => "",
"jan" => "",
"feb" => "",
"mar" => "",
"apr" => "",
"may" => "",
"jun" => "",
"jul" => "",
"aug" => "",
"sep" => "",
"oct" => "",
"nov" => "",
"dec" => "",
"january" => "",
"february" => "",
"march" => "",
"april" => "",
"mayl" => "",
"june" => "",
"july" => "",
"august" => "",
"september" => "",
"october" => "",
"november" => "",
"december" => "",
];

View File

@@ -222,4 +222,5 @@ return [
"work_order_number_duplicate" => "",
"work_order_sent" => "",
"work_order_unsent" => "",
"sale_not_found" => "",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "",
"mo" => "",
"tu" => "",
"we" => "",
"th" => "",
"fr" => "",
"sa" => "",
"sun" => "",
"mon" => "",
"tue" => "",
"wed" => "",
"thu" => "",
"fri" => "",
"sat" => "",
"sunday" => "",
"monday" => "",
"tuesday" => "",
"wednesday" => "",
"thursday" => "",
"friday" => "",
"saturday" => "",
"jan" => "",
"feb" => "",
"mar" => "",
"apr" => "",
"may" => "",
"jun" => "",
"jul" => "",
"aug" => "",
"sep" => "",
"oct" => "",
"nov" => "",
"dec" => "",
"january" => "",
"february" => "",
"march" => "",
"april" => "",
"mayl" => "",
"june" => "",
"july" => "",
"august" => "",
"september" => "",
"october" => "",
"november" => "",
"december" => "",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "ഞാ",
"mo" => "തി",
"tu" => "ചൊ",
"we" => "ബു",
"th" => "വ്യാ",
"fr" => "വെ",
"sa" => "",
"sun" => "ഞായർ",
"mon" => "തിങ്കൾ",
"tue" => "ചൊവ്വ",
"wed" => "ബുധൻ",
"thu" => "വ്യാഴം",
"fri" => "വെള്ളി",
"sat" => "ശനി",
"sunday" => "ഞായറാഴ്ച",
"monday" => "തിങ്കളാഴ്ച",
"tuesday" => "ചൊവ്വാഴ്ച",
"wednesday" => "ബുധനാഴ്ച",
"thursday" => "വ്യാഴാഴ്ച",
"friday" => "വെള്ളിയാഴ്ച",
"saturday" => "ശനിയാഴ്ച",
"jan" => "ജനു",
"feb" => "ഫെബ്രു",
"mar" => "മാർ",
"apr" => "ഏപ്രി",
"may" => "മേയ്",
"jun" => "ജൂൺ",
"jul" => "ജൂലൈ",
"aug" => "ആഗ",
"sep" => "സെപ്റ്റം",
"oct" => "ഒക്ടോ",
"nov" => "നവം",
"dec" => "ഡിസം",
"january" => "ജനുവരി",
"february" => "ഫെബ്രുവരി",
"march" => "മാർച്ച്",
"april" => "ഏപ്രിൽ",
"mayl" => "മേയ്",
"june" => "ജൂൺ",
"july" => "ജൂലൈ",
"august" => "ആഗസ്റ്റ്",
"september" => "സെപ്റ്റംബർ",
"october" => "ഒക്ടോബർ",
"november" => "നവംബർ",
"december" => "ഡിസംബർ",
];

View File

@@ -222,4 +222,5 @@ return [
"work_order_number_duplicate" => "",
"work_order_sent" => "",
"work_order_unsent" => "",
"sale_not_found" => "",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "",
"mo" => "Ma",
"tu" => "Ti",
"we" => "On",
"th" => "To",
"fr" => "Fr",
"sa" => "",
"sun" => "Søn",
"mon" => "Man",
"tue" => "Tir",
"wed" => "Ons",
"thu" => "Tor",
"fri" => "Fre",
"sat" => "Lør",
"sunday" => "Søndag",
"monday" => "Mandag",
"tuesday" => "Tirsdag",
"wednesday" => "Onsdag",
"thursday" => "Torsdag",
"friday" => "Fredag",
"saturday" => "Lørdag",
"jan" => "Jan",
"feb" => "Feb",
"mar" => "Mar",
"apr" => "Apr",
"may" => "Mai",
"jun" => "Jun",
"jul" => "Jul",
"aug" => "Aug",
"sep" => "Sep",
"oct" => "Okt",
"nov" => "Nov",
"dec" => "Des",
"january" => "Januar",
"february" => "Februar",
"march" => "Mars",
"april" => "April",
"mayl" => "Mai",
"june" => "Juni",
"july" => "Juli",
"august" => "August",
"september" => "September",
"october" => "Oktober",
"november" => "November",
"december" => "Desember",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "Zo",
"mo" => "Ma",
"tu" => "Di",
"we" => "Wo",
"th" => "Do",
"fr" => "Vr",
"sa" => "Za",
"sun" => "Zon",
"mon" => "Maa",
"tue" => "Din",
"wed" => "Woe",
"thu" => "Don",
"fri" => "Vri",
"sat" => "Zat",
"sunday" => "Zondag",
"monday" => "Maandag",
"tuesday" => "Dinsdag",
"wednesday" => "Woensdag",
"thursday" => "Donderdag",
"friday" => "Vrijdag",
"saturday" => "Zaterdag",
"jan" => "Jan",
"feb" => "Feb",
"mar" => "Maa",
"apr" => "Apr",
"may" => "Mei",
"jun" => "Jun",
"jul" => "Jul",
"aug" => "Aug",
"sep" => "Sep",
"oct" => "Okt",
"nov" => "Nov",
"dec" => "Dec",
"january" => "Januari",
"february" => "Februari",
"march" => "Maart",
"april" => "April",
"mayl" => "Mei",
"june" => "Juni",
"july" => "Juli",
"august" => "Augustus",
"september" => "September",
"october" => "Oktober",
"november" => "November",
"december" => "December",
];

View File

@@ -3,18 +3,18 @@
return [
"address_1" => "Adres 1",
"address_2" => "Adres 2",
"admin" => "",
"admin" => "Beheerder",
"city" => "Plaats",
"clerk" => "",
"clerk" => "Bediende",
"close" => "Sluiten",
"color" => "",
"color" => "Thema-kleuren",
"comments" => "Opmerkingen",
"common" => "algemeen",
"confirm_search" => "U heeft één of meerdere rijen geselecteerd, deze zullen niet langer geselecteerd zijn na uw zoekopdracht. Weet u zeker dat u deze zoekopdracht wilt verzenden?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Geïdentificeerd fouten oplossen voor het opslaan",
"country" => "Land",
"dashboard" => "",
"dashboard" => "Dashboard",
"date" => "Datum",
"delete" => "Verwijderen",
"det" => "details",
@@ -26,14 +26,14 @@ return [
"export_csv_no" => "Nee",
"export_csv_yes" => "Ja",
"fields_required_message" => "Rode velden zijn vereist",
"fields_required_message_unique" => "",
"fields_required_message_unique" => "Rode velden zijn vereist en moeten uniek zijn",
"first_name" => "Voornaam",
"first_name_required" => "Voornaam is een vereist veld.",
"first_page" => "Eerste",
"gender" => "Geslacht",
"gender_female" => "V",
"gender_male" => "M",
"gender_undefined" => "",
"gender_undefined" => "Ongedefinieerd",
"icon" => "Pictogram",
"id" => "ID",
"import" => "Importeren",
@@ -49,20 +49,20 @@ return [
"learn_about_project" => "om de laatste informatie over het project te bekijken.",
"list_of" => "Lijst van",
"logo" => "Logo",
"logo_mark" => "",
"logo_mark" => "Merk",
"logout" => "Afmelden",
"manager" => "",
"manager" => "Manager",
"migration_needed" => "Een databasemigratie naar {0} zal starten na aanmelding.",
"new" => "Nieuw",
"no" => "",
"no" => "Nee",
"no_persons_to_display" => "Er zijn geen personen om te weergeven.",
"none_selected_text" => "[Selecteren]",
"or" => "OF",
"people" => "",
"people" => "Personen",
"phone_number" => "Telefoonnummer",
"phone_number_required" => "",
"phone_number_required" => "Telefoonnummer is vereist",
"please_visit_my" => "Bezoek de",
"position" => "",
"position" => "Positie",
"powered_by" => "Mogelijk gemaakt door",
"price" => "Prijs",
"print" => "Afdrukken",
@@ -73,8 +73,8 @@ return [
"search" => "Zoeken",
"search_options" => "Zoek opties",
"searched_for" => "Gezocht naar",
"software_short" => "",
"software_title" => "",
"software_short" => "OSPOS",
"software_title" => "Open Source Point of Sale",
"state" => "Provincie",
"submit" => "Verzenden",
"total_spent" => "Totaal uitgegeven",
@@ -83,7 +83,7 @@ return [
"website" => "opensourcepos.org",
"welcome" => "Welkom",
"welcome_message" => "Welkom bij OSPOS, klik op een module hieronder om te beginnen.",
"yes" => "",
"you_are_using_ospos" => "",
"yes" => "Ja",
"you_are_using_ospos" => "U gebruikt Open Source Point Of Sale Versie",
"zip" => "Postcode",
];

View File

@@ -1,26 +1,26 @@
<?php
return [
"administrator" => "",
"administrator" => "Beheerder",
"basic_information" => "Informatie",
"cannot_be_deleted" => "Kan geselecteerde werknemer(s) niet verwijderen, één of meerdere bevatten verwerkte verkopen of u probeert uw account te verwijderen.",
"change_employee" => "",
"change_employee" => "Werknemer wijzigen",
"change_password" => "Wachtwoord wijzigen",
"clerk" => "",
"commission" => "",
"clerk" => "Bediende",
"commission" => "Commissie",
"confirm_delete" => "Weet u zeker dat u de geselecteerde werknemer(s) wilt verwijderen?",
"confirm_restore" => "Weet u zeker dat u de geselecteerde werknemer(s) wilt herstellen?",
"current_password" => "Huidige wachtwoord",
"current_password_invalid" => "Huidige wachtwoord is ongeldig.",
"employee" => "Werknemer",
"error_adding_updating" => "Werknemer toevoegen of bijwerken mislukt.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "U kunt een beheerder niet verwijderen.",
"error_updating_admin" => "U kunt een beheerder niet wijzigen.",
"error_deleting_demo_admin" => "Kan de demo admin gebruiker niet verwijderen.",
"error_updating_demo_admin" => "Kan de demo admin gebruiker niet wijzigen.",
"language" => "Taal",
"login_info" => "Aanmelden",
"manager" => "",
"manager" => "Manager",
"new" => "Nieuwe werknemer",
"none_selected" => "Geen werknemer(s) geselecteerd om te verwijderen.",
"one_or_multiple" => "werknemer(s)",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Inkoopprijs is een vereist veld.",
"count" => "Voorraad bijwerken",
"csv_import_failed" => "CSV importeren mislukt",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Ongeldige voorraadlocatie(s) gevonden: {0}. Alleen geldige voorraadlocaties zijn toegestaan.",
"csv_import_nodata_wrongformat" => "Het geüploade CSV-bestand bevat geen gegevens or heeft de verkeerde indeling.",
"csv_import_partially_failed" => "Er zijn {0} artikel import fout(en) in lijn(en): {1}. Geen rijen geïmporteerd.",
"csv_import_success" => "Artikel CSV geïmporteerd.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Punten gebruikt",
"work_orders" => "Werkorders",
"zero_and_less" => "Nul en minder",
"toggle_cost_and_profit" => "Kosten en winst wisselen",
];

View File

@@ -222,4 +222,8 @@ return [
"work_order_number_duplicate" => "Werkordernummer moet uniek zijn.",
"work_order_sent" => "Werkorder verzonden naar",
"work_order_unsent" => "Werkorder niet verzonden naar",
"sale_not_found" => "Verkoop niet gevonden",
"ubl_invoice" => "UBL-factuur",
"download_ubl" => "UBL-factuur downloaden",
"ubl_generation_failed" => "Genereren van UBL-factuur mislukt",
];

View File

@@ -3,18 +3,18 @@
return [
'address_1' => "Endereço",
'address_2' => "Complemento",
'admin' => "",
'admin' => "Administrador",
'city' => "Cidade",
'clerk' => "",
'clerk' => "Funcionário",
'close' => "Fechar",
'color' => "",
'color' => "Cores do tema",
'comments' => "Comentários",
'common' => "comum",
'confirm_search' => "Você selecionou uma ou mais linhas, estes não serão mais selecionados após a sua pesquisa. Tem certeza de que deseja enviar esta pesquisa?",
'copyrights' => "© 2010 - {0}",
'correct_errors' => "Por favor, corrija os erros identificados antes de salvar",
'country' => "País",
'dashboard' => "",
'dashboard' => "Painel",
'date' => "Data",
'delete' => "Apagar",
'det' => "detalhes",
@@ -26,14 +26,14 @@ return [
'export_csv_no' => "Não",
'export_csv_yes' => "Sim",
'fields_required_message' => "Campos em vermelho são obrigatórios",
'fields_required_message_unique' => "",
'fields_required_message_unique' => "Campos em vermelho são obrigatórios e devem ser únicos",
'first_name' => "Nome",
'first_name_required' => "O nome é requerido.",
'first_page' => "Primeira",
'gender' => "Sexo",
'gender_female' => "F",
'gender_male' => "M",
'gender_undefined' => "",
'gender_undefined' => "Indefinido",
'icon' => "Ícone",
'id' => "Id",
'import' => "Importar",
@@ -51,18 +51,18 @@ return [
'logo' => "Logotipo",
'logo_mark' => "Símbolo da marca",
'logout' => "Sair",
'manager' => "",
'manager' => "Gerente",
'migration_needed' => "Uma migração do banco de dados para {0} será iniciada após o login.",
'new' => "Novo",
'no' => "nao",
'no' => "o",
'no_persons_to_display' => "Não existem pessoas para mostrar.",
'none_selected_text' => "Selecione",
'or' => "ou",
'people' => "",
'people' => "Pessoas",
'phone_number' => "Telefone",
'phone_number_required' => "Número do telefone é requerido",
'please_visit_my' => "Para saber mais sobre esta aplicação visite o website do projeto |",
'position' => "",
'position' => "Posição",
'powered_by' => "Desenvolvido por",
'price' => "Preço",
'print' => "Imprimir",
@@ -83,7 +83,7 @@ return [
'website' => "opensourcepos.org",
'welcome' => "Bem-vindo",
'welcome_message' => "Bem-vindo.",
'yes' => "sim",
'yes' => "Sim",
'you_are_using_ospos' => "Você está usando Open Source Point Of Sale Versão",
'zip' => "CEP",
];

View File

@@ -1,26 +1,26 @@
<?php
return [
"administrator" => "",
"administrator" => "Administrador",
"basic_information" => "Informações do Funcionário",
"cannot_be_deleted" => "Não foi possível excluir funcionários selecionados, um ou mais dos funcionários processou vendas ou você está tentando excluir-se :).",
"change_employee" => "",
"change_employee" => "Alterar Funcionário",
"change_password" => "Alterar senha",
"clerk" => "",
"commission" => "",
"clerk" => "Funcionário",
"commission" => "Comissão",
"confirm_delete" => "Tem certeza de que deseja excluir os funcionários selecionados?",
"confirm_restore" => "Tem certeza de que deseja restaurar o (s) empregado (s) selecionado (s)?",
"current_password" => "Senha atual",
"current_password_invalid" => "Senha atual inválida.",
"employee" => "Funcionário",
"error_adding_updating" => "Erro ao adicionar/atualizar funcionário.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_admin" => "Você não pode excluir um usuário administrador.",
"error_updating_admin" => "Você não pode modificar um usuário administrador.",
"error_deleting_demo_admin" => "Você não pode excluir o usuário administrador de demonstração.",
"error_updating_demo_admin" => "Você não pode alterar o usuário de demonstração de administração.",
"language" => "Linguagem",
"login_info" => "Autenticação",
"manager" => "",
"manager" => "Gerente",
"new" => "Novo Funcionário",
"none_selected" => "Você não selecionou nenhum funcionário para excluir.",
"one_or_multiple" => "funcionário(s)",

View File

@@ -26,7 +26,7 @@ return [
"cost_price_required" => "Preço de custo é um campo obrigatório.",
"count" => "Acrescentar ao Inventário",
"csv_import_failed" => "Importação do CSV falhou",
"csv_import_invalid_location" => "",
"csv_import_invalid_location" => "Local(is) de estoque inválido(s) encontrado(s): {0}. Apenas locais de estoque válidos são permitidos.",
"csv_import_nodata_wrongformat" => "Seu arquivo enviado não contém dados ou formato errado.",
"csv_import_partially_failed" => "Houve {0} falha na importação de itens na(s) linha(s): {1}. Nenhuma linha foi importada.",
"csv_import_success" => "Importação de Itens com sucesso.",

View File

@@ -146,4 +146,5 @@ return [
"used" => "Pontos usados",
"work_orders" => "Ordens de trabalho",
"zero_and_less" => "Zero e menor",
"toggle_cost_and_profit" => "Alternar Custo & Lucro",
];

View File

@@ -222,4 +222,8 @@ return [
"work_order_number_duplicate" => "O número da ordem de serviço deve ser exclusivo.",
"work_order_sent" => "Ordem de trabalho enviada para",
"work_order_unsent" => "A ordem de serviço não foi enviada para",
"sale_not_found" => "Venda não encontrada",
"ubl_invoice" => "Fatura UBL",
"download_ubl" => "Baixar Fatura UBL",
"ubl_generation_failed" => "Falha ao gerar fatura UBL",
];

View File

@@ -222,4 +222,5 @@ return [
"work_order_number_duplicate" => "Work Order Number must be unique.",
"work_order_sent" => "Work Order sent to",
"work_order_unsent" => "Work Order failed to be sent to",
"sale_not_found" => "விற்பனை காணப்படவில்லை",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "",
"mo" => "సో",
"tu" => "మం",
"we" => "బు",
"th" => "గు",
"fr" => "శు",
"sa" => "",
"sun" => "ఆది",
"mon" => "సోమ",
"tue" => "మంగళ",
"wed" => "బుధ",
"thu" => "గురు",
"fri" => "శుక్ర",
"sat" => "శని",
"sunday" => "ఆదివారం",
"monday" => "సోమవారం",
"tuesday" => "మంగళవారం",
"wednesday" => "బుధవారం",
"thursday" => "గురువారం",
"friday" => "శుక్రవారం",
"saturday" => "శనివారం",
"jan" => "జన",
"feb" => "ఫిబ్ర",
"mar" => "మార్",
"apr" => "ఏప్రి",
"may" => "మే",
"jun" => "జూన్",
"jul" => "జూలై",
"aug" => "ఆగ",
"sep" => "సెప్టెం",
"oct" => "అక్టో",
"nov" => "నవం",
"dec" => "డిసెం",
"january" => "జనవరి",
"february" => "ఫిబ్రవరి",
"march" => "మార్చి",
"april" => "ఏప్రిల్",
"mayl" => "మే",
"june" => "జూన్",
"july" => "జూలై",
"august" => "ఆగస్టు",
"september" => "సెప్టెంబర్",
"october" => "అక్టోబర్",
"november" => "నవంబర్",
"december" => "డిసెంబర్",
];

View File

@@ -0,0 +1,49 @@
<?php
return [
"su" => "",
"mo" => "",
"tu" => "",
"we" => "",
"th" => "",
"fr" => "",
"sa" => "",
"sun" => "",
"mon" => "",
"tue" => "",
"wed" => "",
"thu" => "",
"fri" => "",
"sat" => "",
"sunday" => "",
"monday" => "",
"tuesday" => "",
"wednesday" => "",
"thursday" => "",
"friday" => "",
"saturday" => "",
"jan" => "",
"feb" => "",
"mar" => "",
"apr" => "",
"may" => "",
"jun" => "",
"jul" => "",
"aug" => "",
"sep" => "",
"oct" => "",
"nov" => "",
"dec" => "",
"january" => "",
"february" => "",
"march" => "",
"april" => "",
"mayl" => "",
"june" => "",
"july" => "",
"august" => "",
"september" => "",
"october" => "",
"november" => "",
"december" => "",
];

View File

@@ -222,4 +222,5 @@ return [
"work_order_number_duplicate" => "",
"work_order_sent" => "",
"work_order_unsent" => "",
"sale_not_found" => "",
];

View File

@@ -47,7 +47,14 @@
</div>
<section class="box-login d-flex flex-column justify-content-center align-items-center p-md-4">
<?= form_open('login') ?>
<h3 class="text-center m-0"><?= lang('Login.welcome', [lang('Common.software_short')]) ?></h3>
<?php if (!$is_latest): ?>
<h3 class="text-center m-0"><?= lang('Login.migration_required') ?></h3>
<div class="alert alert-warning mt-3">
<strong><?= lang('Login.migration_auth_message', [$latest_version]) ?></strong>
</div>
<?php else: ?>
<h3 class="text-center m-0"><?= lang('Login.welcome', [lang('Common.software_short')]) ?></h3>
<?php endif; ?>
<?php if ($has_errors): ?>
<?php foreach ($validation->getErrors() as $error): ?>
<div class="alert alert-danger mt-3">
@@ -55,11 +62,6 @@
</div>
<?php endforeach; ?>
<?php endif; ?>
<?php if (!$is_latest): ?>
<div class="alert alert-info mt-3">
<?= lang('Login.migration_needed', [$latest_version]) ?>
</div>
<?php endif; ?>
<?php if (empty($config['login_form']) || 'floating_labels' == ($config['login_form'])): ?>
<div class="form-floating mt-3">
<input class="form-control" id="input-username" name="username" type="text" placeholder="<?= lang('Login.username') ?>" <?php if (ENVIRONMENT == "testing") echo 'value="admin"'; ?>>
@@ -96,7 +98,9 @@
}
?>
<div class="d-grid">
<button class="btn btn-lg btn-primary" name="login-button" type="submit"><?= lang('Login.go') ?></button>
<button class="btn btn-lg btn-primary" name="login-button" type="submit">
<?= $is_latest ? lang('Login.go') : lang('Module.migrate') ?>
</button>
</div>
<?= form_close() ?>
</section>

View File

@@ -20,7 +20,6 @@ services:
networks:
- app_net
volumes:
- ./app/Database/database.sql:/docker-entrypoint-initdb.d/database.sql
- mysql:/var/lib/mysql:rw
environment:
- MYSQL_ROOT_PASSWORD=pointofsale

View File

@@ -1,21 +0,0 @@
include:
- docker/docker-mysql.yml
services:
test:
build:
context: .
target: ospos_test
depends_on:
- mysql
container_name: ospos_test
environment:
- CI_ENVIRONMENT=testing
- ENCRYPTION_KEY=
- MYSQL_HOST_NAME=mysql
- MYSQL_DATABASE=ospos
- MYSQL_USERNAME=admin
- MYSQL_PASSWORD=pointofsale
command: [ "/bin/wait-for-it.sh", "mysql:3306", "--", "/app/vendor/bin/phpunit", "/app/tests" ]
ports:
- "80:80"

View File

@@ -2,9 +2,6 @@ include:
- docker/docker-mysql.yml
services:
sqlscript:
image: jekkos/opensourcepos:sql-master
command: /bin/sh -c 'exit 0'
ospos:
image: jekkos/opensourcepos:master
restart: always

View File

@@ -19,8 +19,6 @@ services:
- "3306"
networks:
- app_net
volumes_from:
- sqlscript
volumes:
- mysql:/var/lib/mysql:rw
environment:

View File

@@ -281,13 +281,6 @@ gulp.task('copy-menubar', function() {
});
gulp.task('build-database', function() {
return gulp.src(['./app/Database/tables.sql','./app/Database/constraints.sql'])
.pipe(header('-- >> This file is autogenerated from tables.sql and constraints.sql. Do not modify directly << --'))
.pipe(concat('database.sql'))
.pipe(gulp.dest('./app/Database'));
});
// Run all required tasks
gulp.task('default',
gulp.series('clean',
@@ -299,6 +292,5 @@ gulp.task('default',
'debug-css',
'prod-css',
'copy-fonts',
'copy-menubar',
'build-database'
'copy-menubar'
));

View File

@@ -41,7 +41,7 @@ class Token_libTest extends CIUnitTestCase
{
$input = '%Y-%q-%bad';
$result = $this->tokenLib->render($input, [], false);
$this->assertMatchesRegularExpression('/\d{4}-%q-%bad/', $result);
$this->assertMatchesRegularExpression('/\d{4}-%q-[A-Za-z]{3}ad/', $result);
}
public function testRenderHandlesStringWithPercentAPercent(): void

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap = "../vendor/autoload.php"
backupGlobals = "false"
colors = "true"
processIsolation = "false"
stopOnFailure = "false">
<testsuites>
<testsuite name="Helpers">
<directory>helpers</directory>
</testsuite>
<testsuite name="Libraries">
<directory>Libraries</directory>
</testsuite>
</testsuites>
</phpunit>