Compare commits

..

1781 Commits
2.2.2 ... 3.0.1

Author SHA1 Message Date
jekkos
9e8cc93082 Fix upload path in docker cloud setup 2016-11-27 17:17:18 +01:00
FrancescoUK
57de863f79 Update WHATS_NEW 2016-11-26 16:03:16 +00:00
FrancescoUK
00565ddc8f Fix (again) Summary_taxes percent column sorting (#1003) 2016-11-26 15:50:35 +00:00
jekkos
7d4dff0a37 Remove percentage sign from number_sorter regex (#1003) 2016-11-26 15:54:04 +01:00
jekkos
1ed76fa091 Properly parse negative numbers + rename currency_sorter (#1003) 2016-11-26 15:46:27 +01:00
FrancescoUK
114c215407 Fix Summary_discounts percent column sorting (#1003) 2016-11-26 14:39:12 +00:00
FrancescoUK
9bef65b9cb Fix Summary_taxes percent column (#1003) 2016-11-26 14:34:11 +00:00
FrancescoUK
dc4d582898 Fix LICENSE files 2016-11-26 14:12:35 +00:00
jekkos
8b32a26e80 Fix cost label in item summary report (#1003) 2016-11-26 14:52:31 +01:00
jekkos
422e2ddbab Add currency sorting for summary reports (#1003) 2016-11-26 14:49:41 +01:00
FrancescoUK
c5988adbbb Fix read_only flag issue (#1003) 2016-11-26 12:03:22 +00:00
jekkos
2727e91c96 Fix currency sorting in tabular_details (#1003) 2016-11-26 12:17:13 +01:00
jekkos
4304f5ceea Revert tabular_details changes (#1003) 2016-11-26 00:12:33 +01:00
jekkos
1666a3e689 Fix detailed sale + receiving report row update + currency sorting (#1003) 2016-11-25 22:24:46 +01:00
FrancescoUK
2f8d66664b Merge pull request #1006 from rnld26/patch-1
Update LICENSE
2016-11-24 08:57:04 +00:00
Rinaldy@dbarber
7c5276b014 Update LICENSE 2016-11-24 12:13:18 +07:00
FrancescoUK
5231c027af Revert "Support MySQL5.7 in backward compatible mode (#630)"
This reverts commit 7ef68fbc76.
2016-11-21 22:02:44 +00:00
FrancescoUK
3974279607 Fix timezone drop down option typo 2016-11-21 08:27:48 +00:00
FrancescoUK
7ef68fbc76 Support MySQL5.7 in backward compatible mode (#630) 2016-11-20 21:20:52 +00:00
FrancescoUK
1440e6bce9 Upgrade WHATS_NEW to latest 3.0.1 improvements 2016-11-20 13:53:26 +00:00
FrancescoUK
b66827b0ff Fix Detailed sale tax rounding, reorder reports to subtotal, tax, total, cost, profit (#976) 2016-11-20 12:15:50 +00:00
FrancescoUK
540c4f3ec0 Make Sale get_info consistent with the other queries (#976) 2016-11-19 19:30:38 +00:00
FrancescoUK
9e1064979a Solve detailed sale rounding issue (#976) 2016-11-19 16:27:55 +00:00
FrancescoUK
5047ca0f41 Fix Sales Takings multiple taxes issue and swap table columns (#976) 2016-11-19 15:15:43 +00:00
FrancescoUK
5267eadc56 Make Summary reports more OOD (#976) 2016-11-18 16:34:41 +00:00
FrancescoUK
577e5b2db4 Fix wrong tax and subtotal calculation in Summary reports (#976) 2016-11-17 23:13:56 +00:00
FrancescoUK
35e76bdd4d Add value label on bars in bar/hbar charts 2016-11-15 18:41:17 +00:00
FrancescoUK
9766dcfad3 Update LICENSE files to contain latest contributor (#967) 2016-11-15 17:44:26 +00:00
FrancescoUK
0e2f84c91d Update js plugins and regen dist files 2016-11-13 18:52:57 +00:00
FrancescoUK
77806412fa Fix line chart axis labels overlap issue 2016-11-13 17:43:59 +00:00
FrancescoUK
737980c041 Fix wrong items import model dialog title (#969) 2016-11-13 16:57:22 +00:00
FrancescoUK
e86ea272ca Updated WHATS_NEW to the latest for 3.0.1 release 2016-11-13 11:54:25 +00:00
FrancescoUK
284a73f41d Add missing Receivings default item_location value in phppos_migrate.sql script 2016-11-13 11:25:31 +00:00
FrancescoUK
5a4c27cf87 Set correct Employee in Sales receipt and invoice (#967) 2016-11-13 11:21:09 +00:00
FrancescoUK
e22e081865 Refactoring and performance improvement of Summary reports (#964) 2016-11-11 19:24:23 +00:00
FrancescoUK
123cb25bf5 Set the code to production not development (suppresses PHP errors) (#965) 2016-11-11 13:11:44 +00:00
FrancescoUK
19165133ae Revert receipt being open in a new window (#966) 2016-11-10 17:43:24 +00:00
FrancescoUK
e1035ff54b Optimise Reports usage of temp database tables (#964) 2016-11-10 17:42:17 +00:00
FrancescoUK
ed80627ddd Takings, sale edit, receipt database performance improvement - no temp table - (#964) 2016-11-09 18:06:23 +00:00
FrancescoUK
d380524f9d Sales and Receivings code refactoring 2016-11-09 10:06:09 +00:00
FrancescoUK
ca39fb38ad Prepare 3.0.1 release, updated README 2016-11-08 21:55:22 +00:00
FrancescoUK
be1be80a0e Restore fixed .gitignore 2016-11-08 20:14:29 +00:00
FrancescoUK
868868163c Replace Appconfig->get with config->item to reduce database calls 2016-11-08 20:09:40 +00:00
William Chanrico
a831f09fca Translated using Weblate (Indonesian)
Currently translated at 100.0% (61 of 61 strings)
2016-11-08 11:04:21 +01:00
Songwut Kanchanakosai
b0b8c0e936 Translated using Weblate (Thai)
Currently translated at 100.0% (178 of 178 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (178 of 178 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (117 of 117 strings)
2016-11-08 11:04:21 +01:00
AELHOFY
047fd7b7ad Translated using Weblate (Arabic)
Currently translated at 100.0% (176 of 176 strings)
2016-11-08 11:04:21 +01:00
Weblate
e6a61941df Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (178 of 178 strings)
2016-11-08 11:04:21 +01:00
jekkos
f4237e3f68 Add translations for project 2016-11-08 11:04:21 +01:00
FrancescoUK
1f2e87ec09 Encrypt email and sms passwords before saving to MySQL (#963)
It also automatically generates an encryption key if not existing storing it in config/config.php in order to enable encryption.
2016-11-07 19:20:44 +00:00
FrancescoUK
519b19ae64 Remove phpinfo.php because it's a security risk 2016-11-07 09:22:21 +00:00
FrancescoUK
001cd411f2 Update .htaccess to support Apache 2.2. and 2.4 (#957) 2016-11-07 09:16:10 +00:00
FrancescoUK
4b5b985315 Fix .gitignore 2016-11-06 17:11:32 +00:00
FrancescoUK
ef45c96ce8 Add hook for database query logging - enable in config.php - (#924) 2016-11-06 15:44:18 +00:00
jekkos
6dfb24e6f1 Fix query performance for Item->exists (receivings) (#924) 2016-11-05 21:03:32 +01:00
jekkos
49c89d1cec Improve item search performance by casting to correct datatype (#924) 2016-11-05 20:49:08 +01:00
FrancescoUK
872aa7b829 Improve sales register scan item performance (#924) + Fix statistics 2016-11-05 15:07:25 +00:00
FrancescoUK
4dbb8655ee Update README.md 2016-11-04 15:39:10 +00:00
FrancescoUK
ab3acf1605 Tidyup .htaccess file 2016-11-04 11:20:56 +00:00
jekkos
7668991d6c Update design for #68 2016-11-03 23:14:02 +01:00
FrancescoUK
768ffdfb4b Amend path addition (#952) 2016-11-01 17:24:41 +00:00
William Chanrico
9a9637bfb7 fixed import_customers.csv template download path 2016-11-01 05:40:31 +07:00
William Chanrico
2cbff93ab5 fixed import_items.csv template download path 2016-11-01 05:39:23 +07:00
FrancescoUK
e42aaed0b1 Fix typo in README and update UPGRADE file with extra step 2016-10-31 17:22:36 +00:00
FrancescoUK
4678764a03 Improved FAQ and issue reporting template. Bumped OSPOS version in few more files 2016-10-31 17:16:30 +00:00
jekkos
4120015d78 Update to CI 3.1.2 2016-10-31 11:39:37 +01:00
FrancescoUK
5ecc6ead7d Temporary tables optimisation: add indexes (#951) 2016-10-30 17:05:41 +00:00
FrancescoUK
816fcd9203 Temporary tables optimisation: improve sales_items_temp (#951) 2016-10-30 17:04:59 +00:00
FrancescoUK
6f444b1a33 Temporary tables optimisation: use only the one required (#951) 2016-10-30 17:03:16 +00:00
FrancescoUK
94141e21db Upgraded phppos to ospos migration script to support vs 3.0.0 2016-10-29 21:02:07 +01:00
FrancescoUK
17c23ad417 Added change from item_pic to pic_id in Items table in 2.3.2_to_2.3.3.sql script (#945) 2016-10-29 20:31:23 +01:00
FrancescoUK
ef5c513f1b Bump up OSPOS version to 3.0.1 2016-10-27 16:52:32 +01:00
jekkos
60f78c8eeb Add database layout schema from mysql
Add diagram for adding generic categories
2016-10-22 22:34:09 +02:00
FrancescoUK
dd66496ccc Remove deleted stock locations from low inventory report (#916) 2016-10-21 16:28:09 +01:00
FrancescoUK
d2e21e18a1 Update README 2016-10-20 17:59:15 +01:00
FrancescoUK
d21bedd8c1 Update README 2016-10-20 17:53:19 +01:00
FrancescoUK
0a71cb3d4d Update WHATS_NEW.txt 2016-10-20 10:48:13 +01:00
jekkos
7758d96e34 Use master docker image for dev environment
Update whats_new.txt
2016-10-19 23:02:48 +02:00
FrancescoUK
71ab84e30f Update README.md 2016-10-19 20:36:56 +01:00
FrancescoUK
b1c36b790f Fix to item pic ID 0 issue (#921)
Some code clean up too.
2016-10-19 18:47:57 +01:00
AELHOFY
0723bd2922 Translated using Weblate (Arabic)
Currently translated at 100.0% (176 of 176 strings)
2016-10-18 16:47:49 +02:00
jekkos-t520
f5716ab5a3 Fix path to upload folder (#917) 2016-10-18 11:54:47 +02:00
FrancescoUK
3208b83169 Update README.md with installation FAQ 2016-10-18 10:28:04 +01:00
jekkos-t520
a2515cf922 Make uploads folder writable (#917) 2016-10-18 11:21:27 +02:00
FrancescoUK
1df3ed8b46 Update README.md
Added few steps on installation procedure and more issues in the FAQ.
2016-10-18 09:22:22 +01:00
FrancescoUK
d6985853d4 Remove old translations files and rely on Weblate (#848 #888) 2016-10-17 16:45:06 +01:00
jekkos-t520
dac61c498e Don't build weblate orphan branch in travis 2016-10-17 17:16:03 +02:00
jekkos
badc108b2e Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (178 of 178 strings)
2016-10-17 17:10:59 +02:00
jekkos-t520
b3efd5301d Add sendmail to docker container (#772) 2016-10-17 13:25:57 +02:00
FrancescoUK
e21f25c15b Fix typo causing an error in Sales register (#904) 2016-10-17 08:39:35 +01:00
FrancescoUK
2d8bd2d307 Show deleted items in Receiving receipt (#904) 2016-10-17 08:32:03 +01:00
FrancescoUK
20a6c6ec0a Show deleted items in receipts and invoices (#904) 2016-10-16 23:14:01 +01:00
FrancescoUK
0cb68d47cb Apply Customer discount to item kit items too (#910) 2016-10-16 09:24:42 +01:00
FrancescoUK
04a77dff7d Apply customer default discount even if customer added later (#910) 2016-10-14 21:19:52 +01:00
Koncept Technologies
8732b0e69a Translated using Weblate (French)
Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (French)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (French)

Currently translated at 100.0% (61 of 61 strings)

Can't figure out the context

Translated using Weblate (French)

Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (French)

Currently translated at 100.0% (19 of 19 strings)

Translated using Weblate (French)

Currently translated at 100.0% (89 of 89 strings)

Translated using Weblate (French)

Currently translated at 86.0% (43 of 50 strings)

Translated using Weblate (French)

Currently translated at 98.2% (115 of 117 strings)
2016-10-13 23:18:51 +02:00
Valentin Seipt
fe193053f1 Translated using Weblate (German)
Currently translated at 100.0% (66 of 66 strings)

Translated using Weblate (German)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (German)

Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (German)

Currently translated at 100.0% (50 of 50 strings)
2016-10-13 23:18:40 +02:00
jekkos
20279c3bc0 Add correct time to new receivings (#853) 2016-10-13 23:14:10 +02:00
jekkos-t520
20e4a3b057 Remove docker volume for custom mysql config 2016-10-13 09:44:06 +02:00
FrancescoUK
1723347359 Fix Receivings report date issue (#853) 2016-10-12 19:41:42 +01:00
jekkos
3b578d41bc Fix price locale parsing if user has no grant for items module (#834) 2016-10-11 16:45:03 +02:00
FrancescoUK
573367eddc Fix Arab language issue missing Open Source Point Of Sale (#900) 2016-10-10 11:19:40 +01:00
FrancescoUK
c5986ea943 Revert "Remove old translations files and rely on Weblate (#848)" 2016-10-09 09:55:36 +01:00
FrancescoUK
90efaf03ee Remove old translations files and rely on Weblate (#848) 2016-10-06 22:11:14 +01:00
jekkos
8217b70984 Fix debug mode + simplify Gruntfile 2016-10-06 22:12:33 +02:00
FrancescoUK
fd50f6079e Update README.md 2016-10-06 19:51:40 +01:00
FrancescoUK
a9086cac49 Update README.md 2016-10-06 18:57:28 +01:00
FrancescoUK
3fbc53e9b8 Merge branch 'jekkos/master' into composer
# Conflicts:
#	database/docker_mysql.cnf
2016-10-06 18:21:53 +01:00
FrancescoUK
2dddd1b7ee Change dummy emails to be @example.com as it's a reserved domain (#624) 2016-10-03 18:40:40 +01:00
FrancescoUK
978cdee7be Remove pappastech default email once forever (#624) 2016-10-02 21:07:08 +01:00
FrancescoUK
e9e2c877d4 Add explicit path to header.php and login.php in Gruntfile.js cachebreaker rule (#624) 2016-10-02 16:47:46 +01:00
FrancescoUK
3543321309 Rename LICENSES to be bower.LICENSES (#624) 2016-10-02 16:25:51 +01:00
FrancescoUK
b1409f432b Refactor COPYING/LICENSE file in composer setup (#624) 2016-10-02 16:14:33 +01:00
FrancescoUK
676948729b Amend bower and composer json dscription files (#624) 2016-10-02 13:25:53 +01:00
jekkos
10ab3911dc Update to latest 3.1.0 translations 2016-10-02 13:13:47 +02:00
jekkos
24dcc3f680 Add timezone variabler in dev container 2016-10-02 13:05:51 +02:00
FrancescoUK
64ba842730 Fix license clean in Gruntfile.js to reflect new composer path (#624) 2016-10-02 11:47:33 +01:00
FrancescoUK
83992cbf0d Add grunt-composer package - not used yet - (#624) 2016-10-02 09:43:53 +01:00
FrancescoUK
5a2bd9a569 Fix css and js broken URL issue (#624) 2016-10-02 09:41:23 +01:00
FrancescoUK
2fcc473830 Restore CI system language translations (#624) 2016-10-02 09:21:29 +01:00
jekkos
86de36d731 Fix include paths for debug js + css 2016-10-02 00:19:46 +02:00
jekkos
592f378d2a Include fixes for GA Client, CI Email bug and bstables fix 2016-10-01 23:52:03 +02:00
FrancescoUK
a87629000e Fix invoice email pdf attachment being 0 size (#624) 2016-10-01 17:10:32 +01:00
FrancescoUK
15e84f9b37 Fix config.php file scrambling 2016-10-01 15:59:07 +01:00
FrancescoUK
a9963dcfd0 Small refactoring of pdf invoice 2016-10-01 15:17:12 +01:00
FrancescoUK
974744858f Upgrade js plugins and regen dist files 2016-10-01 11:14:08 +01:00
FrancescoUK
a1a6ede046 Extend Return Policy length to 500, reduce app_config key length to 50 (#879) 2016-10-01 10:26:51 +01:00
jekkos
7bba5f9dd0 Add php-mbstring dependency for DOMPDF 0.7 (#624) 2016-09-30 21:26:53 +02:00
jekkos
39dd29b3c8 Add mysql configuration for 1G ram setup + MySQL 5.7 workaround (#860) 2016-09-30 21:19:38 +02:00
FrancescoUK
10cac5496b Merge branch 'jekkos/master' into composer 2016-09-28 17:41:28 +01:00
FrancescoUK
d88aee1676 Adjusted statistics typos 2016-09-28 17:33:15 +01:00
Piyaporn T
f2e2b5c91b Translated using Weblate (Thai)
Currently translated at 100.0% (66 of 66 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (89 of 89 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (117 of 117 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (2 of 2 strings)
2016-09-27 21:39:01 +02:00
jekkos
b07631798e Add link to wiki for docker cloud install 2016-09-27 21:19:37 +02:00
Piyaporn T
e7815a1251 Translated using Weblate (Thai)
Currently translated at 100.0% (66 of 66 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (89 of 89 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (117 of 117 strings)
2016-09-27 12:42:29 +02:00
Xyko Arteiro
9dfc186fe4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (5 of 5 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (84 of 84 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (117 of 117 strings)
2016-09-27 12:42:27 +02:00
FrancescoUK
9c025c6feb Made send statistics configurable 2016-09-24 21:13:13 +01:00
FrancescoUK
fdbb158c1d Security fix 2016-09-24 20:49:30 +01:00
jekkos-t520
c695505605 Make timezone configurable through env variable (#853) 2016-09-23 10:38:34 +02:00
Piyaporn T
dea8683fd4 Translated using Weblate (Thai)
Currently translated at 78.7% (52 of 66 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (19 of 19 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (84 of 84 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (117 of 117 strings)

Translated using Weblate (Thai)

Currently translated at 100.0% (117 of 117 strings)
2016-09-21 09:34:59 +02:00
Salvador Hurtado
efc5996282 Translated using Weblate (Spanish)
Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (84 of 84 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (117 of 117 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (19 of 19 strings)
2016-09-21 09:34:59 +02:00
Weblate
ec2aa52d85 Translated using Weblate (Chinese)
Currently translated at 100.0% (176 of 176 strings)

Translated using Weblate (Chinese)

Currently translated at 100.0% (89 of 89 strings)

Translated using Weblate (Chinese)

Currently translated at 78.0% (39 of 50 strings)
2016-09-21 09:34:59 +02:00
Suat Donangil
7d7afd4904 Translated using Weblate (Turkish)
Currently translated at 98.2% (115 of 117 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (66 of 66 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (8 of 8 strings)
2016-09-21 09:34:59 +02:00
FrancescoUK
8a3fa821d9 Fixed Turkish language issue (#863) 2016-09-17 14:00:36 +01:00
Suat Donangil
16958d3b99 Translated using Weblate (Turkish)
Currently translated at 100.0% (12 of 12 strings)
2016-09-16 13:10:32 +00:00
Suat Donangil
5829dd8ba5 Translated using Weblate (Turkish)
Currently translated at 100.0% (22 of 22 strings)
2016-09-16 13:09:38 +00:00
Valentin Seipt
d0c86b8dc4 Translated using Weblate (German)
Currently translated at 100.0% (22 of 22 strings)
2016-09-16 13:09:38 +00:00
Suat Donangil
0d0ec68e60 Translated using Weblate (Turkish)
Currently translated at 100.0% (89 of 89 strings)
2016-09-16 13:08:31 +00:00
Suat Donangil
cc4edaa468 Translated using Weblate (Turkish)
Currently translated at 100.0% (89 of 89 strings)
2016-09-16 13:08:31 +00:00
Suat Donangil
ffbba16a08 Translated using Weblate (Turkish)
Currently translated at 100.0% (61 of 61 strings)
2016-09-16 13:07:06 +00:00
Suat Donangil
f235b33959 Translated using Weblate (Turkish)
Currently translated at 100.0% (61 of 61 strings)
2016-09-16 13:07:06 +00:00
Valentin Seipt
fd9118887c Translated using Weblate (German)
Currently translated at 100.0% (61 of 61 strings)
2016-09-16 13:07:06 +00:00
Suat Donangil
5fddfe20d6 Translated using Weblate (Turkish)
Currently translated at 100.0% (8 of 8 strings)
2016-09-16 12:42:51 +00:00
FrancescoUK
e42a4e843b Merge branch 'master' into composer 2016-09-15 22:35:52 +01:00
FrancescoUK
3b00c5bf9e Updated js plugins and regen dist files 2016-09-15 22:28:49 +01:00
FrancescoUK
7f1b8a146b Fixed login issue (#859 #862) 2016-09-15 22:11:01 +01:00
Joe Salty
e05b2697d4 Translated using Weblate (Hungarian)
Currently translated at 100.0% (12 of 12 strings)
2016-09-15 22:09:32 +01:00
Joe Salty
da0678f079 Translated using Weblate (Hungarian)
Currently translated at 100.0% (22 of 22 strings)
2016-09-15 22:07:56 +01:00
Weblate
2ba7b000c2 Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (176 of 176 strings)
2016-09-15 22:06:15 +01:00
Weblate
548df573bb Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (89 of 89 strings)
2016-09-15 22:04:58 +01:00
Joe Salty
f1d8378bcb Translated using Weblate (Hungarian)
Currently translated at 100.0% (89 of 89 strings)
2016-09-15 22:03:32 +01:00
Joe Salty
42121017b5 Translated using Weblate (Hungarian)
Currently translated at 100.0% (8 of 8 strings)
2016-09-15 22:02:09 +01:00
Joe Salty
6fade459ad Translated using Weblate (Hungarian)
Currently translated at 100.0% (61 of 61 strings)
2016-09-15 22:00:52 +01:00
Marcus Gustafsson
b2e85aa0d8 Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-15 21:59:31 +01:00
FrancescoUK
9f3ecb0866 Log error if email sending fails (#772) 2016-09-15 21:57:12 +01:00
Marcus Gustafsson
6a29ebeff8 Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-15 21:55:04 +01:00
Marcus Gustafsson
221a575e5c Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-15 21:53:40 +01:00
Valentin Seipt
2afac17848 Translated using Weblate (German)
Currently translated at 100.0% (61 of 61 strings)
2016-09-15 21:52:16 +01:00
Valentin Seipt
e381b3fea5 Translated using Weblate (German)
Currently translated at 100.0% (8 of 8 strings)
2016-09-15 21:50:55 +01:00
FrancescoUK
49ed750045 Updated js plugin and regen dist files 2016-09-15 21:32:39 +01:00
FrancescoUK
1e1cfec94e Fixed misspelling of portuguese-brazilian in language selection causing an error (#624) 2016-09-15 18:06:21 +01:00
Weblate
713b88bbc4 Merge remote-tracking branch 'origin/master' 2016-09-15 14:13:13 +00:00
Weblate
811fdf9bc0 Merge remote-tracking branch 'origin/master' 2016-09-15 14:12:54 +00:00
Weblate
d40a43e1ca Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (89 of 89 strings)
2016-09-15 14:12:26 +00:00
Weblate
386057d544 Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (176 of 176 strings)
2016-09-15 14:05:02 +00:00
FrancescoUK
c60fcb171c Fixed login issue (#859 #862) 2016-09-14 03:35:30 +01:00
Weblate
11b1072151 Merge remote-tracking branch 'origin/master' 2016-09-13 22:08:09 +00:00
Weblate
036a711c53 Merge remote-tracking branch 'origin/master' 2016-09-13 22:07:21 +00:00
Joe Salty
ceaa378978 Translated using Weblate (Hungarian)
Currently translated at 100.0% (12 of 12 strings)
2016-09-13 22:06:24 +00:00
Joe Salty
83b4f9f8a8 Translated using Weblate (Hungarian)
Currently translated at 100.0% (89 of 89 strings)
2016-09-13 22:06:21 +00:00
Joe Salty
838df08eae Translated using Weblate (Hungarian)
Currently translated at 100.0% (22 of 22 strings)
2016-09-13 22:06:10 +00:00
Weblate
7dd1c9791d Merge remote-tracking branch 'origin/master' 2016-09-13 18:18:44 +00:00
Joe Salty
fc2094a9c3 Translated using Weblate (Hungarian)
Currently translated at 100.0% (8 of 8 strings)
2016-09-13 18:17:58 +00:00
Joe Salty
505ab59903 Translated using Weblate (Hungarian)
Currently translated at 100.0% (61 of 61 strings)
2016-09-13 18:17:46 +00:00
Weblate
1f169d8fab Merge remote-tracking branch 'origin/master' 2016-09-12 22:28:11 +00:00
Weblate
ebc1237ddc Merge remote-tracking branch 'origin/master' 2016-09-12 22:23:50 +00:00
Marcus Gustafsson
b1aa16f7a9 Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-12 22:21:49 +00:00
Marcus Gustafsson
3206bbb41d Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-12 19:48:10 +00:00
Marcus Gustafsson
3b559b056d Translated using Weblate (Swedish)
Currently translated at 100% (0 of 0 strings)

Created new translation.
2016-09-12 18:29:11 +00:00
FrancescoUK
cd0ef34f75 Log error if email sending fails (#772) 2016-09-12 19:18:05 +01:00
FrancescoUK
f89315a298 Log error if email sending fails (#772) 2016-09-12 19:16:48 +01:00
Valentin Seipt
4a4a7921d7 Translated using Weblate (German)
Currently translated at 100.0% (61 of 61 strings)
2016-09-12 14:04:41 +00:00
Weblate
691fa674c4 Merge remote-tracking branch 'origin/master' 2016-09-12 14:02:59 +00:00
Valentin Seipt
fe55841187 Translated using Weblate (German)
Currently translated at 100.0% (8 of 8 strings)
2016-09-12 14:01:07 +00:00
FrancescoUK
18d3f7db52 Merge branch 'jekkos/master' into composer 2016-09-11 23:12:06 +01:00
FrancescoUK
e3c538dbaf Statistics adjustment 2016-09-11 23:05:15 +01:00
FrancescoUK
d08b0b7ef4 Statistics adjustment 2016-09-11 23:02:36 +01:00
FrancescoUK
003d4de6be Statistics adjustment 2016-09-11 23:01:12 +01:00
FrancescoUK
b6bda3c3ed Print Composer Libraries License in Store Config (#624) 2016-09-11 20:53:51 +01:00
jekkos
71e1cb8fd0 Add badge with translation status 2016-09-09 14:48:34 +02:00
Jeroen Peelaerts
4139d53938 Translated using Weblate (Dutch (Belgium))
Currently translated at 100.0% (61 of 61 strings)
2016-09-09 07:53:30 +00:00
FrancescoUK
ffa5b4ddb7 Update .htaccess to cover subdomain cases and protect dir content (#624) 2016-09-08 18:14:43 +01:00
FrancescoUK
068f426c9e Merge branch 'jekkos/master' into composer 2016-09-08 12:56:01 +01:00
FrancescoUK
6f62085ba6 Update README.md 2016-09-08 12:19:19 +01:00
FrancescoUK
08e8209446 Add language key change to database upgrade script (#624) 2016-09-08 08:05:19 +01:00
FrancescoUK
ea7cc16cc9 Regen dist files 2016-09-07 20:28:26 +01:00
FrancescoUK
e3c9cddacb Merge branch 'master' into composer 2016-09-07 19:31:52 +01:00
FrancescoUK
aae1ce5329 Fixed deleted spaces when searching items (#838) 2016-09-07 17:12:50 +01:00
FrancescoUK
7350f4dc76 Fixed currency symbol encoding issue in invoice PDF (#839) 2016-09-07 17:06:47 +01:00
jekkos
da307fdfbd Fix currency symbol encoding in invoice PDF (#839) 2016-09-07 17:10:16 +02:00
FrancescoUK
9012006e84 Updated invoice pdf support Dompdf to 0.7.0 (#839) 2016-09-07 08:58:05 +01:00
jekkos
91b18d032f Replace DOMPDF, GaTracking with composer managed dependencies (#624)
Fix trim on search bug (#838)
2016-09-07 09:11:11 +02:00
FrancescoUK
b5f6fb124c Add DOMPDF version and license in the license dir 2016-09-06 08:48:39 +01:00
FrancescoUK
a5f16abbd5 Updated ISSUE_TEMPLATE.md and README.md 2016-09-06 08:31:54 +01:00
FrancescoUK
d319c5a73d Alternative fix to #833 2016-09-04 17:27:53 +01:00
FrancescoUK
f3270a545e Fixed no internet connection causing blank page (#833) 2016-09-03 10:23:58 +01:00
jekkos
9e01ca2e43 Merge branch 'master' into feature/composer 2016-09-02 17:58:03 +02:00
jekkos
c3316040bb Increase delay for autocomplete on item add form (#739) 2016-09-02 09:20:03 +02:00
jekkos
17084d8a8f Fix employee creation + use new hashing in dbscript init (#855) 2016-09-01 20:26:25 +02:00
jekkos
71e54d90bf Fix database init script + employee creation (#822) 2016-09-01 20:00:49 +02:00
jekkos
eb59079fe5 Regenerate sql scripts for hashing upgrade (#822) 2016-09-01 19:20:50 +02:00
jekkos
35f9904dbe Upgrade old MD5 password hashing (#822) 2016-09-01 19:12:08 +02:00
jekkos
ce2c83b3f9 Set minimum precision for low number of tax / price decimals (#766) 2016-09-01 18:15:55 +02:00
jekkos
c88de60a9f Make new config hook for loading stats 2016-09-01 08:53:06 +02:00
jekkos
2bf82e6472 Some additional statistics tweaks 2016-08-31 19:52:48 +02:00
FrancescoUK
3ce939ad20 Minor fixes 2016-08-30 18:01:05 +01:00
jekkos
96004f5699 Remove nominatim duplicates (#805)
Set default notification popup position to center bottom
2016-08-30 08:42:49 +02:00
jekkos
a2d2965785 Fix nominatim search suggestions + type in login (#805) 2016-08-29 23:30:41 +02:00
jekkos
3d15148b80 Fix broken js + css (regen with correct tags plugin version) (#809) 2016-08-29 23:00:15 +02:00
jekkos
31166c814e Stop submitting cancel form when hitting enter in invoice number field (#809) 2016-08-29 18:10:55 +02:00
jekkos
0ec94f1044 Regenerate dist files 2016-08-29 17:54:49 +02:00
jekkos
6e7b32cb1b Remove duplicate suggestions
Remove duplicate result suggestions in nominatim (#805)
2016-08-29 17:50:43 +02:00
jekkos
775c0cebf2 Some login (statistics) tweaks 2016-08-29 08:57:28 +02:00
jekkos
d67b33d996 Reorder inlined javascript
Regenerate licenses
2016-08-28 23:07:31 +02:00
FrancescoUK
375408a7a7 Amend COPYING license file 2016-08-28 12:39:00 +01:00
jekkos
7677c33ce1 Fix path to login.css (#624) 2016-08-25 17:38:56 +02:00
jekkos
a5b2c82395 Set grunt script link tags to master version for composer branch 2016-08-24 19:57:09 +02:00
jekkos
13587908f5 Merge branch 'feature/composer' of https://github.com/jekkos/opensourcepos into feature/composer 2016-08-24 19:48:37 +02:00
jekkos
9c3c283912 Adapt path Gruntfile 2016-08-24 19:48:28 +02:00
FrancescoUK
d290134a48 Merge branch 'master' into composer 2016-08-24 16:38:47 +01:00
FrancescoUK
057fdaea5d Remove unused old table icons 2016-08-24 16:06:35 +01:00
FrancescoUK
f440ff5e89 Fix Gruntfile.js and paths (#624) 2016-08-24 15:45:14 +01:00
jekkos
7f65b9cf2b Add COPYING to public/license directory 2016-08-24 16:28:29 +02:00
jekkos
e8a96054ee Merge branch 'master' into feature/composer
Conflicts:
	dist/opensourcepos.min.js
	public/license/LICENSES
2016-08-24 16:25:55 +02:00
jekkos
ad19dbc5ed Move COPYING to public/license in Gruntfile.js (#624) 2016-08-24 16:20:45 +02:00
jekkos
dc0245c4fb Merge branch 'feature/composer' of https://github.com/jekkos/opensourcepos into feature/composer 2016-08-23 18:28:50 +02:00
jekkos
e25c330dff Move COPYING to license/ folder
Add bower_components to .gitignore
Regenerate licenses
2016-08-22 13:37:09 +02:00
FrancescoUK
9a6bd6e000 Revert back bootstrap-select to version 1.10.0 (#813) 2016-08-19 18:54:41 +01:00
jekkos
e302086b13 Merge branch 'master' into feature/composer
Conflicts:
	.travis.yml
	application/controllers/Login.php
	application/views/partial/header.php
	public/dist/opensourcepos.min.js
2016-08-19 12:09:38 +02:00
FrancescoUK
45675b8f29 Copy COPYING file to license dir, update js plugin, regen dist files 2016-08-18 20:17:54 +01:00
jekkos
64d0483300 Fix environment variable in .travis.yml 2016-08-18 16:06:03 +02:00
jekkos
798246e589 Strip feature name branch from docker image tag 2016-08-18 14:01:47 +02:00
jekkos
2c1231ca61 Install CI langauges in system/language as before (#624)
Map CI language folder with ospos language code
2016-08-18 13:33:02 +02:00
jekkos
d6b009fba8 Fix build after rebase with master
Enable php socket extension in Dockerfile
2016-08-18 13:33:01 +02:00
jekkos
ad8d0821ad Correct license output directory in Gruntfile (#624) 2016-08-18 13:33:01 +02:00
jekkos
a6ba67e2fc Change project layout for composer (#624) 2016-08-18 13:33:01 +02:00
jekkos
9e1afd3f2b Push branch to new docker image tag 2016-08-18 13:32:59 +02:00
jekkos
43e7e353e7 Push branch to new docker image tag 2016-08-18 13:19:44 +02:00
jekkos
e4fc2ac06b Fix script-tag plugin version to use absolutePath option (#612) 2016-08-18 10:28:47 +02:00
jekkos
59bbe55215 Install CI langauges in system/language as before (#624)
Map CI language folder with ospos language code
2016-08-18 08:27:54 +02:00
FrancescoUK
6b63e381f9 Security fix: set OSPOS to be production code by default if CI_ENV is not set (#808) 2016-08-15 18:31:22 +01:00
jekkos
af6b323013 Fix build after rebase with master
Enable php socket extension in Dockerfile
2016-08-14 11:58:15 +02:00
jekkos
919e478184 Correct license output directory in Gruntfile (#624) 2016-08-14 11:58:15 +02:00
jekkos
3f34775000 Change project layout for composer (#624) 2016-08-14 11:58:15 +02:00
FrancescoUK
6e7da88f94 Further tweaking of README.md 2016-08-14 10:00:25 +01:00
FrancescoUK
cf1eec761b Further adjustments to README.md 2016-08-14 09:44:49 +01:00
FrancescoUK
b51022e93f Updated to README.md 2016-08-14 09:38:28 +01:00
FrancescoUK
2bda02dd74 Further bug fixes 2016-08-13 18:17:17 +01:00
FrancescoUK
01aeca579a Code refactoring and bug fixes 2016-08-13 14:07:27 +01:00
FrancescoUK
2555203a54 Arab translation amendments (#794) 2016-08-12 21:51:35 +01:00
FrancescoUK
4f5f875f1e Amend license files 2016-08-12 21:30:41 +01:00
FrancescoUK
b77d368885 Refactoring and statistics support 2016-08-12 21:23:26 +01:00
FrancescoUK
4b569d093b Made the password input glyphicons consistent across OSPOS (#731) 2016-08-12 10:13:43 +01:00
FrancescoUK
51bdfc050e Update Spanish translation (#750) 2016-08-11 22:26:18 +01:00
FrancescoUK
1b19fed206 Updated login page (#731) 2016-08-11 18:36:59 +01:00
FrancescoUK
3336d42245 Solved .bowerrc command line issue causing bower update to fail (#359) 2016-08-11 15:56:33 +01:00
FrancescoUK
6fdecbe619 Refactor Gruntfile.js bowercopy section (#409) 2016-08-11 14:38:08 +01:00
FrancescoUK
55764d7625 Updated Theme translation (#794) 2016-08-11 13:26:39 +01:00
FrancescoUK
dd8d848544 Updated Arabic (EG) and Portuguese (BR) translations (#794 #795) 2016-08-11 09:41:45 +01:00
jekkos
6203504976 Remove bootstrap 3.3.6 js from minified file (#489)
Cleanup dist/ folder (remove duplicated bootswatch themes)
2016-08-11 08:28:37 +02:00
jekkos
059ec54c72 Make theme configurable from config module (#409)
Add symlink to bower_components in Docker dev environment (#616)
Move header_debug content back into header view
2016-08-10 18:58:17 +02:00
jekkos
75567b9620 Fix bootstrap.min.css load in login and header (#409) 2016-08-10 17:16:00 +02:00
jekkos
1b859a8726 Manually install docker-compose in build environment (#616) 2016-08-10 16:00:44 +02:00
jekkos
1c02508759 Use docker environment from travis-ci (#616) 2016-08-10 15:49:20 +02:00
jekkos
4c337aa5c6 Try to fix travis docker setup + remove jquery validator override (#788, #616) 2016-08-10 15:26:18 +02:00
jekkos
523714c26a Run license generation only after bower install or uninstall (#359) 2016-08-10 14:47:01 +02:00
FrancescoUK
28e776248b Store all used stylesheets in dist dir, don't rely on css dir (#409) 2016-08-10 10:53:27 +01:00
FrancescoUK
333067955c Improved theme config option comment (#409) 2016-08-10 10:53:27 +01:00
FrancescoUK
a0886caf2f Added all bootswatch themes and made theming configurable from config.php (#409) 2016-08-10 10:53:27 +01:00
jekkos
31cc67ea52 Regenerate LICENSES with .bower.json first (#359) 2016-08-10 09:04:59 +02:00
jekkos
8b08bf5daa Add frontside support for locale dependent number validation (#788) 2016-08-09 18:20:52 +02:00
FrancescoUK
597a5caee5 XSS clean the license text (#359) 2016-08-08 16:09:40 +01:00
FrancescoUK
19403adde2 Read plugin LICENSES json and display in Store Config (#359) 2016-08-08 15:54:29 +01:00
FrancescoUK
119476ca74 Reorder license steps in Gruntfile.js (#359) 2016-08-08 10:04:43 +01:00
FrancescoUK
dd07b9fcb8 Add grunt license checker (#359) 2016-08-08 09:32:45 +01:00
jekkos
4a54dc7dc7 Add license plugin for grunt (#359) 2016-08-08 10:19:02 +02:00
FrancescoUK
e1f796cf99 Further refinement of ISSUE_TEMPLATE.md (#779) 2016-08-07 19:10:31 +01:00
FrancescoUK
266610399d Fixed Arabic (Egypt) translations (#756) 2016-08-07 17:07:17 +01:00
FrancescoUK
7602e77071 Refined ISSUE_TEMPLATE.md (#779) 2016-08-06 12:31:54 +01:00
FrancescoUK
bd7dd4741d Added a issue report template (#779) 2016-08-06 12:25:30 +01:00
FrancescoUK
3ed454d1b3 Fixed missing location_id error in Graphical Summary Tax report (#785) 2016-08-06 11:59:17 +01:00
FrancescoUK
2402da6e30 Added Arabic (Egypt) translations (#756) 2016-08-06 10:39:46 +01:00
FrancescoUK
c76109ab0a Update to Code Igniter 3.1.0 (#782) 2016-08-04 22:25:17 +01:00
FrancescoUK
fe5e99978c Upgrade always to the latest bootswatch flatly theme (provided is available on bootswatch-dist) 2016-08-04 21:45:25 +01:00
FrancescoUK
63a6706770 Fixed comment sentence that was unclear 2016-08-03 07:36:02 +01:00
FrancescoUK
4ea056e3f7 Fixed Item exists where issue (#666) 2016-08-02 17:25:49 +01:00
FrancescoUK
5f1d9e7f45 Fixed cart enter issue in receiving (#775) 2016-08-02 17:22:08 +01:00
jekkos
9fa2676352 Fix exists by doing string comparison using like clause (#666) 2016-08-01 13:58:07 +02:00
jekkos
76630365e7 Fix submit on enter for secondary sale lines (#771) 2016-08-01 13:27:45 +02:00
FrancescoUK
cbc42f7868 Upgraded to Bootstrap 3.3.7, dist file regen 2016-08-01 08:31:06 +01:00
FrancescoUK
fba0915c42 Fixed DB backup error due to & (#629) 2016-08-01 08:24:16 +01:00
jekkos
ab075fd94f Amount due can be negative as well (#733)) 2016-07-30 15:52:06 +02:00
jekkos
956f18e55c Round amount due before comparing with zero (#759)
Bump version chartist tooltip
2016-07-30 10:23:30 +02:00
jekkos
05628ddaff Add common error message to README FAQ (#764) 2016-07-26 11:23:08 +02:00
jekkos
2519d0fb20 Don't send totals row to server for delete (#686)
Replace mysql with mariadb in docker images (#616)
2016-07-26 08:40:54 +02:00
jekkos
28129ef075 Set calculation precision to currency + tax decimals (#759) 2016-07-25 21:28:56 +02:00
jekkos
0727ae06af Regenerate language files (#750) 2016-07-25 18:05:06 +02:00
sonnysk76
0efc49f713 es lang update 2016-07-25 18:05:06 +02:00
jekkos
352586531f Fix graphical items summary report (#742) 2016-07-25 17:37:54 +02:00
jekkos
745874f0b3 Fix graphical items summary report (#742) 2016-07-21 01:41:22 +02:00
jekkos
d8e4bf48d8 Check if payments cover sale with exact precision (#733)
Set bc-operation style scale globally
Add location filtering in graphical and summary reports (#742)
2016-07-20 20:43:31 +02:00
jekkos
4be3c8f433 Revert "Check if payments cover total using currency decimals configuration"
This reverts commit 9a7061e9c5.
2016-07-17 14:51:55 +02:00
jekkos
9a7061e9c5 Check if payments cover total using currency decimals configuration
(#733)
2016-07-17 14:11:06 +02:00
jekkos
2743e1353a Escape dollar sign when using varargs version of lang::line (#732)
Properly handle decimals when saving giftcards (#458)
2016-07-17 13:16:57 +02:00
jekkos
75db191baf Fix notification popup for fresh installs
Fix docker setup by compiling php5-intl (#616)
2016-07-17 12:52:38 +02:00
FrancescoUK
a66868651b Update js plugins and regen dist files 2016-07-15 20:47:09 +01:00
FrancescoUK
68deca1537 German (Germany) translation added (#743) 2016-07-15 14:56:14 +01:00
jekkos
1af612d18e Add thousands separator option (#458)
Fix adding payment with comma as decimal separator (#740)
2016-07-15 11:22:31 +02:00
jekkos
cfdbd01dac Update FAQ in README.md (#741) 2016-07-14 09:51:43 +02:00
jekkos
d88b51794e Fix employee module in french (#735) 2016-07-14 09:43:39 +02:00
FrancescoUK
c9d806bd26 Fixed mistake with Giftcard (#732) 2016-07-12 16:59:23 +01:00
FrancescoUK
39d678b977 Fixed Register issue with Giftcard (#732) 2016-07-11 19:05:06 +01:00
FrancescoUK
a0e894895e Fix typos (#359) 2016-07-10 17:38:53 +01:00
FrancescoUK
09a3499069 Added license statement displaying, updated COPYING and other license files (#359) 2016-07-10 15:50:25 +01:00
FrancescoUK
86b32240d3 Adjusted login and header title line, updated spacelab footer.php 2016-07-10 10:30:44 +01:00
FrancescoUK
0924a0f433 Revert "Move create_temp_table to Reports Controller constructor out of Model one" (#729)
This reverts commit dc06119586.
2016-07-09 12:50:17 +01:00
FrancescoUK
55f7bef253 Added go to Sales Register button in Takings 2016-07-09 10:15:13 +01:00
FrancescoUK
38d234fa5f Fixed receipt, change due and total cash issues with no payment cases (#707) 2016-07-09 10:04:04 +01:00
FrancescoUK
120b2bbc6e Remove unnecessary tabs from config.php 2016-07-08 17:12:41 +01:00
FrancescoUK
a3704f9b12 Make inventory to support decimal quantity on transactions logging (#726) 2016-07-08 17:12:41 +01:00
jekkos
c82e9e4929 Correct container names in travis.yml 2016-07-08 15:45:14 +02:00
FrancescoUK
7f169222d0 Little locale_helper improvement and regen database scripts (#458) 2016-07-08 09:49:22 +01:00
jekkos
21f5e46488 Fix tax percentage parsing (#458, #727)
Add tabindexes to price, discount field in register
2016-07-08 08:47:03 +02:00
jekkos
ef2cd9d001 Update Readme and travis config (#616) 2016-07-07 21:39:41 +02:00
jekkos
72efafdc50 Add back quantity_decimals() function for inventory / stock forms (#458) 2016-07-07 21:34:23 +02:00
jekkos
0f88d6462d Add fixes for register + receiving validation (#458) 2016-07-07 21:11:33 +02:00
jekkos
3af19daa0e Fix decimal parsing, add php5-intl locale support (#458) 2016-07-07 20:56:51 +02:00
jekkos
f11c2d7a4d Move init sql to data only container (#616)
Update travis config to build new setup
Add git sha-1 to ospos version string
2016-07-07 14:05:56 +02:00
jekkos
be2bac84f1 Fix export in inventory reports (#503) 2016-07-07 09:27:05 +02:00
FrancescoUK
dc06119586 Move create_temp_table to Reports Controller constructor out of Model one 2016-07-06 19:37:23 +01:00
FrancescoUK
0cbd19353c Rename temp table creation functions to simply be create_temp_table 2016-07-06 19:22:32 +01:00
FrancescoUK
3c969858cf Performance improvement for Inventory reports after XSS clean addition (#39) 2016-07-06 19:11:54 +01:00
FrancescoUK
fbba5ea2c5 Reduced font size to 13px from 14px, regen dist files (#722) 2016-07-06 13:53:45 +01:00
FrancescoUK
6d8c3b94e0 Protect .txt files access in .htaccess 2016-07-06 10:12:49 +01:00
FrancescoUK
b3a1259861 Protect .csv file access in .htaccess, made spacelab header.php consistent with default one 2016-07-06 09:30:26 +01:00
FrancescoUK
a74e7565bf Change " to ' in sale model queries 2016-07-05 22:21:12 +01:00
FrancescoUK
df6f118a79 Fixed search customer bug in sales Takings (#654) 2016-07-05 21:51:39 +01:00
jekkos
f04cbc9674 Fix delete for most controllers (#721) 2016-07-05 22:19:32 +02:00
FrancescoUK
3cff918f81 Inverted Sales register New Items New and Submit buttons 2016-07-05 20:28:32 +01:00
FrancescoUK
5be0feafe9 Inverted Sale edit form Delete and Submit buttons 2016-07-05 20:24:52 +01:00
FrancescoUK
4618af352c Fixed New button in items form: visible in New Item not Edit/Update Item 2016-07-05 20:20:33 +01:00
FrancescoUK
81d1aa7873 Added partial/header_debug, upgraded grunt script, regen dist with updated js plugins 2016-07-05 19:13:27 +01:00
jekkos
8002694c96 Make csrf token generation more generic using dataFilter in ajaxSetup (#597, #599) 2016-07-05 17:53:11 +02:00
jekkos
5de3f17af8 Show error message if avatar dimensions exceed allowed maximum (#696) 2016-07-05 08:22:09 +02:00
jekkos
1b5105f3af Remove unnecessary hook with csrf setup (#599, #597) 2016-07-04 23:36:08 +02:00
jekkos
7b674b2e3f Fix submit in items, customers and sales (#716)
Add again new button functionality in items (#712)
Bugfixes for csrf tokens (#599)
2016-07-04 23:20:14 +02:00
FrancescoUK
01486fd41e Fixed translation strings typos in datepicker_locale 2016-07-04 18:59:56 +01:00
FrancescoUK
a69194745e Fixed template header issues (#714), and email_config tab js issue 2016-07-04 18:12:20 +01:00
jekkos
90660fd9e9 Fix close button in stock details (#14) 2016-07-04 18:03:25 +02:00
jekkos
bb1a1ccd62 Fix table_helper after bad merge 2016-07-04 17:45:08 +02:00
jekkos
806c1b9986 Add csrf token in forms (#599, #597) 2016-07-04 17:38:58 +02:00
FrancescoUK
0ba5cadbb7 More models/Sale refactoring, fix button order in sales/form, make inventory count button a close one 2016-07-03 20:23:06 +01:00
FrancescoUK
5b81ee1b1d Added config_email_configuration translation (#713) 2016-07-03 18:29:25 +01:00
FrancescoUK
c136832db1 Fixed issue with negative tendered amount in sales (#707), improved sales_items_temp table and usage in various parts 2016-07-03 14:07:46 +01:00
FrancescoUK
d8beedf1f7 Small code optimisation: review for loops (#709) 2016-07-01 19:12:48 +01:00
FrancescoUK
4d6a665e04 Small code optimisation: use strtr instead of str_replace (#709) 2016-07-01 18:58:40 +01:00
FrancescoUK
201e26e521 Small code optimisation: pre increment is faster than post increment (#709) 2016-07-01 18:58:04 +01:00
FrancescoUK
b7cb5c5873 make consistent use of elseif in place of else if 2016-07-01 17:08:01 +01:00
FrancescoUK
5cb755b0e3 Added common_close translation (#705) fixed datepicker_lang translation 2016-07-01 09:11:36 +01:00
FrancescoUK
43da232557 Tidy up time conversion utility functions 2016-06-30 15:32:43 +01:00
FrancescoUK
06c74045be Make full use of moment.js for wall clock functionality. Update templates/spacelab header.php 2016-06-30 11:11:19 +01:00
jekkos
ad54e759f0 Add badge for bower dependency status 2016-06-28 22:42:12 +02:00
jekkos
163726abae Fix docker cloud deploy button (#616) 2016-06-28 20:08:05 +02:00
jekkos
6a108866f5 Remove volume from docker-compose test file (#616)
Update docker-cloud to mount init script directly
2016-06-28 19:25:50 +02:00
jekkos
608b2ec075 Add version + dependency badges 2016-06-28 13:47:36 +02:00
FrancescoUK
7682f02222 Removed language="javascript" as deprecated 2016-06-27 21:04:27 +01:00
FrancescoUK
7c65484ada Fixed daterangepicker translation 2016-06-27 16:33:52 +01:00
FrancescoUK
163732b87f Drop and recreate completely session table with new structure 2016-06-27 16:15:14 +01:00
FrancescoUK
dd2dc7312c Drop session table's primary key, change introduced with CI3.0.6 to prevents conflicts if sess_match_ip is set to TRUE 2016-06-27 15:57:20 +01:00
FrancescoUK
586c8f8db9 Added support for receipt templates, added default and short version (#678) 2016-06-26 20:06:37 +01:00
FrancescoUK
0293b6dbd8 Brazilian Portuguese translations updated (#650) 2016-06-26 18:33:18 +01:00
FrancescoUK
d62af2a007 Limit string length of barcode strings (#692) 2016-06-26 18:21:05 +01:00
FrancescoUK
6466a71c0a Removed all the character_limiter affecting tabular views (#692) 2016-06-26 12:20:35 +01:00
FrancescoUK
d2d9aae9ce Regen dist files 2016-06-26 12:06:09 +01:00
FrancescoUK
362b32357f Complete translation support with dropdowns and Store Config pages (#439) 2016-06-25 19:43:53 +01:00
FrancescoUK
4b64269905 Fixed regression introduced with button translation support change (#699) 2016-06-25 16:06:59 +01:00
jekkos
e25ce12e55 Only mount uploads folder as docker volume (#616)
Remove base64 jQuery plugin (#684)
2016-06-25 12:36:36 +02:00
FrancescoUK
b76d4526de Renamed prefix recvs_ to be the extended version receivings_ matching the Controller name (#439) 2016-06-25 09:39:04 +01:00
FrancescoUK
1affe3c093 Strip html tags from image upload error message (#696) 2016-06-25 09:32:01 +01:00
jekkos
57759d2775 Make bootstrap dialog buttons translatable (#439)
Update deploy instructions in Readme (#616)
Add partial views to load CI translations in javascript (#439)
2016-06-25 01:54:54 +02:00
FrancescoUK
6744ad1891 Brazilian Portuguese translation updates (#650) 2016-06-24 18:42:28 +01:00
FrancescoUK
d378cfdb5f New look for the Reports listing page, code tidy up, dist regen (#695) 2016-06-24 17:55:10 +01:00
FrancescoUK
6d012144db Removed unreferenced code in Sales Controller (#475) 2016-06-23 23:34:25 +01:00
FrancescoUK
d911447b43 Fixed wrong recvs_invoice_number usage in sales receipt (#694) 2016-06-23 23:08:43 +01:00
jekkos
0bd74b9df5 Update README.md for deployment (#616) 2016-06-23 23:41:47 +02:00
jekkos
725d447ab3 Add instructions to deploy to docker cloud (#616)
Use environment variables in database.php to read settings for contianer
2016-06-23 23:37:30 +02:00
FrancescoUK
413fef4c6f Don't lose disabled setting on email config submit (#441) 2016-06-23 20:45:07 +01:00
FrancescoUK
6c9c28bd28 Brazilian translation of Receiving Reference addition (#635) 2016-06-23 19:41:46 +01:00
FrancescoUK
331d97b48f Added email config to Store Config, added Email_lib, refactored email code (#441, #519) 2016-06-23 19:26:51 +01:00
FrancescoUK
cf860be1fc Small refactoring of library classes 2016-06-23 18:12:18 +01:00
FrancescoUK
2ca3911d56 No autoload and refactoring of SMS lib and Message Controller to be consistent with the rest of libraries (#693) 2016-06-23 09:05:30 +01:00
FrancescoUK
67a2912537 Allow Giftcard to do not have customer assigned (#689) 2016-06-22 22:47:25 +01:00
jekkos
9119c16c49 Correctly link container files in docroot (#616) 2016-06-22 08:49:34 +02:00
jekkos
7e56617044 Add volumes directly in Dockerfile and symlink to docbase (#616) 2016-06-22 08:38:50 +02:00
jekkos
d72bddbd9d Export data with controller filename (#684)
Upgrade table export plugin to newer fork
Fix variable substitution in .travis.yml (#616)
2016-06-21 23:19:05 +02:00
FrancescoUK
de9a4dac08 Fixed failures in updated rows in Suppliers and Report Detailed Receivings (#683) 2016-06-21 20:33:54 +01:00
jekkos
9bada9e18e Push to docker hub if username is defined (#616) 2016-06-21 21:33:25 +02:00
jekkos
b87f50aedf Fix malformed .travis.yml (#616) 2016-06-21 21:22:08 +02:00
FrancescoUK
04fdbfb187 Made ospos XSS clean optional and configurable from application/config/config.php (#39)
Performance improves if set to FALSE but should be only for pure stand alone and isolated from Internet cases.
2016-06-21 18:34:24 +01:00
FrancescoUK
9a1def21cc Code tidy up (#635) 2016-06-21 18:34:24 +01:00
jekkos
0b423f5828 Add utf-8 compatible base64 dependency (#649)
Don't push to docker hub if no login information set (#616)
2016-06-21 16:29:56 +02:00
FrancescoUK
e4988d806f Made sale invoice email send consistent with receipt (#475) 2016-06-21 09:10:05 +01:00
FrancescoUK
e9fe27a59e Further fix of email receipt regression (#475) 2016-06-21 09:07:12 +01:00
FrancescoUK
e56f418696 Fixed email receipt regressions (#475) 2016-06-21 08:56:29 +01:00
FrancescoUK
bb85a172a2 Change invoice_number in Receiving to be Reference, tidy up code (#635) 2016-06-21 08:50:11 +01:00
jekkos
4cf1c31d4f Remove padding for comments field in register (#680)
Properly align checkboxes in right lower corner (#680)
Add fix for bootstrap-tables delete and regen dist (#627)
Tidy up receipt email send code (use empty instead of isset)
2016-06-21 08:40:56 +02:00
FrancescoUK
15fd832705 XSS clean Receiving (#39) code refactoring and various issues fixing 2016-06-20 22:22:46 +01:00
jekkos
17dcd3fdb2 Tag docker image with branch name after build (#616)
Add docker cloud stack config file
2016-06-20 22:54:01 +02:00
jekkos
8aa46126c5 Use bootstrap grid for payment options in sale register (#116)
Short review of receipt/invoice email send (#475)
2016-06-20 21:30:58 +02:00
FrancescoUK
6c791afffc Fixed Item Kits comment typos and small refactoring (#665) 2016-06-19 21:07:10 +01:00
jekkos
6c6e41495c Fix item kit barcode generation (#665) 2016-06-19 19:15:09 +02:00
FrancescoUK
a4488ec090 Further regression fix with item edit and deleted flag (#672) 2016-06-19 12:58:47 +01:00
FrancescoUK
c75675129b Fixed typo in Barcode 39 exception message 2016-06-19 12:47:20 +01:00
FrancescoUK
ac968e21e6 Additional tidy up (#667) 2016-06-19 12:35:52 +01:00
FrancescoUK
ad1b3aeaac Allowed search box and filters to be contextual to selected date range (#667) 2016-06-19 11:57:53 +01:00
FrancescoUK
8c5decee34 Fix regression introduced with #664 around deleted items (#672) 2016-06-19 11:11:16 +01:00
FrancescoUK
bbbf24c2a5 Don't allow adding deleted Items by item_id in Sales register and Receiving (#664) 2016-06-18 12:52:58 +01:00
FrancescoUK
936c74211f Small refactoring of Sales form (#639) 2016-06-18 11:46:45 +01:00
jekkos
fdb5e3406e Fix syntax erorr in is_valid_receipt (#655) 2016-06-17 18:09:03 +02:00
jekkos
359184934e Fix refresh after deleting all items on last page (#627) 2016-06-16 23:11:40 +02:00
jekkos
776c819509 Tag docker image and push to docker hub (#616) 2016-06-16 23:11:40 +02:00
FrancescoUK
1c4f6f4fb3 Update daterangepicker in bower no dist regen 2016-06-16 19:13:35 +01:00
FrancescoUK
28d3a3dce3 Fixed error with barcode auto generate (#640) 2016-06-16 19:13:35 +01:00
jekkos
fb4dc5af84 Remove curl call to wait for container (#616) 2016-06-16 20:04:29 +02:00
FrancescoUK
26358620eb Fixed bug with barcode auto generation (#640) 2016-06-16 17:54:12 +01:00
jekkos
105eca20b2 Update portugese (brazilian) translations (#650) 2016-06-16 17:49:45 +02:00
jekkos
9e675e81ec Perform regex check in is_valid_receipt (#655) 2016-06-16 17:40:26 +02:00
jekkos
86b22e7987 Make travis build regular dockerFile directly (#616) 2016-06-15 20:42:29 +02:00
jekkos
c39e0a2ed4 Copy curl into test container (#616) 2016-06-15 18:42:49 +02:00
jekkos
1cadd2b06b Run docker-compose up in background (#616) 2016-06-15 17:57:04 +02:00
jekkos
6b5d61414c Enable item kit return (#655)
Don't install curl in test container (#616)
2016-06-15 17:34:39 +02:00
jekkos
3890eaf162 Show general config error messages in the correct place (#655) 2016-06-15 17:18:32 +02:00
jekkos
4b0badfb30 Fix customer search in takings (#654)
Replace payment type label with amount tendered (#513)
2016-06-15 17:18:31 +02:00
jekkos
1861f4f71f Don't take totals row in takings into account for pagination (#620)
Reset payment summary css position underneath table
2016-06-15 17:18:31 +02:00
jekkos
3129319efe Try to start test container as travis-ci test (#616) 2016-06-15 14:24:01 +02:00
jekkos
1392055d44 Adapt default test container command (#616) 2016-06-15 14:22:24 +02:00
jekkos
4119d8d5a8 Build image using docker-compose (#616) 2016-06-14 12:50:34 +02:00
jekkos
5d494fa08e Fix bstables pagination when deleting all items in last page (#627) 2016-06-14 08:35:14 +02:00
FrancescoUK
3a5b88d51c Added configuration order of payment options available in Sales Register (#456 #646) 2016-06-13 19:39:02 +01:00
FrancescoUK
11ad1c2476 Regen dist files 2016-06-13 18:58:17 +01:00
FrancescoUK
17443a3d4f Fixed ugly invoice issue (#442) and added company name in invoices always 2016-06-13 18:33:40 +01:00
FrancescoUK
9dc7405eaa How to remove index.php from URL (#645) + set a config rule to be strict with sessions matching IP 2016-06-13 17:54:31 +01:00
FrancescoUK
cd6277c1a8 Removed use_invoice_template as it's not used anymore (#639) 2016-06-13 09:15:43 +01:00
FrancescoUK
73dc5a9f70 Merge branch 'sonnysk76-master' 2016-06-12 18:55:31 +01:00
FrancescoUK
4da7285f38 Update Spanish Translations #569 2016-06-12 18:54:42 +01:00
FrancescoUK
b96ebeed22 XSS clean Sales (#39), refactored Sales Controller (#639), added Send Email in Receipt & Invoice (#475) 2016-06-12 18:15:43 +01:00
jekkos
edfd0319a8 Update docker on travis using sudo (#616) 2016-06-11 20:39:58 +02:00
jekkos
facc25eb74 Set travis docker version to 1.10.3 (#616)
Fix typo in README.md
2016-06-11 20:29:24 +02:00
jekkos
b7f54c0366 Fix .travis.yml file structure 2016-06-11 18:51:58 +02:00
sonnysk76
9f7ea6f1cb merging 2016-06-10 16:58:26 -05:00
jekkos
aae02dc060 Disable invoice creation after sale / receiving completion (#619) 2016-06-09 22:29:41 +02:00
jekkos
e6c173dcdc Merge branch 'master' of https://github.com/jekkos/opensourcepos 2016-06-09 20:40:30 +02:00
jekkos
0923ed0f80 Enable receiving invoice number override (#626) 2016-06-09 20:39:38 +02:00
FrancescoUK
1ad844fe74 Fixed Customer Account # issue (#633) 2016-06-09 19:31:41 +01:00
jekkos
9fb4d5ccd4 Fix email button enabled state (#628) 2016-06-09 17:55:35 +02:00
jekkos
463938bc88 Upgrade travis docker-compose to 1.7.1 (#616) 2016-06-09 17:21:20 +02:00
jekkos
9d25520dbf Add docker service to travis.yml (#616) 2016-06-09 16:52:57 +02:00
jekkos
03bfa43378 Push docker build to travis-ci if container start is ok (#616) 2016-06-09 10:51:06 +02:00
FrancescoUK
b72d1059c0 Do not restrict Message Store Config access by user grants (#472) 2016-06-09 08:53:07 +01:00
FrancescoUK
fc81e842c2 Made Items and Customers excel import strings translatable (#439) 2016-06-09 08:49:14 +01:00
FrancescoUK
53b220b10b Fixed excel import notifications (#478) 2016-06-08 22:31:25 +01:00
FrancescoUK
5129ebec0c XSS clean Items (#39) 2016-06-08 21:58:18 +01:00
jekkos
a41a39aa0b Try to bump docker version in travis config (#616) 2016-06-08 22:56:23 +02:00
jekkos
0aa17d6374 Update docker installation instructions (#616) 2016-06-08 22:46:18 +02:00
jekkos
bced04ca88 Split up exsiting docker image in mulitple containers (mysql, php-apache, npm) (#616)
Add company_name to searchable fields in Takings overview (#594)
Change tests to use elementBy instead of wait functions
2016-06-08 22:36:33 +02:00
FrancescoUK
6d0ed7cc99 Removed redundant code in Controllers (#39) 2016-06-08 19:57:50 +01:00
FrancescoUK
336e10d445 Controller class hierarchy refactoring, made xss_clean part of base Secure_Controller class (#39) 2016-06-08 18:13:34 +01:00
FrancescoUK
5cf23f2bd3 Disabled bootstrap_tables XSS escaping support since we leverage CI one (#39) 2016-06-08 11:25:53 +01:00
FrancescoUK
fe845692bf Added SQL upgrade script since 2.0 based on forum history (#621) 2016-06-07 17:07:24 +01:00
FrancescoUK
7980b12239 Disable bootstrap tables escaping, tidy up of Reports unused code (#39) 2016-06-07 17:00:46 +01:00
FrancescoUK
9248ffd044 XSS clean Reports (#39) 2016-06-06 22:36:07 +01:00
FrancescoUK
da96edf304 XSS clean Messages, tidied up Home, Login, No_access and Secure_area, removed unused Controllers (#39) 2016-06-04 16:42:54 +01:00
FrancescoUK
b11377041d XSS clean Customers, Employees, Suppliers, Person, Item_kits. Minor fix Giftcards and Config (#39) 2016-06-04 15:05:02 +01:00
sonnysk76
fa01e18e41 Spanish lang review 2016-06-03 13:43:46 -05:00
FrancescoUK
1453b5e21d Fixed return of only invoice receipt if the searched number matches an invoice, disable the invoice search if not set in config (#606) 2016-06-03 19:23:43 +01:00
FrancescoUK
7e6908b7bf Fixed SMS message view notifications (#478) 2016-06-02 19:07:07 +01:00
FrancescoUK
eb9c04c774 Item image hover width size set to 200 and image displaying on the left of the mouse (#596) 2016-06-02 18:37:33 +01:00
FrancescoUK
fdb7cd9ac4 Updated bootstrap-daterangepicker js plugin and regen dist files 2016-06-02 12:33:33 +01:00
FrancescoUK
5e42684f27 Added default values to tables.sql and regen dist files (#478) 2016-06-02 12:22:37 +01:00
FrancescoUK
f8ef4bb570 Tidied up spacelab template footer.php after notification change (#478) 2016-06-02 12:04:46 +01:00
jekkos
b6822b040c Add configuration options for notification alignment (#478)
Fix country code edit bug (#497)
Review xss filtering in load_config hook (#39)
2016-06-02 08:50:45 +02:00
jekkos
7c05b62cf0 Immprove Dockerfile (use proper layer caching) 2016-06-01 23:28:49 +02:00
jekkos
d2f3497d1e Fix item avatar rollover when hovering (#596)
Fix invoice right border (add colspan) (#529)
Fix form erorr handling (inherit in right order)
2016-06-01 08:39:03 +02:00
jekkos
998e9bbb8e Fix notify alert type for config screens + fix message notification (#478) 2016-05-31 08:33:34 +02:00
jekkos
8c6bba62c9 Fix row table update in takings, customers, .. (#575, #604)
Update spacelab header (#226)
2016-05-31 08:22:59 +02:00
FrancescoUK
0a6b3d5785 XSS clean Giftcard (#39) 2016-05-30 20:46:59 +01:00
FrancescoUK
9f7457e1de XSS clean Config and configuration data loading (#39) 2016-05-30 20:46:59 +01:00
FrancescoUK
6e9830705f Removed any XSS filtering from input->post and input->get (#39) 2016-05-30 20:46:59 +01:00
jekkos
b904540aed Replace notifications with bootstrap-notify (#478)
Add bstables responsive addon (#558)
Improve bulk update refresh (#432, #604)
Fix bulk tax update if default tax is configured in general_config
Reuse commons js parts in form validation code
2016-05-30 21:43:11 +02:00
jekkos
fc5aa33d16 Do full refresh if item update count is > 15 & fix bulk update modal when clicking on glyphicon (#432) 2016-05-30 21:41:07 +02:00
FrancescoUK
1968b598a4 Fixed pie slices colour range limited to 15, now random (#603) 2016-05-29 21:52:01 +01:00
FrancescoUK
6ad547049e Further model checks, improved success result, made code style consistent (#598) 2016-05-29 15:04:21 +01:00
FrancescoUK
5d66b9fbfd Do not show 'Send SMS' glyphicon, if phone number is not available (#602) 2016-05-28 23:05:03 +01:00
FrancescoUK
404fc5b548 Sanity checked SQL escaping in all the models, improved code under different aspects (#598) 2016-05-28 22:41:27 +01:00
FrancescoUK
6fe1e2a55a Added escaping of inputs in all Report models (#598) 2016-05-27 19:38:28 +01:00
FrancescoUK
6e14dfb6d5 Sanity checked SQL insert and update, minor fixes (#598) 2016-05-27 18:40:16 +01:00
FrancescoUK
ce3e96ef5b Updated bootstrap-daterangepicker to vs 2.1.20, regen dist files 2016-05-26 19:24:31 +01:00
FrancescoUK
1e7e73f482 Fixed issue with summary section introduced by sharing common id with chart one (#342) 2016-05-26 19:16:19 +01:00
FrancescoUK
a5f63d1cc0 Do proper XSS sanity check with excel files (#39) 2016-05-26 18:41:59 +01:00
FrancescoUK
e4cb04fd3e XSS sanity check of uploaded images or excel files (#39) 2016-05-26 18:29:33 +01:00
jekkos
472ce16528 Fix item kit save 2016-05-26 18:10:58 +02:00
jekkos
1b7bf0ed4f Fix bulk update refresh (#432) 2016-05-26 18:10:58 +02:00
jekkos
9f380bc083 Push to docker registry if build successful 2016-05-26 17:30:00 +02:00
jekkos
8671a59b4b Add git working tree directly to container root 2016-05-26 17:02:55 +02:00
FrancescoUK
e9e5a3e475 Fixed charts responsiveness and Summary placement (#342) 2016-05-26 10:36:25 +01:00
FrancescoUK
9ae5957473 Made currency showing configurable from the controller (#342) 2016-05-25 23:10:43 +01:00
FrancescoUK
3c25a9ba8d Fixed currency support in pie chart (#342) 2016-05-25 22:59:39 +01:00
FrancescoUK
ec5fbc16b5 Added currency to hbar (#342) 2016-05-25 22:46:40 +01:00
FrancescoUK
5531f7fa9e Added tooltip support to charts, regen dist files (#342) 2016-05-25 22:31:58 +01:00
FrancescoUK
9137c89fb7 Made message string URL encoded (#472) 2016-05-25 18:07:43 +01:00
jekkos
5c42604fa7 Set correct casing for pt-BR in customers_lang.csv + delete duplicate folder (#576) 2016-05-24 22:29:01 +02:00
jekkos
fecb2163ea Update config_lang.csv with correct number of translations (#497)
Update country_code tooltip css
Remove tables.css
2016-05-24 17:46:40 +02:00
FrancescoUK
3e44c7caf5 Fixed line chart (was broken), fixed dimensions of charts, regen dist files (#342) 2016-05-24 12:14:01 +01:00
FrancescoUK
719a0e6107 Fixed nominatim.autocomplete.js typo (#497) 2016-05-24 12:02:20 +01:00
FrancescoUK
cd1ec7a5d6 Fix typo in comment (#342) 2016-05-24 08:38:09 +01:00
jekkos
0aadbc0467 Add link to nominatim wiki for countrycodes tooltip (#497)
Increase waitForCssElement timeout
2016-05-24 08:25:17 +02:00
jekkos
63d6ac59df Fix suppliers + employees graphical summary report (#587) 2016-05-23 22:43:45 +02:00
jekkos
2475bfa609 Fix taxes graphical summary report (#587) 2016-05-23 22:41:20 +02:00
jekkos
609aef0a87 Make nominatim countrycodes configurable (#497) 2016-05-23 22:40:46 +02:00
jekkos
0a16ffcd39 Set height for charts to 80% (#342)
Fix encoding issues for chartist data
2016-05-23 18:33:53 +02:00
jekkos
457a1df478 Correct test url context root 2016-05-23 11:50:16 +02:00
jekkos
3c0dcb20ac Use standard php functionality for json encoding (#342) 2016-05-23 08:46:17 +02:00
jekkos
07fbffab08 Fix receiving quantity testcase 2016-05-23 08:45:10 +02:00
FrancescoUK
bd208c6d0d Moved chart styles to reports.css (#342) 2016-05-22 21:07:11 +01:00
FrancescoUK
41e4285d65 Removed flash library and dependencies, regen dist file (updagraded js plugins) (#342) 2016-05-22 19:59:26 +01:00
FrancescoUK
cfacf52a42 Changed graphical reports to use Chartist (#342) 2016-05-22 19:01:16 +01:00
FrancescoUK
17bc62d94b Added Chartist js extra plugins and regen dist (#342) 2016-05-21 15:01:15 +01:00
FrancescoUK
fa84adc536 Added Chartist js plugin and regen dist (#342) 2016-05-21 12:07:50 +01:00
jekkos
35b12df144 Remove empty column from columns dropdown in detailed sales/receivings reports (#571) 2016-05-20 17:35:07 +02:00
jekkos
ec20eb96df Add refresh after enter in sales and receivings register (#572) 2016-05-20 17:28:56 +02:00
jekkos
41b3d00fb2 Add modal init in postBody bstables callback (#563) 2016-05-20 17:17:12 +02:00
FrancescoUK
671f6d9e16 Delete wrong pt-Br files (#576) 2016-05-20 14:03:44 +01:00
jekkos
f2293297ce Enable modals after sort detailed table (#571) 2016-05-20 07:41:50 +02:00
FrancescoUK
0d0ecd90d3 Updated Portuguese (Brazil) translations (#567) 2016-05-19 18:56:52 +01:00
FrancescoUK
9b55205f0f fixed detailed customer report error (#571) 2016-05-19 17:27:41 +01:00
jekkos
5122dad996 Fix table sorting in detailed (specific) reports (#571) 2016-05-19 17:41:04 +02:00
jekkos
7178f8b02b Fix table details association after sort in detailed sales + receivings reports (#571) 2016-05-19 12:46:18 +02:00
jekkos
9762193ce0 Fixup register css (block and alert widths) 2016-05-19 08:57:54 +02:00
jekkos
2746a0ef03 Uppdate testcase and make them ospos 3.0 compliant 2016-05-18 23:02:02 +02:00
jekkos
ea77980bff Persist column visbility per user and per module (#563) 2016-05-18 08:49:28 +02:00
sonnysk76
bde97b3ec8 Update languaje ES on csv 2016-05-17 13:48:01 -05:00
sonnysk76
becab02bce lang1 esp 2016-05-17 12:19:13 -05:00
jekkos
fc2d5e89f0 Remove empty column switches in dropdown (switchable on column header) (#563) 2016-05-17 08:59:51 +02:00
FrancescoUK
31dd09e09b Removed unused excel header & footer, removed obsolete style classes (#528) 2016-05-16 19:03:20 +01:00
jekkos
c83a46c726 Add change due to sale totals row + remove checkbox after load (#559) 2016-05-16 11:23:06 +02:00
jekkos
20baece7c5 Fix detailed reports for employee, customer and discount (#564) 2016-05-16 11:23:06 +02:00
FrancescoUK
92b88bed20 Merge branch 'master' into bootstrap-tables 2016-05-14 12:22:00 +01:00
FrancescoUK
45b498924c fix gitter chat badge in README 2016-05-14 12:18:41 +01:00
FrancescoUK
fc7735ab03 Merge pull request #549 from gitter-badger/gitter-badge-1
Add a Gitter chat badge to README.md
2016-05-14 12:00:33 +01:00
jekkos
e07ee6a505 Refresh after delete only if animations are finished (#554) 2016-05-13 17:07:14 +02:00
jekkos
e0fdb7ed80 Uncheck all checked inputs after table refresh (#554) 2016-05-13 08:52:45 +02:00
jekkos
cbb562add2 Fix table row update in employees and other (#556) 2016-05-13 08:26:09 +02:00
jekkos
7e8f0e1dc1 Enable sorting for employees, giftcards and suppliers (#555) 2016-05-12 21:29:27 +02:00
jekkos
139100db35 Merge branch 'master' into feature/bootstrap-tables
Conflicts:
	application/models/Item.php
	application/views/reports/date_input_excel_export.php
	application/views/reports/excel_export.php
	application/views/reports/inventory_summary_input.php
	application/views/reports/specific_input.php
2016-05-12 20:34:24 +02:00
jekkos
19629cb05c Full delete refresh issue fix (table will fully refresh in the end)
(#554)
2016-05-12 20:23:21 +02:00
FrancescoUK
87c55582b6 Removed table_sorter, regen dist 2016-05-12 19:12:50 +01:00
jekkos
4c60b0f624 Fix customer delete (use same uniqueId for these tables) (#552) 2016-05-12 19:40:12 +02:00
FrancescoUK
a56984a1a0 Restore the dropdown border size to original and regen dist files 2016-05-12 18:34:48 +01:00
jekkos
2a858b3f23 Collapse rows in detailed report after delete (#507, #293)
Hide columns without title in takings print view (#507)
Execute grunt after running bower uninstall
Try to fix integration tests
2016-05-12 18:02:26 +02:00
jekkos
5312dba499 Do not show checkbox and empty columns on takings print (#293, #507) 2016-05-12 08:47:35 +02:00
jekkos
f7664616ec Search for item number if enter is hit in register and receiving (#507) 2016-05-12 08:36:23 +02:00
jekkos
fdb826a8c4 Only show item suggestions with associated id in register and receiving (#540)
Use correct tabindex numbering in sale register
2016-05-12 08:19:15 +02:00
jekkos
53060397e5 Fix inventory summary report (#540) 2016-05-11 21:51:54 +02:00
jekkos
349000bd8a Fix sale and receiving edit and delete in detailed report (#507, #293) 2016-05-11 17:57:37 +02:00
The Gitter Badger
358a9fc867 Add Gitter badge 2016-05-11 06:19:18 +00:00
jekkos
4b5d883c69 Remove specific input view for excel export (#535) 2016-05-10 19:04:24 +02:00
jekkos
498f8a06b8 Rework url generation for excel export (#539, #540) 2016-05-10 18:42:18 +02:00
jekkos
2171efcb7a Enable dialogs after pagination + export in summary reports (#539) 2016-05-10 18:31:08 +02:00
jekkos
ffd212da14 Enable bstables export for tabular reports (#293, #539) 2016-05-10 09:09:58 +02:00
jekkos
b210888dac Add table export option for bootstrap tables (#293)
Fix pagination css (remove custom style)
2016-05-10 09:08:07 +02:00
jekkos
3b4fbce6f6 Get selected state for export using jQuery (#539) 2016-05-10 08:06:15 +02:00
jekkos
c80b3e1c61 Fix excel export in reports section (#539)
Conflicts:

	application/views/reports/date_input_excel_export.php
2016-05-09 20:20:39 +02:00
jekkos
8fcc24db71 Fix excel export in reports section (#539) 2016-05-09 20:15:23 +02:00
jekkos
d78c871855 Show empty column if no tax_percent found for item (#507) 2016-05-09 20:15:00 +02:00
jekkos
3cf018ac47 Regenerate js files (#537, #538)
Remove static row tablesorter hack
Remove tablesorter plugin
2016-05-09 20:07:04 +02:00
jekkos
c3f2f41888 Fix barcode generation in items and item_kits (#537, #538)
Enable sorting in takings (with static row below the table) (#293, #507)
2016-05-09 18:40:13 +02:00
jekkos
d94b1d921e Enable sorting for items, customers, suppliers, employees and item_kits module (#293, #507) 2016-05-09 08:59:03 +02:00
FrancescoUK
4e17bb7a8c Fixed broken customer suggest in sales/register (#507) 2016-05-07 20:35:32 +01:00
FrancescoUK
601fd10f4e Upgraded js plugins and regen dist files (#507) 2016-05-07 14:04:32 +01:00
FrancescoUK
ac765e4667 sale_id not receiving_id in detailed sale report (#507) 2016-05-07 11:55:52 +01:00
J Sivakumaran
3451a70fe4 Update UPGRADE.txt 2016-05-07 11:14:39 +01:00
FrancescoUK
57fcd87ad4 Updated COPYING (#472) 2016-05-07 11:14:39 +01:00
FrancescoUK
f7ea83091c Fixed mistype var causing a delete confirm box to be empty in item kits (#507) 2016-05-06 19:49:09 +01:00
FrancescoUK
d9498964a0 Fixed missing bulk edit dialog box title (#507) 2016-05-06 19:04:25 +01:00
FrancescoUK
16e6042c9c Fixed missing currency symbol in Item Kits view (#507) 2016-05-06 18:58:10 +01:00
FrancescoUK
c11a9e000d Merge pull request #534 from jsivakumaran/patch-1
Update UPGRADE.txt
2016-05-06 18:10:46 +01:00
J Sivakumaran
a02a0c2a0b Update UPGRADE.txt 2016-05-06 09:35:34 -07:00
jekkos
eca4b4ffb8 Use bootstrap tables for detailed and summary reports (#293, #507) 2016-05-06 00:37:46 +02:00
FrancescoUK
18764d5caf Hide delete button from Takings print, fix null value for margins, add a missing / (#507) 2016-05-05 22:31:24 +01:00
FrancescoUK
76560ca458 Set Takings default to show today's transactions (#507) 2016-05-05 19:50:55 +01:00
FrancescoUK
f207213474 Updated COPYING (#472) 2016-05-05 19:41:06 +01:00
FrancescoUK
9eb21137f6 Fixed glyphicon button space and completed sales & register glyphicons (#507) 2016-05-05 16:44:09 +01:00
jekkos
488af06663 Fix delete in Item model (#507) 2016-05-03 22:41:44 +02:00
jekkos
de711b82dd Fix item delete (#525) 2016-05-03 21:35:46 +02:00
jekkos
408774b14c Apply ospos lines per page setting to bootstrap-table pagination (#507) 2016-05-03 18:16:50 +02:00
jekkos
e2f6bf283c Show invoice icon if invoices enabled in config (#507)
Fix limit query for customers table (#507)
Add reference to translation when no persons found (#507)
2016-05-03 18:09:58 +02:00
jekkos
c2f895c1d4 Rebase with latest master (#293, #472)
Enable email button in customers, suppliers only if selected row has
email filled in
Disable sale/receiving edit in reports (TBC)
2016-05-03 08:58:11 +02:00
jekkos
2adc096eeb Add invoice number and payment type in takings overview (#507) 2016-05-03 08:10:38 +02:00
jekkos
b37f984eb6 Fixes for item kits (new, update) (#507)
Fixes for takings overview (pagination, sorting) (#293)
Fixes for item tax bulk update (#507)
Table rows are highlighted again before delete (#507)
2016-05-03 08:10:38 +02:00
jekkos
130f749a48 Fix item delete (#507) 2016-05-03 08:10:38 +02:00
jekkos
e7a22e4e41 Enable bootstrap tables localisation and integrate with ospos scripts
(#293)
Fix item bulk update (all items are updated now) (#507)
Stop click event propagation when opening modal dialog on a table row
(caused row to be selected/deselected)
2016-05-03 08:10:37 +02:00
jekkos
c568c08595 Fix bulk update with bootstrap-tables (#507) 2016-05-03 08:10:37 +02:00
jekkos
9caed90aee Fix bootstrap tables toolbar icon size (#507) 2016-05-03 08:10:37 +02:00
jekkos
d5d96fa777 Add receipt button in takings (#507)
Fix add stock location in store config
Fix stock location filtering in items module
Fix item kits barcode generation
Fix broken form after first submit in all modules
Remove temp js from dist/ (#293)
2016-05-03 08:10:37 +02:00
jekkos
7e088348e0 Regenerate language file + js after rebase, fix various merge bugs
(#293)
2016-05-03 08:10:37 +02:00
jekkos
c9142ca69b Fix payment summary in sales (#293)
Add glyphicons to buttons in register + receiving views
Refactor table_support init function
Various bugfixes
2016-05-03 08:10:36 +02:00
jekkos
2dab5e0fe7 Bootstrap-tables integration for sales module (WIP) (#293)
Refactor manage_tables, remove public function identifiers
2016-05-03 08:10:36 +02:00
jekkos
e7439c1616 Start bootstrap tables migration for sales module (#293) 2016-05-03 08:10:36 +02:00
jekkos
4624665726 Replace submit with close button in count details view (#293) 2016-05-03 08:10:36 +02:00
jekkos
8cf32f4470 Fix item kits view + search, item bulk edit (#293)
Refactored table_helper to add first and last column automatically
2016-05-03 08:10:36 +02:00
jekkos
4c55da7229 Enbable inventory, count_details in items (#293) 2016-05-03 08:10:36 +02:00
jekkos
48c49ddb74 Fix item kits glyphicons + new button tooltip (#293) 2016-05-03 08:10:36 +02:00
jekkos
9dfb2196e5 Use form-inline to style items toolbar (#293) 2016-05-03 08:10:36 +02:00
jekkos
e09ebcaff9 Filters in items module working and on one line (#293) 2016-05-03 08:10:36 +02:00
jekkos
bb95a120b1 Enable bootstrap-tables for items modules - wip (#293) 2016-05-03 08:10:35 +02:00
jekkos
46ad34548f Enable bootstrap-tables for item kits module (#293) 2016-05-03 08:10:35 +02:00
jekkos
3b9ae1d807 Enable bootstrap-tables for giftcards module (#293) 2016-05-03 08:10:35 +02:00
jekkos
0cd45e275e Enable bootstrap-tables for suppliers module (#293)
Reuse generic manage view for suppliers and remove original one
2016-05-03 08:10:35 +02:00
jekkos
873d14aac6 Enable bootstrap tables in employees module (#293) 2016-05-03 08:08:13 +02:00
jekkos
6f011da3ae Fix customer import (#293) 2016-05-03 08:07:48 +02:00
jekkos
2b03d3bfd7 Continue bootstrap-tables integration (#293)
Refactor manage_tables code and use proper js namespacing
Add glyphicons for most buttons in customers sections
Tidy up HTML in customers table page
Remove jquery-color plugin (not needed anymore)
Fix some minor css issues (feedback bar bottom margin)
2016-05-03 08:07:48 +02:00
jekkos
af7b64a398 Migrate to bootstrap-tables in customers modules (#293) 2016-05-03 08:07:47 +02:00
FrancescoUK
6e82c4904f Fix missing translation (#472), add glyphicons 2016-05-01 22:11:38 +01:00
FrancescoUK
a090ecb1a5 Merge branch 'RamkrishnaMondal-master' 2016-04-30 22:22:16 +01:00
FrancescoUK
a745c52bd5 Merge branch 'master' of https://github.com/RamkrishnaMondal/opensourcepos into RamkrishnaMondal-master 2016-04-30 22:21:14 +01:00
FrancescoUK
c9f8ca6771 disable the feature completely in case the permission is not granted (#472) 2016-04-30 22:14:05 +01:00
FrancescoUK
10e2aa873c fixed missing Croatian translation (#472) 2016-04-30 21:38:37 +01:00
FrancescoUK
0eecaf4268 fixed required fields in sms_form (#472) 2016-04-30 21:38:21 +01:00
FrancescoUK
1f9c31da41 regen database scripts (#472) 2016-04-30 21:37:57 +01:00
FrancescoUK
5fb73ce2cb fixed error reporting, fixed table_helper, added translations, fixed bootstrap grid, various fixes (#472) 2016-04-30 21:34:23 +01:00
FrancescoUK
2b9c9ce203 enable errors, refactor code, various issues fixing, upgrade database script (#472) 2016-04-30 21:33:48 +01:00
FrancescoUK
225a42be8a Regenerate translations after Portuguese (Brazil) amendment 2016-04-29 19:07:37 +01:00
arteiro
8042b6aa53 Pequenas modificações 2016-04-28 12:40:55 -03:00
RamkrishnaMondal
d01e9ffcfe Sixth commit 2016-04-28 19:40:14 +05:30
RamkrishnaMondal
cde401a078 Fifth commit 2016-04-28 13:27:20 +05:30
RamkrishnaMondal
ee237c3c2e Fourth commit 2016-04-28 13:22:01 +05:30
FrancescoUK
0dca4b8906 small tidy up (#391) 2016-04-26 19:55:09 +01:00
FrancescoUK
e81bf14d91 fix code comment typo (#410) 2016-04-26 18:50:01 +01:00
RamkrishnaMondal
d330472158 Third commit 2016-04-26 19:27:44 +05:30
RamkrishnaMondal
0d759ddd4e Second commit 2016-04-26 16:38:13 +05:30
RamkrishnaMondal
638e9ff535 First commit 2016-04-26 16:04:17 +05:30
RamkrishnaMondal
3785cdb675 Merge pull request #1 from jekkos/master
new
2016-04-26 03:22:37 +05:30
FrancescoUK
4ed63cc362 Changed some to be short OSPOS, corrected some that were still PHP Point of Sale or had typos, fixed other translation issues (#391) 2016-04-25 17:26:14 +01:00
FrancescoUK
01d68ce3d5 Changed logo and favicon (#391) 2016-04-25 16:38:42 +01:00
FrancescoUK
8139d525cb remove commented out codeline (#410) 2016-04-24 17:13:55 +01:00
FrancescoUK
34d09bc575 Made invoice optional from store config checkbox, updated and regen database script, few config fixes (#410) 2016-04-24 17:11:37 +01:00
FrancescoUK
b88575b2a5 restructure store config tabs, add invoice config checkbox, add translations (#410) 2016-04-23 22:57:34 +01:00
FrancescoUK
1cf3157089 Regen database.sql (#499) 2016-04-22 21:53:54 +01:00
FrancescoUK
ce2142add4 Made description and serialnumber optional in receipts (#499) 2016-04-22 21:42:17 +01:00
FrancescoUK
d1de7b67b9 Remove stock location from sale receipts (#498) 2016-04-22 19:37:00 +01:00
FrancescoUK
9aa673448a Reset quantities when an Item is deleted (#496) 2016-04-22 19:22:04 +01:00
FrancescoUK
9cfddaf2ab undelete an item in case it's returned (#184) 2016-04-21 22:59:34 +01:00
FrancescoUK
ae5d23f77d Make the payment type change a unique transaction in the model (#314) 2016-04-21 19:25:06 +01:00
FrancescoUK
9f808dafde Show delete button in form when editing sale from Detailed Sales Report 2016-04-18 18:37:27 +01:00
FrancescoUK
bb0989f6bd Adjust form fields size to give more space and fit better dialog form, fixed few details 2016-04-18 18:31:40 +01:00
FrancescoUK
b177fe1dcf Update README.md to include more info about 3.0.0 and set a policy for bug reporting 2016-04-18 13:22:09 +01:00
FrancescoUK
2948bb8a6b Fixed typo in tables.sql , instead of ; (#375) 2016-04-18 09:42:31 +01:00
FrancescoUK
19d3a34bcc Fixed customer name not pre-loaded in form (#314) 2016-04-18 09:29:57 +01:00
FrancescoUK
83d93464bc Added ability to update payment type when editing a sale (#314) 2016-04-17 21:51:52 +01:00
FrancescoUK
3b5be5cf97 Fixed mistake in database upgrade script (#375) 2016-04-16 23:10:40 +01:00
FrancescoUK
7a3e09adb0 Fixed "Calc avg. Price (Receiving)" config bug (#482) 2016-04-16 22:53:20 +01:00
FrancescoUK
1ac0182867 Added discount % to customer (#375) and added Total spent by customer (#369), both added in register and form 2016-04-16 22:26:50 +01:00
FrancescoUK
fa084ec8d2 revert a change affecting order or js when running grunt 2016-04-13 18:34:06 +01:00
FrancescoUK
61a50577fa remove extra , in Gruntfile.js 2016-04-12 22:36:38 +01:00
FrancescoUK
11e3cd63e0 Move temp file in a tmp dir when generating dist files, tidy up Gruntfile.js 2016-04-12 22:26:57 +01:00
FrancescoUK
0c47ec477d Added Croatian translations to application and system (#460) 2016-04-10 22:48:29 +01:00
FrancescoUK
d9b007c1af Improve emailed receipt layout and make it look like the printed one (now added logo + company name) (#442) 2016-04-10 18:15:59 +01:00
FrancescoUK
c77fa6e5c4 Fixed various issues preventing all languages to work fine in all views (#470) 2016-04-09 23:37:34 +01:00
FrancescoUK
fb16c4b65a Add Spanish System translations (#470) 2016-04-09 23:07:54 +01:00
FrancescoUK
e2ddb9388a better support of templates in Gruntfile.js and fix glyphicon issue (#409 #448) 2016-04-09 22:57:03 +01:00
FrancescoUK
a1311dca4c Fixed Items page not displaying with German and Chinese (#470) 2016-04-09 17:23:40 +01:00
FrancescoUK
cf4fd0601f Fixed issue with missing opensourcepos_bower.css in header.php (#469) 2016-04-09 17:14:46 +01:00
FrancescoUK
935e9f0bc8 replace plus and minus in stock_locations with glyphicons, remove old png 2016-04-09 16:43:39 +01:00
FrancescoUK
031994f9b5 Remove inconsistency between .csv and lang.php Portuguese (Brazil) translations (#462) 2016-04-09 15:49:59 +01:00
FrancescoUK
96701fad8e Fix bower invalid-meta warning related to description being too long 2016-04-09 15:27:26 +01:00
FrancescoUK
94e566bb89 Fix typo in README 2016-04-08 23:27:11 +01:00
FrancescoUK
1d3bcfc2ef Update jQuery to 1.12.3 and smalot-bootstrap-datetimepicker to 2.3.10 2016-04-08 23:24:41 +01:00
FrancescoUK
c9b1e34035 Update README 2016-04-08 22:56:54 +01:00
FrancescoUK
910d846c21 Standard CI3 Portuguese (Brazil) translations (#462) 2016-04-08 22:45:44 +01:00
FrancescoUK
62bcce369f More Portuguese (Brazil) translations (#462) 2016-04-08 22:38:05 +01:00
FrancescoUK
ee319badc8 Merge branch 'arteiro-master' 2016-04-08 19:37:16 +01:00
FrancescoUK
714c0ddead Merge branch 'master' of git://github.com/arteiro/opensourcepos into arteiro-master 2016-04-08 19:36:53 +01:00
FrancescoUK
d27671ac3d Fix PHP5.4 support error in Items.php (#452) 2016-04-08 19:07:20 +01:00
FrancescoUK
4264ee763f Upgrade to CI3.0.6 2016-04-08 18:26:18 +01:00
FrancescoUK
2439055f01 More Portuguese (Brazil) translations (#462) 2016-04-08 12:26:57 +01:00
FrancescoUK
ffd0f25e13 Fix to "count shown instead of quantity" on certain Reports (#453) 2016-04-08 12:03:45 +01:00
FrancescoUK
45bd6ece05 Fix quantity decimals in Inventory Reports (#429) 2016-04-08 09:12:09 +01:00
FrancescoUK
984f6c5cac MY_Session workaround is not required anymore with CI3.0
See for fix: https://github.com/bcit-ci/CodeIgniter/issues/3073
2016-04-08 08:51:42 +01:00
arteiro
cd102b7c2e Ultima
Desta versao
2016-04-07 22:18:13 -03:00
FrancescoUK
d83c8051f6 Rename forms to have form_ prefix, move form styles to popupbox.css 2016-04-07 20:30:42 +01:00
FrancescoUK
2ffc7e2d2b Merge branch 'arteiro-master' 2016-04-06 23:03:18 +01:00
FrancescoUK
4a3acd10e7 Portugues (Brazil) translations (#462) 2016-04-06 23:00:18 +01:00
FrancescoUK
ea2a18c647 complete change of calendar language in datepicker 2016-04-06 20:26:21 +01:00
jekkos
3b035aa204 Remove debugger statement + unneeded tab (#455) 2016-04-06 20:48:26 +02:00
jekkos
3b1250afa7 Adapt locale_helper to show currency symbol on correct side (#451) 2016-04-06 20:26:40 +02:00
jekkos
2f07036940 Fix customer selection in sale form (#455)
Fix invoice layout (restore header width)
2016-04-06 20:22:19 +02:00
jekkos
db3f19770b Set currcency symbol on correct site in bulk edit + giftcard forms (#451) 2016-04-06 20:09:47 +02:00
arteiro
570ca69c2f Correções básicas
Espaços retirados
2016-04-06 13:28:44 -03:00
jekkos
4ba4e38c1f show currency symbol on right if configured so (#451) 2016-04-06 18:25:11 +02:00
arteiro
16496d4a9c Tradução pt-BR
Tradução para Português do Brasil
2016-04-06 13:22:36 -03:00
jekkos
f88f19da71 Update datepicker with date and calendar translations from system 2016-04-06 08:51:04 +02:00
arteiro
8237825b4b dunplicado linhas- corrigido
# Conflicts:
#	application/language/pt-BR/common_lang.php
2016-04-05 16:04:27 -03:00
arteiro
7a05f13539 Retirada de espaços
Retirada de espaços antes das palavras
2016-04-05 15:53:51 -03:00
arteiro
05ba84db37 correção
alterado uma palavra
2016-04-05 15:36:17 -03:00
arteiro
95c4fe170b Tradução pt-BR
Criando tradução para Português do Brasil
2016-04-05 14:49:24 -03:00
jekkos
a7ad0cbecd Update CI3 system language files 2016-04-04 23:43:13 +02:00
FrancescoUK
3b1efdb9ad Remove 3 decimals rule on currency due to 3 dec in taxes. Keep decimals separate. Add default tax dec in tables (#327) 2016-04-04 20:57:33 +01:00
FrancescoUK
923f0e05fc update bower file to contain correct tablesorter version 2016-04-03 19:35:19 +01:00
FrancescoUK
c981bc7daa update tablesorter to 2.25.7, regenerate dist files even to fix database.sql 2016-04-03 19:33:09 +01:00
FrancescoUK
fc6c9f6d57 set correct git path in Dockerfile 2016-04-03 18:18:13 +01:00
FrancescoUK
bca943bf34 Fix README.md 2016-04-02 19:21:20 +01:00
FrancescoUK
49366ea5ab Merge branch 'bootstrapUI' into master (now vs 3.0.0) 2016-04-02 19:17:32 +01:00
FrancescoUK
44dfb86230 Merge branch 'master' vs 2.4 into bootstrapUI 2016-04-02 18:58:42 +01:00
FrancescoUK
f36e5ecef4 Release files update (due to 2.4 being released) 2016-04-02 14:22:36 +01:00
FrancescoUK
afcb1641b7 Added decimals to taxes (#327), added totals rounding matching decimals (#327 #307, #429) 2016-04-02 13:59:01 +01:00
FrancescoUK
54455213a8 Release files update 2016-04-02 09:33:37 +01:00
FrancescoUK
dda468291a Update codeigniter_version.txt to contain 3.0.5 (#292)
change the order of access prevent in .htaccess
2016-04-01 22:17:13 +01:00
FrancescoUK
3d7756f177 Update codeigniter_version.txt to contain 3.0.5 (#292) 2016-04-01 22:00:28 +01:00
FrancescoUK
c5037c5725 add currency decimals configuration, fix quantity decimals in forms, merged helpers in locale one (#307 #429) 2016-04-01 21:07:29 +01:00
jekkos
bef7a2da25 Add release notes for 2.4 2016-04-01 18:43:05 +02:00
jekkos
12f4209055 Add hungarian (hu-HU) language (#438) 2016-04-01 16:52:07 +02:00
FrancescoUK
76ff5da718 fix error on new item (#429) 2016-04-01 08:45:57 +01:00
FrancescoUK
19bdcad78e fix database conversion script missing ; at the end (#429) 2016-04-01 08:10:47 +01:00
FrancescoUK
6efdccfef0 add configurable quantity decimals (#429) 2016-04-01 00:07:05 +01:00
FrancescoUK
97676f01a2 change quantity fields to be decimal(15,3) in database (#429) 2016-03-31 20:54:37 +01:00
FrancescoUK
affefb44b4 Resize Item_kits and Items forms quantity fields to space for 3 decimals (#429) 2016-03-31 20:12:56 +01:00
FrancescoUK
62dea44922 add currency symbol in front of gift card value (#116) 2016-03-31 18:52:42 +01:00
FrancescoUK
da5c821de3 tidy up of old styles, make login to use standard bootstrap, regen dist (#116) 2016-03-31 18:25:17 +01:00
FrancescoUK
b2597df44c replaced float_left with pull-left and float_right with pull-right (#116 #293) 2016-03-31 17:35:42 +01:00
FrancescoUK
c8f6f6adf0 remove code submitted accidentally (#116 #293) 2016-03-31 17:08:34 +01:00
FrancescoUK
83edcaf955 set the filters in Items and Sales/Takings on the right side (#116 #293) 2016-03-31 16:33:30 +01:00
FrancescoUK
2359af5fbb tune dropdowns style and font size (#116 #293) 2016-03-31 15:20:30 +01:00
jekkos
e3ddea07b9 Remove F-key shortcuts for modules (#425)
Conflicts:

	application/views/partial/header.php
	dist/opensourcepos.min.js
2016-03-31 08:13:13 +02:00
jekkos
953307cbc7 Remove F-key shortcuts for modules (#425) 2016-03-31 08:08:12 +02:00
FrancescoUK
f303066039 fix missing refresh of payment totals on filter selection (#116 #293) 2016-03-30 22:28:29 +01:00
FrancescoUK
22e38b6f2a bootstrapified and completed rework of the filters section in Sales/Takings (#116 #293) 2016-03-30 22:13:17 +01:00
FrancescoUK
68f5e73bff tidy up js leftovers (#116 #293) 2016-03-30 18:31:47 +01:00
FrancescoUK
086d5b39f3 bootstrapified and complete rework of the filters section in Items (#116 #293) 2016-03-30 18:10:42 +01:00
FrancescoUK
97d17da8c0 Fix error message when searching for non existing supplier in receivings (#430) 2016-03-29 17:31:59 +01:00
jekkos
4d04cdd65f Fix error message when searching for nonexistant supplier in receivings
(#430)
2016-03-29 17:41:16 +02:00
FrancescoUK
7d9013cb2d Fix error message when searching for non existing customer in sales (#430) 2016-03-29 09:24:58 +01:00
FrancescoUK
d996ff29cb Regenerate invoice number on sale unsuspend if no custom format is used (#423) 2016-03-29 09:21:43 +01:00
jekkos
51b776354a Fix error message when searching for nonexistant customer in sales
(#430)
2016-03-29 08:43:58 +02:00
jekkos
d51d1b458a Regenerate invoice number on sale unsuspend if no custom format is used
(#423)
2016-03-29 08:29:43 +02:00
FrancescoUK
7f44d379f5 removed redundant page titles, moved pagination up, adjusted styles, regen dist (#116) 2016-03-26 22:56:51 +00:00
FrancescoUK
69b3e9db52 fix receiving form and detailed report (#116) 2016-03-26 22:55:06 +00:00
FrancescoUK
faac1d6a10 fix bulk_edit: don't remove category, supplier and taxes if left empty; save when a value is set (#393 #381) 2016-03-26 15:12:51 +00:00
FrancescoUK
2f5fd8e3d0 Set tax rate name & % in bulk edit to be the config one, save only if not empty (#381) 2016-03-26 14:03:08 +00:00
FrancescoUK
972f0e81f4 change edit in sales/register and receiving to be a glyphicon with update label (#405 #116) 2016-03-26 10:55:07 +00:00
FrancescoUK
1e85edfef4 change sales/register and receiving button edit item to be update 2016-03-25 22:17:27 +00:00
FrancescoUK
50e6739bad add print and items receiving button in receiving receipt (#426) 2016-03-25 22:09:58 +00:00
FrancescoUK
2322682014 update bootstrap-dialog, remove jqmigrate, regen dist files (#328) 2016-03-25 21:40:09 +00:00
FrancescoUK
16f438dea2 fix "$ is undefined" in login page (#328 #329) 2016-03-25 20:53:30 +00:00
jekkos
6ffec444d6 show serialnumber and description on invoice underneath name and qty
resp. (#405)
2016-03-23 18:44:15 +01:00
jekkos
4e9731c59b Prevent user to update employee without selecting at least one grant
(#420)
2016-03-23 08:44:18 +01:00
jekkos
4f3a845702 Prevent user to update employee without selecting at least one grant
(#420)
2016-03-23 08:38:13 +01:00
jekkos
a3af051d43 Minor improvements for sales tax bulk edit (#381) 2016-03-23 08:14:15 +01:00
jekkos
f9f127e227 Disable second tax field if first is not filled (#381)
Add extra warning if first tax is modified

Conflicts:

	application/views/items/form_bulk.php
2016-03-23 08:10:08 +01:00
jekkos
79a4414a13 Disable second tax field if first is not filled (#381)
Add extra warning if first tax is modified
2016-03-22 08:55:43 +01:00
FrancescoUK
96c4b57b18 Properly fix item search bug (remove duplicated rows due to left outer join) 2016-03-21 21:08:56 +00:00
jekkos
98ad6f3db0 Ignore giftcard numbering test as it makes the build unstable (#114) 2016-03-21 21:51:59 +01:00
jekkos
9cbbe111a7 Set correct branchname for Dockerfile (#284, #114) 2016-03-21 21:47:32 +01:00
jekkos
258c95f02e Remove sync ajax calls in validation callback for forms (#413)
Remove jquery-bgiframe (not used anynmore) (#328)
Fix bug in receiving form save if supplier was empty

Conflicts:

	application/controllers/Items.php
	application/views/customers/form.php
	application/views/items/form.php
	application/views/partial/header.php
	application/views/receivings/form.php
	application/views/sales/form.php
	bower.json
	dist/opensourcepos.js
	dist/opensourcepos.min.js
	templates/spacelab/views/partial/header.php
2016-03-21 21:43:52 +01:00
jekkos
fbd7465b03 Remove sync ajax calls in validation callback for forms (#413)
Remove jquery-bgiframe (not used anynmore) (#328)
2016-03-21 21:27:46 +01:00
FrancescoUK
e6472d525d add rule to .htaccess to protect generate_language.php (#311) 2016-03-21 19:26:31 +00:00
FrancescoUK
fda45dd363 fix bulk_edit: don't remove supplier if none is selected, save category, removed confirm dialog (#393) 2016-03-21 19:02:53 +00:00
jekkos
07e372a787 Properly fix for item search bug (remove duplicated rows due to left
outer join)
2016-03-21 17:43:59 +01:00
FrancescoUK
b9c088314b fix is_deleted issue on some installation (#406) 2016-03-21 16:36:10 +00:00
FrancescoUK
b72432a39e Add in README.md that vs 3.0.0 requires PHP 5.5 or greater (#416) 2016-03-21 13:48:38 +00:00
Aaron Gong
cb26c8cf33 Fix for #393 - issue with bulk edit (PR #415) 2016-03-21 08:44:59 +01:00
jekkos
611237ec86 Fix search resultset when no filters applied 2016-03-21 08:39:24 +01:00
FrancescoUK
3a4e9d9107 remove JQmigrate, update plugins, regen dist files, manual fix of template header (#328) 2016-03-20 22:21:48 +00:00
FrancescoUK
06420fa4b0 fix width % in table_helper to be 100% max (#116) 2016-03-20 22:14:06 +00:00
FrancescoUK
b57fc1f34d add rule to .htaccess to protect generate_language.php (#311) 2016-03-20 19:10:36 +00:00
jekkos
b5e07c9245 Move print_hide to outer div (#394) 2016-03-18 19:02:10 +01:00
jekkos
c6c6a1b4cf Fix print button for receipt and invoice (#394) 2016-03-18 19:00:08 +01:00
jekkos
8cdb30fd25 Show item name on invoice if serialized and description empty (#405) 2016-03-18 18:43:23 +01:00
FrancescoUK
91041bd7a9 Add navigation buttons to invoice, receipt and takings + enable jsPrint (#394) 2016-03-18 18:43:07 +01:00
FrancescoUK
f813780e15 Replace custom csv parse function with PHP builtin (>=5.3) (#311) 2016-03-18 17:25:09 +00:00
jekkos
bc53f544f4 Replace custom csv parse function with PHP builtin (>=5.3) (#311) 2016-03-18 14:12:46 +01:00
jekkos
d29176158b Strip eol characters at end of last column (#311) 2016-03-18 08:16:52 +01:00
FrancescoUK
20fc9138e2 sanity check of post & get on item suggestion and search (#402) 2016-03-17 20:16:56 +00:00
FrancescoUK
18857aca46 fix file language issues: remove \ from French, retranslate everything but manually fix id issues with \" (#311) 2016-03-17 18:36:12 +00:00
jekkos
8fc24219fb Strip eol characters from imported csv line (#311) 2016-03-17 12:20:28 +01:00
jekkos
38a2fb4ca1 Remove call to flushCache (gone after tablesorter upgrade) (#328) 2016-03-17 08:14:10 +01:00
jekkos
a04b1d5803 Fix jQuery deprecation warning in invoice load (#328)
Ignore giftcard test as it makes build unstable
2016-03-16 08:13:08 +01:00
FrancescoUK
06e7dcd471 fix header of pagination.php (#116) 2016-03-15 19:10:24 +00:00
FrancescoUK
d4dae9fd32 bootstrapify pagination links, remove old styling, don't print links in takings, change <?= to be <?php (#116, #394) 2016-03-15 19:08:14 +00:00
FrancescoUK
e3a10067f5 fix the missing jsPrint takings_printer in config (#394) 2016-03-15 18:09:37 +00:00
jekkos
09dd7eca58 Make invoice header responsive, remove fixed height and make font size
relative. (#116)
2016-03-15 17:52:43 +01:00
jekkos
126f2254f6 Make invoice header responsive, remove fixed height and make font size
relative. (#116)
2016-03-15 17:49:10 +01:00
jekkos
64c7eb28b3 Put back form submit buttons (#328)
Add custom style for jquery autocomplete widgets (#116)
2016-03-14 23:11:25 +01:00
FrancescoUK
5e97358e90 enable jsPrint in receipt, invoice and Takings (sales/manage) (#394) 2016-03-14 19:54:46 +00:00
FrancescoUK
eb838cdb9f Change table links to be glyphicons, fix tooltips sentence in sales/manage, fix sortable columns (#116) 2016-03-14 18:40:07 +00:00
FrancescoUK
983dad87af regenerate dist file (#394) 2016-03-14 17:21:50 +00:00
FrancescoUK
87853f0da4 add navigation buttons in sales receipt and invoice, fix invoice styling (#394) 2016-03-14 17:21:28 +00:00
jekkos
e8e89f1c7e Add workaround for jQuery load deprecation (#328) 2016-03-14 08:49:52 +01:00
FrancescoUK
f6be7cdf23 Merge branch 'master' into bootstrapUI 2016-03-13 16:19:44 +00:00
FrancescoUK
7937e880c0 Merge branch 'ais-one-master' 2016-03-13 15:30:40 +00:00
FrancescoUK
c52b5b5118 hide links, change print button id and add it to stylesheet, hide the print div (#160) 2016-03-13 15:29:39 +00:00
FrancescoUK
e47e80c69c Merge branch 'master' of git://github.com/ais-one/opensourcepos into ais-one-master 2016-03-13 14:39:37 +00:00
Aaron Gong
6208569c7e Fix for issue 160
https://github.com/jekkos/opensourcepos/issues/160

I try to interfere as little as possible
2016-03-13 22:04:39 +08:00
FrancescoUK
1a41c6a360 remove unused legend strings (removed from forms) (#116) 2016-03-13 13:43:09 +00:00
FrancescoUK
38d52e4df0 remove unnecessary and redundant messages from report listing view (#116) 2016-03-13 12:42:17 +00:00
FrancescoUK
1f56a8da8c fix feature/bootstrapUI Reports issue with today date selection (#395) 2016-03-13 12:38:52 +00:00
FrancescoUK
4ad0d62f42 Upgrade to CI3.0.5 (#292) 2016-03-13 11:26:51 +00:00
FrancescoUK
0bd5bbec77 remove encode/decode base64 causing issues with web hosting providers (#374) 2016-03-13 10:52:32 +00:00
FrancescoUK
340792cfc2 change "E-mail" to be "email" (#116) 2016-03-13 10:07:59 +00:00
FrancescoUK
a817c8ae0a simplify checkbox logic in sales/register and receiving (#116) 2016-03-12 11:25:23 +00:00
FrancescoUK
c124c08f89 readded bootstrap-select and adjusted styling of dropboxes (#116) 2016-03-12 10:57:24 +00:00
FrancescoUK
d2565009d8 fix wrong behaviour with due amount and Complete button on "sale" <=0 and "return" >=0 (#116) 2016-03-12 09:23:54 +00:00
FrancescoUK
b38a5ca47a bootstrapisation of receivings (#116) 2016-03-12 00:03:54 +00:00
FrancescoUK
f32bba31b5 fix sales/register return, make complete replacing add payment button on 0 amount due, remove pop up on complete and suspend (#116) 2016-03-11 21:55:31 +00:00
FrancescoUK
4b8f505625 reenable pop dialogs for confirmation, disable add payment button when amount due is 0 (#116) 2016-03-11 18:04:44 +00:00
FrancescoUK
4433edc552 regenerate dist files (#116) 2016-03-11 17:49:05 +00:00
FrancescoUK
019f93d98b create style class for table width and first_li, regenerate dist files (#116) 2016-03-11 17:26:11 +00:00
FrancescoUK
98ebe1ff96 update daterangepicker to 2.1.19 and regen dist files (#116) 2016-03-11 17:24:51 +00:00
FrancescoUK
69c1af586e relayout of sales/register right panel to follow a more logical flow (#116) 2016-03-11 17:23:32 +00:00
FrancescoUK
2df8645c5f code comments, various bits and bobs (#116) 2016-03-11 17:20:07 +00:00
jekkos
f6b9ef16d0 Add default jquery ui theme instead of smoothness theme (#328)
Remove obsolete ajax queue plugin (#328)
Add image preview widget for avatar upload in items form (#372)
2016-03-11 18:07:41 +01:00
jekkos
399cc38eb9 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI 2016-03-10 21:29:04 +01:00
jekkos
652702f582 Fix delete button + image upload widget refresh for company logo (#372) 2016-03-10 21:28:37 +01:00
FrancescoUK
4913ffe114 regenerate dist files (but issue with search dropdown style) (#116) 2016-03-10 20:16:05 +00:00
FrancescoUK
668cd8d0f9 make sales/register dropdowns the standard style (#116) 2016-03-10 19:21:54 +00:00
FrancescoUK
05a1dd561c sales/register alignments, added customer info (#116, #369) 2016-03-10 19:21:54 +00:00
FrancescoUK
5f0c9c282c remove inline styling from page titles (if needed can be done from a .css file against #page_title) (#116) 2016-03-10 19:21:54 +00:00
FrancescoUK
de825f54e7 remove ':' from sales/register labels (#116) 2016-03-10 19:21:54 +00:00
FrancescoUK
940a899231 more adjustments to sales/register bootstrapisation (#116) 2016-03-10 19:21:54 +00:00
FrancescoUK
70938f7b41 sales/register bootstrapisation (#116) 2016-03-10 19:20:42 +00:00
jekkos
d510ab031d Update README.md with FAQ and answer to common setup problem (#387, #97, 2016-03-10 08:43:07 +01:00
jekkos
9c39f62b1e Fix sale search form submission on enter (#386)
Add php5-apcu to Dockerfile (#320, 284)
Fix countrycode parameter for nominatim address lookup
2016-03-10 08:25:32 +01:00
jekkos
e175a96acb Fix nominatim address lookup with jquery ui autcomplete (#328)
Add dblclick event handler to item + customer autocomplete in register
2016-03-09 20:03:05 +01:00
FrancescoUK
71a8dce949 regenerate dist files (but issue with search dropdown style) (#328) 2016-03-09 17:10:47 +00:00
FrancescoUK
747706e032 fix barcode font size default in database.sql (#116) 2016-03-09 17:09:19 +00:00
FrancescoUK
2a679ca2eb set the correct default barcode font size (#116) 2016-03-09 16:53:17 +00:00
FrancescoUK
1f1b9c47ec remove extra barcode font styling, set directly the correct size as of barcode_config (#116) 2016-03-09 14:24:16 +00:00
FrancescoUK
ceac184c30 add comment about barcodes (#116) 2016-03-09 14:00:27 +00:00
FrancescoUK
f9803cb4f5 move barcode_sheet.php to views/barcode dir (#116) 2016-03-09 13:41:30 +00:00
FrancescoUK
626667b3fd Merge branch 'master' into bootstrapUI 2016-03-08 22:42:03 +00:00
FrancescoUK
bf2c6bfa1f fix issue with sale edit 2016-03-08 21:53:29 +00:00
FrancescoUK
5588c1e22e set a ospos_session cookie name 2016-03-08 21:30:25 +00:00
FrancescoUK
525fb7dcf9 fix issue blocking searching suggestion 2016-03-08 21:28:41 +00:00
FrancescoUK
e182c9d9f6 regenerate dist files 2016-03-08 21:23:05 +00:00
jekkos
af69e83bda Add jquery-ui.css in dist file + update .gitignore 2016-03-08 21:43:47 +01:00
FrancescoUK
76639f6da1 remove misleading comment from code 2016-03-08 19:50:46 +00:00
jekkos
01f59cc247 Fix jQuery migrate warnings in manage_tables (#328) 2016-03-08 20:46:30 +01:00
jekkos
6f6f4354fd Remove jQuery calls for attr (deprecated in newer versions) (#328) 2016-03-08 20:18:51 +01:00
FrancescoUK
d7df291b9a Merge branch develop/2.4 into master 2016-03-08 19:14:36 +00:00
FrancescoUK
1a1266a20c touched version to be 2.4.0, updated README.md, enabled Cross Site Request Forgery in config.php 2016-03-08 18:19:28 +00:00
jekkos
f366757476 Add group operator to giftcard query 2016-03-08 18:18:27 +00:00
jekkos
741843586d Remove duplicated cookie cleanup hack (CI 2.x issue) 2016-03-08 18:18:27 +00:00
FrancescoUK
fafdfd9afd fix php error on suggestion typing when in sale register return mode (#331) 2016-03-08 18:18:27 +00:00
FrancescoUK
a156ad8087 Fix issue in Sales/Takings and apply same fix to other controller to avoid similar issues in the future (#337) 2016-03-08 18:16:31 +00:00
FrancescoUK
b36a03c4bc Fix to sales edit server error when customer is '' (#337) 2016-03-08 18:16:31 +00:00
jekkos
028bdb074b Add caching hints for mod_expires (#340) 2016-03-08 18:16:31 +00:00
jekkos
643ceb25b5 Fix spacing in autocomplete suggestion 2016-03-08 18:16:31 +00:00
jekkos
5f8eface28 Properly save company_name in customer form 2016-03-08 18:16:31 +00:00
jekkos
8a5177f14c Fix base url for testcases (#305)
Fix legacy ubuntu repository urls (#284)
2016-03-08 18:16:31 +00:00
jekkos
02c8a89bbe Use curl to wait for apache start (#305) 2016-03-08 18:13:24 +00:00
jekkos
c67acaa6ec Make 2.4 version string npm compatible 2016-03-08 18:04:15 +00:00
FrancescoUK
4bbacf6923 Code reformatting 2016-03-08 18:04:15 +00:00
FrancescoUK
38ea682c88 Add favicon 2016-03-08 18:00:33 +00:00
FrancescoUK
0f1208d4d9 Fix package.json version to be 2.4 (#284) 2016-03-08 17:51:16 +00:00
jekkos
69942283e5 Make docker work with 2.4 branch 2016-03-08 17:50:17 +00:00
FrancescoUK
d13e034940 Update database/tables.sql script with new sessions table (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
72059184df Update Copyright notice (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
4d9dc0111e Make the data blob NOT NULL in the SQL upgrade script (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
b9262230d1 Change sessions to be stored in database and add SQL upgrade script 2.3.4 to 2.4 (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
df4cea3228 Fix to custom fields that cannot be null on Items save (#120) 2016-03-08 17:44:59 +00:00
jekkos
0f27348924 Add (temp) fix for cur_page conuter in CI pagination libary (#284)
Fix .htaccess file
2016-03-08 17:44:59 +00:00
FrancescoUK
dd5aa1e241 Restore padding in pagination links, now it uses css (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
5df62610d2 Upgrade to CI 3.0.4 (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
9dcbef988a Added comments to some controller functions and improved spacing to improve readibility of code (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
d1a973564f Make NULL to be null all over the code for consistency purposes (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
da52ff99c1 Further review and fixes to input->post(...) (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
ee07676193 Fix to items search not working due to input->post returning null (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
007598df6a Fix merge miss in constants.php (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
9a71bbc620 Complete CI 3.0.3 upgrade since it wasn't done in full (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
a5041a3a41 Remove application/errors, upgrade Step 8 (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
36d3717bd6 EXT constant deprecated, upgrade Step 20 (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
abd63731be Follow upgrade guideline Step 9 (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
b7c0e32cd0 Fix reports error due to report.php now being Report.php (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
c512d7167d Change config language to be 'en' consistent with the OSPOS language identifiers (#120)
However language support doesn't work properly at the moment.
2016-03-08 17:44:59 +00:00
FrancescoUK
6ccfc8ba7d Improve .htaccess with some security rules (#120) 2016-03-08 17:44:59 +00:00
FrancescoUK
b27d3c04c9 Upgrade config.php and database.php.tmpl to CI 3.0.3 versions (#120)
Apparently the upgrade wasn't complete.
2016-03-08 17:44:59 +00:00
FrancescoUK
aa3948b9a2 Remove application/config.php and database.php (#120) 2016-03-08 17:41:16 +00:00
Toni Haryanto
75fa1a8167 Upgrade to Code Igniter 3.0.3 (#120) 2016-03-08 17:41:16 +00:00
FrancescoUK
c414922167 touched README.md file (#116) 2016-03-08 17:18:29 +00:00
FrancescoUK
38ecacc62f mark OSPOS with Bootstrap3 vs 3.0.0 (#116) 2016-03-08 17:17:13 +00:00
FrancescoUK
cc05f9b2df regenerate dist files (#116 #328 #329) 2016-03-08 12:44:42 +00:00
FrancescoUK
d7d2c8cb35 get the latest swfobject 2.3.0 using an alternative bower package repo (#116 #328 #329) 2016-03-08 12:43:58 +00:00
FrancescoUK
ea394a00b5 remove spinner, unused images, unused code (#116 #328) 2016-03-08 12:42:38 +00:00
FrancescoUK
49b1eb3150 fix table action & search header geometry/positioning (#116) 2016-03-08 12:40:41 +00:00
FrancescoUK
4a216f0a7c used proper form and group-form for table action search and header (#116) 2016-03-08 12:28:18 +00:00
jekkos
674dd90221 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI 2016-03-08 08:40:23 +01:00
jekkos
2436cf5da5 Fix suggestions for item kits (by name and KIT id) (#328) 2016-03-08 08:39:21 +01:00
jekkos
9cd42e0614 Add group operator to giftcard query 2016-03-08 08:12:23 +01:00
jekkos
a6fa6c9cd6 Add group operator to giftcard query 2016-03-08 08:11:10 +01:00
FrancescoUK
4403a6775a Fix wrong form name in location dropdown due to copy&paste action (#116) 2016-03-07 22:47:40 +00:00
jekkos
dfbab194de Add item search for category + suppliers (#328) 2016-03-07 23:21:57 +01:00
jekkos
fe2787217f Fix item suggestion in item kits, fix category suggestion in item form
(#328)
2016-03-07 22:42:42 +01:00
jekkos
554f2b32db Merge branch 'feature/jquery_cleanup' into feature/bootstrapUI
Conflicts:
	application/views/items/manage.php
	application/views/partial/header.php
	dist/opensourcepos.min.css
	dist/opensourcepos.min.js
	templates/spacelab/views/partial/header.php
2016-03-07 21:33:26 +01:00
jekkos
36f825d0fe Replace legeacy autocomplete with jquery-ui version (#328)
Cleanup PHP search suggestion functionality
Add jquery-ui css explicitly (wasn't included in bower main attribute)
2016-03-07 21:23:29 +01:00
FrancescoUK
04b6ba21f7 bootstrapisation of #table_action_header in all views, tidy up css styles changed px to em (#116) 2016-03-07 19:09:57 +00:00
Aaron Gong
ff63adecdc Fix For #339
https://github.com/jekkos/opensourcepos/issues/339

We should also rollout the fixes to  develop/2.4 if necessary. This fix
was adapted from BootstrapUI which fixed the PHP 7 error regarding
classes.
2016-03-07 22:26:07 +08:00
jekkos
6c29faeba1 Remove old jquery autocomplete
Remove id|name format in giftcards customer selection
Cleanup duplicated custom field suggestion in Items
Migrate table search suggestion to jQuery UI
Add jquery UI bootstrap theme
2016-03-07 07:56:41 +01:00
FrancescoUK
517f67a3a9 remove double entry in daterangepicker translations, open calendar always (#116) 2016-03-06 21:51:46 +00:00
FrancescoUK
7f37ebf87e proper support of date range in reports input leveraging all the features, translations and fixed some bugs (#116) 2016-03-06 21:34:12 +00:00
jekkos
f0af6f8927 Correct spanish translations for reorder level warning (#365) 2016-03-06 13:39:11 +01:00
jekkos
d78c4dec67 Add default english for other langauge labels 2016-03-06 13:34:21 +01:00
FrancescoUK
0831089790 fix stock_config error message (#116) 2016-03-05 21:08:20 +00:00
FrancescoUK
8faf1285da fix general_config tax 1 rate and name error message (#116) 2016-03-05 11:54:10 +00:00
FrancescoUK
d5b278217b fix first name error message in Suppliers/form (#116) 2016-03-05 11:41:57 +00:00
FrancescoUK
a04101d756 fix an issue with error messages on required fields in Items/form (#116) 2016-03-05 11:33:25 +00:00
FrancescoUK
3cb41c9fe3 fix picture loading widget in Items/form, works but pic extension is not handled so still commented out (#116) 2016-03-05 10:27:45 +00:00
FrancescoUK
2ab9404229 render in red the fields in config that are empty at submit time (#116) 2016-03-05 10:23:43 +00:00
FrancescoUK
6cef7a124e fix a wrong counting with custom fields for-loop (#116) 2016-03-05 10:23:43 +00:00
FrancescoUK
f226c774df Merge pull request #376 from ais-one/patch-1
Item Avatar Not Uploading (#373)
2016-03-05 09:34:52 +00:00
FrancescoUK
06a1f1a869 Merge pull request #378 from ais-one/patch-2
Don't make suppliers mandatory in Items/form (#377)
2016-03-05 08:26:38 +00:00
Aaron Gong
44dc300c63 Update form.php
removed required in class of the label
2016-03-05 14:50:53 +08:00
Aaron Gong
edaa936766 Fix for issue 377
Fix bug where item cannot be edited or created due to not recognizing none as a supplier.
2016-03-05 09:46:42 +08:00
Aaron Gong
6d9a53edba Fix for issue 373
https://github.com/jekkos/opensourcepos/issues/373
2016-03-05 09:25:34 +08:00
FrancescoUK
1d9a7eced3 set correct order new & submit buttons in receiving (#116) 2016-03-04 22:42:28 +00:00
FrancescoUK
f9971aabb6 remove unnecessary .':' from form labels (#116) 2016-03-04 21:57:58 +00:00
FrancescoUK
1fe26afe4f fix missing required fields in Items form, changed file input to be bootstrap one (#116)
There is the image upload option commented out, pending the solution on remove file.
However none of them seems to be effective in loading the image. It's probably a Controller issue.
2016-03-04 21:56:08 +00:00
FrancescoUK
6d547048c4 set two methods private in Items and Config controllers (#116) 2016-03-04 21:44:00 +00:00
FrancescoUK
687b68f13e set correct tax_2 and not tax_1 label in general_config (#116) 2016-03-04 21:42:40 +00:00
FrancescoUK
c49728e2fc fix New Employee button wrong indentation in Employees view (#116) 2016-03-04 21:41:22 +00:00
jekkos
a201d18938 Add specific warning when stock goes below reorder level in sales (#365, #336) 2016-03-02 08:28:50 +01:00
jekkos
d433866e39 Only accept .csv for import excel functionality (#116)
Enable enter key to submit form by default (as before)
2016-03-01 18:01:53 +01:00
jekkos
45da78bbde Trigger employee form validation for all tabs (#116) 2016-03-01 17:48:33 +01:00
jekkos
c9238877fa Bootstrapify report input forms, add datepicker range widget (#116)
Move datepicker translations to datepicker_lang.csv
2016-03-01 08:46:17 +01:00
jekkos
d4f456d868 Bump version strings to 2.3.5 2016-02-29 22:36:25 +01:00
jekkos
2833b7598e Bootstrapify date_input for reports (#116). Form alignment to be
improved, basic version working
Move common jquery validation settings to base object
2016-02-29 22:21:36 +01:00
jekkos
68c4c1cc56 Use bootstrap style to highlight fields in error state after failed validation (#116) 2016-02-29 08:14:00 +01:00
jekkos
bc8673d883 Remove debugger statement + fix glyph in item kits form (#116) 2016-02-28 23:52:04 +01:00
FrancescoUK
6b76e28ebb fix tables in item_kit/form items/inventory details and sales/suspended (#116) 2016-02-28 21:24:55 +00:00
FrancescoUK
f2e02e4e06 fixed wrong titles in excel import forms (coming from manage views) (#116) 2016-02-28 19:35:38 +00:00
FrancescoUK
2b257d21fb add icons to inventory detail and inventory change forms (#116) 2016-02-28 19:23:40 +00:00
FrancescoUK
92bfd903dc bootstrapify inventory details form, fixed multilocation support that was broken (#116) 2016-02-28 19:08:05 +00:00
FrancescoUK
69fedb3712 bootstrapify inventory form (#116) 2016-02-28 17:08:30 +00:00
FrancescoUK
c4df1f3671 make items/form_bulk consistent with the rest of the forms (#116) 2016-02-28 16:41:55 +00:00
FrancescoUK
0cd7af7c4f change file load widget in excel_import forms (#116)
used jasny-bootstrap
2016-02-28 16:26:58 +00:00
FrancescoUK
c675a73fc6 make sale and receiving forms consistent with the other forms (#116) 2016-02-28 15:55:45 +00:00
FrancescoUK
7b09961075 fix employee tab width issue, now working fine (#116) 2016-02-28 15:02:25 +00:00
FrancescoUK
d96fafa92f remove redundant title strings from all the forms (#116)
The dialog box has already a title and there is no need to double the subject.
2016-02-28 14:21:05 +00:00
FrancescoUK
20daecf4b1 make employees form using tabs (#116)
There is an issue with fieldset being too short
2016-02-28 14:03:09 +00:00
FrancescoUK
c0a048251e fix silly 1px drop with glyphicons in front of input, various beautifications: more icons and better tables in suspended and item_kits (#116) 2016-02-28 11:55:11 +00:00
jekkos
99c92e68a6 Add glyphicon to form fields in customer and item (#116) 2016-02-28 01:18:40 +01:00
jekkos
af5d39a394 Set delete button color in sales / receivings edit form (#116)
Fix password field layout in employee edit mode
2016-02-28 01:02:27 +01:00
FrancescoUK
fc74708bf5 fix a mistake with the table entry in sales/suspended list (#116) 2016-02-27 22:21:04 +00:00
FrancescoUK
0dce125f67 fix controls sizes in all the forms, fix datetimepicker in sales/form and receiving/form, fix item_kits/form (#116) 2016-02-27 21:55:52 +00:00
jekkos
d3b87189e3 Fix form submission in sales and receivings forms (#116) 2016-02-27 21:31:44 +01:00
jekkos
4a68ab13e1 Bootstrapify sales and receivings forms (#116) 2016-02-27 20:01:00 +01:00
jekkos
0c1f67f391 Readd create item and suspended sales buttons 2016-02-27 18:58:51 +01:00
jekkos
fd87c59492 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI
Conflicts:
	application/views/partial/header.php
	application/views/receivings/receiving.php
	application/views/sales/register.php
	dist/opensourcepos.min.js
	templates/spacelab/views/partial/header.php
2016-02-27 18:55:44 +01:00
FrancescoUK
af2736e462 Reverse PHP7 fix causing issues with DB functionality (#351) 2016-02-27 10:15:58 +00:00
FrancescoUK
d7ff9bed1a Merge branch 'ci3' into bootstrapUI 2016-02-27 09:44:41 +00:00
FrancescoUK
e5e3b89c6d fix config page tabs sizes and alignment (#116) 2016-02-27 09:42:23 +00:00
FrancescoUK
67bfe560c4 change input boxes size in general_config, more to come (#116) 2016-02-26 23:53:11 +00:00
FrancescoUK
d04fec09d5 Sales register and Receiving with new dropdown and relayout (#116) 2016-02-26 23:33:05 +00:00
FrancescoUK
e814f8835a fix issue related to double bootstrap.js in min.js preventing bootstrap-select from functioning properly (#116) 2016-02-26 22:20:11 +00:00
jekkos
7769334372 Add close button by default (#116, #361) 2016-02-26 19:08:49 +01:00
jekkos
959f7da876 Fix item form submission + remove invalid char before value attribute 2016-02-26 11:05:55 +01:00
jekkos
a9902219ae Continue bootstrapification (item bulk edit, bootstrap modals)
(#116, #361)
Remove get_form_width() from controllers, add new class to define modal width
Add bootstrap validation markup to edit forms
2016-02-25 23:31:43 +01:00
jekkos
3cb9aaa055 Remove duplicated cookie cleanup hack (CI 2.x issue) 2016-02-25 23:28:19 +01:00
FrancescoUK
831dc7a0b8 fix php error on suggestion typing when in sale register return mode (#331) 2016-02-25 15:44:13 +00:00
FrancescoUK
75cf2997b8 Complete company logo config support (#116)
Show image when available, support button translation

Widget based on jasny-bootstrap
2016-02-25 10:59:14 +00:00
FrancescoUK
abdf2a23d0 add bootstrap-table but not used yet (#116 #293) 2016-02-23 15:50:04 +00:00
jekkos
deb4a501d6 Finish config module restyle (#116) 2016-02-22 23:44:52 +01:00
jekkos
80d7079953 run grunt on bower postinstall hook (#329) 2016-02-22 23:38:46 +01:00
jekkos
fcf303b2b3 Finish form bootstrapification for config module 2016-02-22 23:38:46 +01:00
FrancescoUK
932ead0d3c Merge branch 'ci3' into bootstrapUI 2016-02-22 18:05:15 +00:00
FrancescoUK
03146d9e3b Fix issue in Sales/Takings and apply same fix to other controller to avoid similar issues in the future (#337) 2016-02-22 17:52:29 +00:00
FrancescoUK
45c0163a9d Fix to sales edit server error when customer is '' (#337) 2016-02-22 08:51:18 +00:00
FrancescoUK
56826ab3c1 fix spacelab template to work with new setup (#116, #329) 2016-02-21 20:29:14 +00:00
FrancescoUK
55d6237f93 Add caching hints for mod_expires (#340) 2016-02-21 19:28:58 +00:00
FrancescoUK
349da7e7ad fix font issue, split bootstrap.min.css out of opensourcepos.min.css, grunt upgrades header.php and login.php (#329, #116)
requires npm install to install bowercopy
2016-02-21 19:14:04 +00:00
jekkos
5f0028a983 Add caching hints for mod_expires (#340) 2016-02-20 21:40:06 +01:00
jekkos
1aa5c72db3 Tune css inclusion (use negation for unwanted files in header.php) 2016-02-20 15:08:29 +01:00
FrancescoUK
fc20b74b57 fix wrong css file sequence generation with grunt, add bootstrap-select (not used yet) (#329) 2016-02-19 23:31:18 +00:00
FrancescoUK
7236902143 restore correct style for the main page module list (#329) 2016-02-19 23:30:42 +00:00
FrancescoUK
cf92544600 manage better meridiem cases with datetimepicker (use strpos) (#116) 2016-02-19 19:07:39 +00:00
jekkos
ab87b30423 Update .gitignore to exclude intermediate minified files 2016-02-19 19:04:14 +01:00
jekkos
0ad30370ae Do not include login.css in minified result (#329) 2016-02-19 19:04:06 +01:00
jekkos
30223c38e1 Fix css minification (#329)
Fix suspended sales dialog (set class to modal-dlg)
2016-02-19 19:03:56 +01:00
jekkos
967ba99c12 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI
Conflicts:
	application/views/configs/locale_config.php
	application/views/receivings/receiving.php
	application/views/sales/register.php
2016-02-18 23:38:39 +01:00
jekkos
d2a11cdb91 Bootstrappify config forms - WIP (#116) 2016-02-18 23:30:21 +01:00
FrancescoUK
bb966feb8a small indentation adjustment (#116) 2016-02-18 22:06:47 +00:00
FrancescoUK
ebaec8de26 remove white gap in sales/register items table (#116) 2016-02-18 21:30:33 +00:00
FrancescoUK
ee4297e22c fix sales/register and receiving button, styles, alignment and code tidy up (#116) 2016-02-18 21:16:07 +00:00
jekkos
aae36bce00 Merge branch 'feature/bower+grunt' into feature/bootstrapUI 2016-02-18 17:42:38 +01:00
jekkos
4a7e0af9a2 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI 2016-02-18 17:42:20 +01:00
jekkos
808943f250 Add bootstrap form style to item kits, suppliers, giftcards, and excel import in
items and customers (#118)
Fix dialog submission in all pages (#328)
2016-02-18 08:57:17 +01:00
FrancescoUK
f19e7142cd complete datetimepicker change with proper date and time formats support (#116) 2016-02-17 22:47:59 +00:00
jekkos
82a3f9a3e2 Add new dialogs to all pages (use modal-dlg class) #116
Bootstrapify customer edit form (almost done)
Bootstrapify item excel impor
2016-02-17 23:34:53 +01:00
FrancescoUK
66a5a159d8 add language support to datetimepicker using ospos translation support (#116)
Translated languages: en, es, fr, de-CH, nl-BE
2016-02-16 23:16:03 +00:00
jekkos
a5107445f0 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI
Conflicts:
	application/views/configs/barcode_config.php
2016-02-16 23:59:49 +01:00
jekkos
c99ef3f315 Bootstrapify item edit form (#116)
Use bootstrap-dialog in items inventory and inventory details (#328)
2016-02-16 23:42:20 +01:00
FrancescoUK
cd5094d389 fix barcode_config barcode_lib->listfonts "font" to be "fonts" (#116) 2016-02-16 21:32:58 +00:00
FrancescoUK
d1a596b0be fix php error on suggestion typing when in sale register return mode (#331) 2016-02-16 21:28:10 +00:00
jekkos
a97929f239 Remove thickbox from bower.json (#328)
Items edit working now (items module only) (#116)
2016-02-16 21:41:02 +01:00
jekkos
444ba37eb1 Import bower compatible dependencies using bower+grunt (#329)
Cleanup obsolete js + css files (jquery-ui)
2016-02-15 22:52:58 +01:00
FrancescoUK
52487a4a78 Remove datetimepicker locales as the translation will use I18N but leveraging OSPOS translations (#116) 2016-02-15 21:51:53 +00:00
FrancescoUK
b6adf916c4 fixed arrow icons issue, bootcssVer autodetect doesn't work and needs explicit declaration (#116) 2016-02-15 09:31:44 +00:00
FrancescoUK
f92082270d add locale js for bootstrap-datetimepicker and regenerated min.js (#116)
locale not tested, js script seems unaffected
2016-02-14 23:32:50 +00:00
FrancescoUK
4667282966 add FontAwesome font (#116) 2016-02-14 23:30:57 +00:00
FrancescoUK
5546700fee upgrade templates/spacelab bootstrap.css to latest (#116) 2016-02-14 23:30:10 +00:00
FrancescoUK
644a159d0a remove completely flatly dir from templates (#116) 2016-02-14 23:29:06 +00:00
FrancescoUK
3156ce217b upgrade to latest flatly bootstrap.css (#116) 2016-02-14 23:24:42 +00:00
FrancescoUK
7c10a9a63a rename font directory to fonts so we are inline with bootstrap (#116) 2016-02-14 23:03:32 +00:00
FrancescoUK
fc3aac58b5 select transaction in Takings inclusive of time, fix Sale edit form to use bootstrap-datetimepicker (#116) 2016-02-14 22:41:10 +00:00
FrancescoUK
d788320a9d Tidy up js in Sales/manage and Items/manage, commented out invoice js part as not used (#116) 2016-02-14 19:42:08 +00:00
FrancescoUK
0f4d5e8f1b Fix issue in Sales/Takings and apply same fix to other controller to avoid similar issues in the future (#116) 2016-02-14 19:40:18 +00:00
FrancescoUK
c5ab15ca64 Revert post TRUE change for XSS filtering (#116) 2016-02-14 13:05:42 +00:00
FrancescoUK
42312bcc20 Complete tidy up of unneeded table filter id, add TRUE for XSS filtering (#116) 2016-02-13 21:49:08 +00:00
FrancescoUK
d69a3c6130 Fix tables (detailed sale report) colour for inner table (#116) 2016-02-13 21:47:10 +00:00
jekkos
d003239525 Items form bootstrapified (working in Chrome) (#116, #328) 2016-02-13 14:42:01 +01:00
jekkos
45cb6bc4f7 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI 2016-02-13 14:14:40 +01:00
jekkos
b361d78051 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI
Conflicts:
	templates/flatly/css/style.css
2016-02-13 14:14:30 +01:00
FrancescoUK
8438942b10 use bootstrap-datetimepicker instead of jquery-ui-timepicker-addon in Items and Takings (#116)
There is an issue with Takings filtering that needs fixing and also arrows are not showing in the datetimepicker.
2016-02-13 12:29:15 +00:00
jekkos
2be22d8e48 Migrate thickbox in items to bootstrap modal dialog (#328) 2016-02-13 13:17:29 +01:00
FrancescoUK
1be861cd8d change empty table to be alert-info instead of alert-warning (#116) 2016-02-13 11:28:12 +00:00
FrancescoUK
e0745b5109 make flatly OSPOS default, tidied up stylesheets, added bootstrap-datetimepicker js no support yet (#116) 2016-02-13 09:54:49 +00:00
FrancescoUK
792f6c4154 Remove zip file committed by mistake (#116) 2016-02-12 10:36:33 +00:00
FrancescoUK
23b086fbc2 added jasny-bootstrap-3.1.3, removed bootstrap.file-input and changed image upload in general config (#116)
For jasny-bootstrap-3.1.3 see: http://www.jasny.net/bootstrap/
2016-02-12 09:32:21 +00:00
FrancescoUK
e35bd81c8b Fix File Choose boostrap jQuery plugin not working with latest submission (#116) 2016-02-11 08:13:06 +00:00
jekkos
3f12930223 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI
Conflicts:
	application/views/partial/header.php
	dist/opensourcepos.js
	dist/opensourcepos.min.js
	templates/spacelab/views/partial/header.php
2016-02-11 08:00:47 +01:00
jekkos
5fad0e13e8 Upgrade to jQuery 1.12.0 + regen minified js 2016-02-11 07:03:43 +01:00
jekkos
715eac28c8 Add jquery-migrate-1.3.0 (solves js issues) 2016-02-11 07:00:02 +01:00
FrancescoUK
d31e1cef8f Remove double jQuery line for file input (#116) 2016-02-10 23:35:38 +00:00
FrancescoUK
9cd31c761a Tidy up of legacy stuff (#116) 2016-02-10 23:28:18 +00:00
FrancescoUK
e99b9cbe41 Make choose file in General Configuration bootstrap (#116)
Used following jQuery plugin: http://gregpike.net/demos/bootstrap-file-input/demo.html
2016-02-10 23:27:28 +00:00
FrancescoUK
2f1d0fd4f7 Make edit item button in register bootstrap one (#116) 2016-02-10 20:37:05 +00:00
jekkos
2aae378808 Merge branch 'feature/bootstrapUI' of https://github.com/jekkos/opensourcepos into feature/bootstrapUI 2016-02-10 21:36:55 +01:00
FrancescoUK
29cdb8103f Fix to sales edit server error when customer is '' (#116) 2016-02-10 20:16:20 +00:00
FrancescoUK
2da08769b2 New icons + library for future additions (#116)
Source: http://www.elegantthemes.com/blog/freebie-of-the-week/beautiful-flat-icons-for-free
2016-02-10 18:24:45 +00:00
FrancescoUK
7a85d70139 Restore config.php comment line that somehow was cut out (#116) 2016-02-10 17:25:55 +00:00
FrancescoUK
e78d5ba461 Make empty table alert info not warning (#116) 2016-02-10 17:25:44 +00:00
FrancescoUK
5aefa2a116 Make add payment button the same style as complete sale (#116) 2016-02-10 17:25:34 +00:00
jekkos
32cbf109a4 Fix javascript minification in Grunt build
Fix config tab navigation in bootstrap (#116)
2016-02-10 17:25:19 +00:00
jekkos
d15f341f90 Trigger cachebreaker in all header.php files
Apply center-align style for barcode only on receipt
Remove obsolete tabcontent.js
Update js scritps in spacelab header (#116)
2016-02-10 17:24:49 +00:00
jekkos
b6d57a8f0e Add bootstrap 3.3.6 js file (needs jquery 1.9 minimum!)
Upgrade jquery to 1.12.0, remove older version + rebuild using grunt
Remove obsolete css for tabcontent
Remove 'custom' javascript for tabs in config module (#116)
2016-02-10 17:24:16 +00:00
jekkos
c48252790e Bootstrapify config module (#116) 2016-02-10 17:23:47 +00:00
jekkos
5c95e02eac Fix javascript minification in Grunt build
Fix config tab navigation in bootstrap
2016-02-10 08:43:01 +01:00
jekkos
b1b125d2a4 Trigger cachebreaker in all header.php files
Apply center-align style for barcode only on receipt
Remove obsolete tabcontent.js
Update js scritps in spacelab header
2016-02-09 20:02:16 +01:00
jekkos
634e626717 Add bootstrap 3.3.6 js file (needs jquery 1.9 minimum!)
Upgrade jquery to 1.12.0, remove older version + rebuild using grunt
Remove obsolete css for tabcontent
Remove 'custom' javascript for tabs in config module
2016-02-09 19:41:38 +01:00
jekkos
eee87c7bc2 Bootstrapify config module 2016-02-09 17:59:35 +01:00
FrancescoUK
c6855712d0 Change no items in cart to be info instead of warning (#116) 2016-02-08 21:38:05 +00:00
FrancescoUK
b27d94e316 Merge branch 'ci3' into bootstrapUI 2016-02-08 20:19:15 +00:00
FrancescoUK
ca8b5a75ea Merge branch 'master' into ci3 2016-02-08 20:18:25 +00:00
FrancescoUK
cb5a4c774c Add company name to top bar, change db backup style in config (#116) 2016-02-08 19:53:59 +00:00
FrancescoUK
7e269f1256 Change to bootstrap notification bars, cleanup old css files, moved styles to ospos.css, fixed ospos_print.css (#116) 2016-02-08 19:30:26 +00:00
jekkos
f9c882bf24 Fix spacing in autocomplete suggestion 2016-02-08 17:01:37 +01:00
FrancescoUK
f6356dd9e6 Fix more buttons to be bootstrap ones, fixed sales register, removed old style assets (#116) 2016-02-08 12:12:05 +00:00
FrancescoUK
d5e0230b19 Change button styles to use bootstrap standard, other fixes in style.css (#116) 2016-02-08 10:25:06 +00:00
FrancescoUK
1b0bcf4e0b Make bootstrap flatly the default ospos theme (#116)
Needs customisation on templates/<theme>/css/.. path to allow other templates to load just fecthing new css
2016-02-08 10:23:52 +00:00
jekkos
7180e7e9ed Update changelog for 2.3.4 2016-02-08 07:42:04 +01:00
FrancescoUK
09831faaf4 Fix reports listing font size (#116) 2016-02-07 23:16:54 +00:00
FrancescoUK
a5e66eabed Fix reports listing missing </div> issue (#116) 2016-02-07 23:11:27 +00:00
FrancescoUK
25f8a34b23 Change buttons in all the forms to use bootstrap button class (#116) 2016-02-07 23:04:59 +00:00
FrancescoUK
eb0cf07f4a Adjust flatly style.css (#116) 2016-02-07 23:04:44 +00:00
FrancescoUK
375f6860aa Small fix on class tags order (#116) 2016-02-07 23:04:19 +00:00
FrancescoUK
79f0961e09 Add jumbotron container to the footer (#116) 2016-02-07 23:04:01 +00:00
FrancescoUK
9ddccc6592 Fix footer overlapping last lines of the page (e.g. totals) (#116) 2016-02-07 23:03:44 +00:00
FrancescoUK
6606535fa9 remove dbbackup on logout from the two bootstrap themes (#116) 2016-02-07 23:03:18 +00:00
FrancescoUK
2ea14273b8 Merge branch 'ci3' into bootstrapUI 2016-02-07 18:07:54 +00:00
FrancescoUK
445222bcdd Merge branch 'master' into ci3 2016-02-07 18:03:44 +00:00
jekkos
40ddfdc2ab Merge pull request #319 from daN4cat/master
Remove dbbackup on logout #318
2016-02-07 15:09:02 +01:00
FrancescoUK
345d2d95d8 Remove dbbackup on logout (#318) 2016-02-05 18:42:04 +00:00
FrancescoUK
8a22f1c889 Merge branch 'ci3' into bootstrapUI 2016-02-05 17:03:57 +00:00
FrancescoUK
8d47faadd7 Merge branch 'master' into ci3
# Conflicts:
#	package.json
2016-02-05 17:01:07 +00:00
FrancescoUK
d07ed0c09f Merge remote-tracking branch 'jekkos/develop/2.4' into ci3 2016-02-05 16:57:27 +00:00
jekkos
24b4c98d94 Merge pull request #317 from daN4cat/master
Fixes to phppos to ospos 2.3.4 migration script #258
2016-02-05 17:36:16 +01:00
FrancescoUK
ea6fffc525 Add version liner so we remember which version the script works with (#258) 2016-02-05 09:06:54 +00:00
FrancescoUK
a0b422be34 Fix source script phppos_migrate.sql too (#258) 2016-02-05 09:05:57 +00:00
FrancescoUK
6599ea6678 Fix and add data copy rules. Tested script (#258) 2016-02-04 23:04:13 +00:00
jekkos
36cf19b1b9 Properly save company_name in customer form 2016-02-04 23:09:03 +01:00
FrancescoUK
9d056b2765 Remove invoice_number from phppos SQL migration script (#258) 2016-02-03 18:14:00 +00:00
jekkos
5c16c2a21a Use grep and wait for mysql to come up properly (#305) 2016-02-03 17:42:44 +01:00
jekkos
acd9beae73 Set npm package version number 2016-02-03 17:29:01 +01:00
jekkos
e598817287 Set correct version for npm package 2016-02-03 17:18:28 +01:00
jekkos
35d53e2fae Fix base url for testcases (#305)
Fix legacy ubuntu repository urls (#284)
2016-02-03 11:09:45 +01:00
jekkos
fa3d77299e Use curl to wait for apache start (#305) 2016-02-03 11:04:09 +01:00
jekkos
48a16d65e1 Fix base url for testcases (#305)
Fix legacy ubuntu repository urls (#284)
2016-02-03 10:49:20 +01:00
jekkos
89f126ab04 Use curl to wait for apache start (#305) 2016-01-31 16:03:19 +01:00
jekkos
67d9ca1e41 Merge branch 'master' into develop/2.4
Conflicts:
	Dockerfile
2016-01-29 17:34:53 +01:00
jekkos
8f9d80a809 Wait for container before running integration tests (#305)
Add integratoin test for quantity units (#305)
2016-01-29 17:24:28 +01:00
FrancescoUK
8698026e86 Fix indentation 2016-01-28 09:32:46 +00:00
FrancescoUK
ec5d0ab4f7 Merge branch 'ci3' into bootstrapUI 2016-01-28 09:31:19 +00:00
FrancescoUK
3425920cb6 Merge branch 'master' into ci3 2016-01-28 09:05:35 +00:00
jekkos
85c6da4346 Add integration test for making receiving (#305)
Update docker scripts to work with data volumes (#284)
2016-01-27 20:11:21 +01:00
jekkos
93460daadf Make 2.4 version string npm compatible 2016-01-27 11:00:18 +01:00
jekkos
574548f360 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2016-01-26 20:27:58 +01:00
jekkos
847c4a67c9 Add integration test for making sale (#305) 2016-01-26 20:27:07 +01:00
jekkos
8aab154a9f Disable sudo for travis tests, omit nodejs version 2016-01-26 16:27:06 +01:00
jekkos
a3119d1993 Add integration test for creating new item 2016-01-26 08:44:48 +01:00
jekkos
0a159c803f Add testcase for creating new item
Optimise CI setup
2016-01-25 21:14:48 +01:00
jekkos
22a7231d8f Run docker container in background + launch tests once ready 2016-01-25 19:16:13 +01:00
jekkos
c36f6b603d Run docker interactively in travis script step 2016-01-25 17:53:47 +01:00
FrancescoUK
05ff49616d Retouch opensourcepos.min.js hash changed due to merge from master -> develop/2.4 2016-01-25 09:47:41 +00:00
FrancescoUK
342b889371 Merge branch 'ci3' into bootstrapUI 2016-01-25 09:44:08 +00:00
FrancescoUK
8e5b8712c0 Merge branch 'master' into ci3 2016-01-25 09:20:04 +00:00
jekkos
f063aa16a8 Launch webdriver test in docker container 2016-01-25 09:34:10 +01:00
jekkos
2520970698 Fix comment for autogenerated sql files (#301, #258) 2016-01-25 08:42:15 +01:00
jekkos
a21a825aac Merge pull request #299 from daN4cat/master
Add a live clock functionality (#298) and fix Gruntfile.js (#297)
2016-01-25 08:36:43 +01:00
FrancescoUK
d66829d62d Merge branch 'ci3' into bootstrapUI 2016-01-24 23:01:41 +00:00
FrancescoUK
f52c5b0843 Add a live clock functionality to flatly and spacelab templates (#298) (#116) 2016-01-24 22:57:13 +00:00
FrancescoUK
d48dc8b87b Merge branch 'master' into ci3 2016-01-24 22:44:45 +00:00
FrancescoUK
8f72756737 Add a live clock functionality (#298) fix Gruntfile.js (#297) 2016-01-24 22:34:05 +00:00
FrancescoUK
4fd7948987 Made flatly as default, various header adjustments, added login with bootstrap (#116) 2016-01-24 20:05:36 +00:00
FrancescoUK
e76833d364 Merge 'cpl2015/boostrapUI' into bootstrapUI (#116) 2016-01-24 11:36:06 +00:00
FrancescoUK
3cb0094dde Merge branch 'bootstrapUI' of git://github.com/cpl2015/opensourcepos into cpl2015-boostrapUI
# Conflicts:
#	application/config/theme.php
2016-01-24 11:30:05 +00:00
FrancescoUK
946c50b222 flatly header.php code reformatting (#116) (#296) 2016-01-24 10:43:56 +00:00
FrancescoUK
1dccee389d Add favicon to flatly header.php (#116) (#296) 2016-01-24 10:43:26 +00:00
FrancescoUK
875c0b31b7 Apply changes from #226 (#116) 2016-01-24 10:39:58 +00:00
FrancescoUK
8bf77e27dc Change header template (#116) 2016-01-24 10:39:58 +00:00
FrancescoUK
a51352017a Overriding view files (#116) 2016-01-24 10:39:58 +00:00
FrancescoUK
68b28a17e4 Merge branch 'master' into ci3 2016-01-24 10:38:26 +00:00
jekkos
463af45e73 Remove test run in pre_install (travis-ci) 2016-01-24 10:28:00 +00:00
FrancescoUK
4ccab6b8b5 Code reformatting (#296) 2016-01-24 10:27:41 +00:00
FrancescoUK
1849ee807c Add favicon (#296) 2016-01-24 10:27:15 +00:00
cpl2015
bd7b4a1c14 Create style.css 2016-01-24 03:04:24 +05:30
cpl2015
c20520c877 Delete style.css 2016-01-24 03:00:29 +05:30
cpl2015
35aec3c34f Update header.php 2016-01-24 02:59:08 +05:30
cpl2015
d9e18551b5 Update receiving.php 2016-01-24 02:52:22 +05:30
cpl2015
144da1ed6b Update theme.php 2016-01-24 02:34:36 +05:30
cpl2015
125ffe9f73 Create home.php 2016-01-24 02:33:51 +05:30
cpl2015
a94f32dc50 Delete home.css 2016-01-24 02:33:08 +05:30
cpl2015
8c338fc223 Create footer.php 2016-01-24 02:32:36 +05:30
cpl2015
ca764a3165 Create header.php 2016-01-24 02:31:54 +05:30
cpl2015
b58547f988 Create home.css 2016-01-24 02:30:23 +05:30
cpl2015
05fbe8b218 Create style.css 2016-01-24 02:26:20 +05:30
cpl2015
823f8f0be3 Create bootstrap.css 2016-01-24 02:24:53 +05:30
cpl2015
b40b06a18e Delete spacelab 2016-01-24 02:16:38 +05:30
cpl2015
513250cadf Create spacelab 2016-01-24 02:11:23 +05:30
cpl2015
216432f4b6 Update manage.php 2016-01-24 01:38:02 +05:30
cpl2015
2b5825f841 Update form.php 2016-01-24 01:34:59 +05:30
cpl2015
46987845b3 Update form.php 2016-01-24 01:34:12 +05:30
cpl2015
e1cead8241 Update form.php 2016-01-24 01:30:49 +05:30
cpl2015
63f72b046d Update receiving.php 2016-01-24 01:24:14 +05:30
cpl2015
3fe39bbf73 Update register.php 2016-01-24 01:19:50 +05:30
FrancescoUK
81646a00ff flatly header.php code reformatting (#116) 2016-01-23 10:08:37 +00:00
FrancescoUK
8edd6a2e49 Add favicon to flatly header.php (#116) 2016-01-23 10:05:57 +00:00
FrancescoUK
4cc3eadb97 Apply changes from #226 (#116) 2016-01-22 22:17:29 +00:00
FrancescoUK
4b9d5113d3 Change header template (#116) 2016-01-22 22:17:29 +00:00
FrancescoUK
206751de0e Overriding view files (#116) 2016-01-22 22:17:29 +00:00
FrancescoUK
4dd3c64e9d Code reformatting 2016-01-22 22:16:50 +00:00
FrancescoUK
b400393a90 Code reformatting 2016-01-22 22:14:42 +00:00
FrancescoUK
1f9cb92697 Add favicon 2016-01-22 19:14:57 +00:00
FrancescoUK
59fe366479 Add favicon 2016-01-22 19:05:07 +00:00
FrancescoUK
8eba67ceb8 Merge branch 'master' into ci3 (#284) 2016-01-22 14:57:25 +00:00
jekkos
1148ef1595 Install grunt-cli in docker container (#284) 2016-01-22 14:43:53 +01:00
jekkos
bcbdee3a50 Fix test execution for travis-ci (grunt invocation) 2016-01-22 13:37:30 +01:00
jekkos
cfbb700f0c Add symlink for node in Dockerfile 2016-01-22 13:10:23 +01:00
FrancescoUK
95f6738d5b Fix package.json version to be 2.4 (#284) 2016-01-22 11:31:13 +00:00
FrancescoUK
0cde54e985 Merge branch 'master' into ci3 (#284) 2016-01-22 08:39:24 +00:00
jekkos
a3d3cfad61 Use Dockerfile in travis-ci setup (#284)
Set version in package.json
2016-01-22 08:18:40 +01:00
FrancescoUK
b89e9c56cc Merge branch 'master' into ci3 (#284) 2016-01-21 18:38:48 +00:00
jekkos
192955b33d Fix receipt barcode generation for docker (add php5-gd lib to Dockerfile) (#284)
Make setup scripts with CI3
2016-01-21 18:30:06 +01:00
jekkos
195c8a0601 Make docker work with 2.4 branch 2016-01-21 16:23:54 +01:00
jekkos
9048d68baf Make docker work wig 2016-01-21 16:23:17 +01:00
jekkos
2b70762b7a Use ubuntu trusty for Docker container + add startup scripts (#284)
Add Grunt concatenate for sql scripts (migrate + db init) (#289)
2016-01-20 18:47:44 +01:00
FrancescoUK
de2d034377 Update database/tables.sql script with new sessions table (#120) 2016-01-19 12:00:51 +00:00
FrancescoUK
f941a45d13 Update Copyright notice (#120) 2016-01-19 11:21:08 +00:00
FrancescoUK
4280e05679 Make the data blob NOT NULL in the SQL upgrade script (#120) 2016-01-19 08:24:58 +00:00
FrancescoUK
830f714a44 Change sessions to be stored in database and add SQL upgrade script 2.3.4 to 2.4 (#120) 2016-01-18 23:01:42 +00:00
FrancescoUK
f8c9acd88f Fix to custom fields that cannot be null on Items save (#120) 2016-01-18 20:15:24 +00:00
jekkos
d67f08d842 Add (temp) fix for cur_page conuter in CI pagination libary (#120)
Fix .htaccess file
2016-01-18 19:23:44 +00:00
jekkos
72fc36c8f5 Add (temp) fix for cur_page conuter in CI pagination libary (#284)
Fix .htaccess file
2016-01-18 20:13:07 +01:00
FrancescoUK
3c22f9069b Restore padding in pagination links, now it uses css (#120) 2016-01-17 19:02:08 +00:00
FrancescoUK
c2eaf88d74 Upgrade to CI 3.0.4 (#120) 2016-01-17 18:33:26 +00:00
FrancescoUK
b72d620b15 Added comments to some controller functions and improved spacing to improve readibility of code (#120) 2016-01-17 17:56:54 +00:00
FrancescoUK
dce413631c Make NULL to be null all over the code for consistency purposes (#120) 2016-01-16 22:08:43 +00:00
FrancescoUK
5468127e2f Further review and fixes to input->post(...) (#120) 2016-01-16 22:04:12 +00:00
FrancescoUK
d66e6ab6ef Fix to items search not working due to input->post returning null (#120) 2016-01-15 22:53:09 +00:00
FrancescoUK
a3929d2c6f Merge remote-tracking branch 'jekkos/master' into ci3
# Conflicts:
#	application/config/database.php.tmpl
2016-01-15 18:57:11 +00:00
jekkos
b5cc1542b6 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2016-01-13 18:58:40 +01:00
jekkos
1a77960daa Update README.md with instructions for Docker setup 2016-01-13 18:57:44 +01:00
jekkos
301fbf4427 Merge pull request #283 from ais-one/ais-one-php7-fix
php7 fixes
2016-01-13 17:59:01 +01:00
Aaron Gong
2f0666325f PHP7 Fix
Use __construct as constructor instead of Class name
2016-01-13 15:59:37 +08:00
Aaron Gong
d0c765ce20 PHP7 fix
Change driver from mysql to mysqli
2016-01-13 15:58:20 +08:00
jekkos
a1ad99cc0d Add Dockerfile. Ospos is now containerized. Pull image from
docker build -t me/ospos git://github.com/jekkos/opensourcepos.git

then run

    docker run -it me/opensourcepos

And head to port 80 to login to a new ospos install.
2016-01-13 08:45:10 +01:00
jekkos
2d0b20499e Set correct locale for Dutch (Belgium) 2016-01-11 18:53:57 +01:00
FrancescoUK
5b01e60ed2 Merge branch 'master' #274 change into ci3 2016-01-10 13:13:55 +00:00
jekkos
26ff81ab71 Generate languages for German (Swiss) #274 2016-01-09 17:29:57 +01:00
Thorsten
da3349765a Add de_CH language (by nano-riff #274) 2016-01-09 16:46:00 +01:00
FrancescoUK
b470fbfb3d Fix merge miss in constants.php (#120) 2016-01-07 20:57:57 +00:00
FrancescoUK
1f86842757 Complete CI 3.0.3 upgrade since it wasn't done in full (#120) 2016-01-07 20:16:59 +00:00
FrancescoUK
de47b11880 Remove application/errors, upgrade Step 8 (#120) 2016-01-07 19:09:53 +00:00
FrancescoUK
6b2b3969ec EXT constant deprecated, upgrade Step 20 (#120) 2016-01-07 19:09:53 +00:00
FrancescoUK
14c5a0823b Follow upgrade guideline Step 9 (#120) 2016-01-07 19:09:53 +00:00
FrancescoUK
98b5c8da28 Fix reports error due to report.php now being Report.php (#120) 2016-01-07 19:09:53 +00:00
FrancescoUK
cd7060afed Change config language to be 'en' consistent with the OSPOS language identifiers (#120)
However language support doesn't work properly at the moment.
2016-01-07 19:09:53 +00:00
FrancescoUK
0787264f71 Improve .htaccess with some security rules (#120) 2016-01-07 19:09:53 +00:00
FrancescoUK
347609d20c Upgrade config.php and database.php.tmpl to CI 3.0.3 versions (#120)
Apparently the upgrade wasn't complete.
2016-01-07 19:09:53 +00:00
FrancescoUK
0340dc7ffc Remove application/config.php and database.php (#120) 2016-01-07 19:06:35 +00:00
Toni Haryanto
d8057830c6 Upgrade to Code Igniter 3.0.3 (#120) 2016-01-07 19:06:35 +00:00
jekkos
4ddde65b41 Bump version to 2.3.4
Update dutch translation for company_name
Fix timeformat for date filtering in items module
2016-01-07 19:53:52 +01:00
jekkos
c408afad67 Cleanup migration script, mostly working now (#262) 2016-01-05 17:41:43 +01:00
jekkos
b1ba7d0afe Split up database.sql in scripts for tables and contraints.
Use both new scripts in phppos_migrate.sql
2016-01-05 07:41:49 +01:00
FrancescoUK
31a223cece Merge pull request #272 from daN4cat/master
#271 fix to error witn xampp due to a spurious "git"
2016-01-04 22:13:29 +00:00
FrancescoUK
3bd778737f #271 fix to error witn xampp due to a spurious "git" 2016-01-04 22:09:38 +00:00
jekkos
648251978e Merge pull request #270 from daN4cat/master
Fixes to #265, #267 and #269
2016-01-04 22:13:25 +01:00
FrancescoUK
240c96a185 #267 remove warning due to junk dirs being inside a language/xx one 2016-01-04 19:44:15 +00:00
FrancescoUK
810000e37c #265 do not override 404 handler in routes.php 2016-01-04 18:23:16 +00:00
FrancescoUK
6aa5126bf0 #269 fix https error issue 2016-01-04 17:55:00 +00:00
jekkos
90591382ce Further cleanup phppos migration script (#262) 2016-01-04 17:26:42 +01:00
jekkos
9e2d89c528 Show discounted price instead of discount itself on receipt 2016-01-04 17:19:50 +01:00
jekkos
1601d679fd Takings not using proper permission (#262) 2016-01-04 17:04:33 +01:00
jekkos
aa0409af48 Add phppos migration script (untested) #258 2016-01-01 17:10:43 +01:00
jekkos
ad194bd4c0 Fix typo in english translation (#260) 2016-01-01 16:46:58 +01:00
jekkos
1779685d31 Encode text before storing it as session variable (#254) 2015-12-30 08:10:14 +01:00
jekkos
51df82f35e Update WHATS_NEW 2015-12-30 07:42:27 +01:00
jekkos
bf0622d7fa Show discounted price per item line 2015-12-26 15:26:32 +01:00
jekkos
da25281df9 Show discounted price per item line 2015-12-26 15:21:54 +01:00
jekkos
2f52d083e8 Update changelog for 2.3.3 2015-12-26 13:13:47 +01:00
jekkos
eb63f49db7 Add barcode generation for EAN8 and EAN13 (#111, #246)
Add config option to use generation when generating barcodes for an
Generate propery barcode with configured format if item_number empty
2015-12-26 11:42:58 +01:00
jekkos
c007513fc8 Fix barcode generation error for empty item numbers 2015-12-13 15:57:03 +01:00
jekkos
9f5782e0ba Add validation for barcode types (#111, #246)
Fallback to code128 if invalid EAN8 or EAN13 is detected
2015-12-13 15:51:25 +01:00
jekkos
2f14a0f868 Fix typo in store language line (#247) 2015-12-13 14:15:43 +01:00
jekkos
fb924daa81 Show reoder level in items form when editing (#241) 2015-12-04 18:13:05 +01:00
jekkos
1bb9acdc37 Fix for adding/deleting stock locations (#242) 2015-12-04 18:09:51 +01:00
jekkos
16d5dfce77 Merge pull request #244 from kamaroly/master
Fixed Severity: Notice Message: Only variable references should be returned by reference Filename: core/Common.php Line Number: 257
2015-12-03 23:06:22 +01:00
Kamaro Lambert
afa203e73c Fixed error Only variable references should be returned by reference
Severity: Notice Message: Only variable references should be returned by reference Filename: core/Common.php Line Number: 257
2015-11-30 23:30:56 +02:00
jekkos
bc85391734 Submit form when hitting enter in search field for items module (#187) 2015-11-09 11:15:42 +01:00
jekkos
7c2cc9646d Don't override custom invoice numbers (#223) 2015-11-09 10:46:35 +01:00
jekkos
c0303cc873 Merge branch 'master' of https://github.com/asakpke/RoshanTech.com-POS 2015-10-20 22:01:37 +02:00
jekkos
0ddd80dc2c Regenerate thai language (#205) 2015-10-20 22:00:18 +02:00
songwutk
af582056d7 update sales_lang.csv : Thai
"sales_suspend_sale" too long in button, so change word fit.
2015-10-20 22:00:18 +02:00
jekkos
56859a77ab Fix path for jquery-ui icons (#207) 2015-10-20 13:23:20 +02:00
jekkos
ec5846e1eb Make receivings datetimepicker consistent with sales form (#169) 2015-10-18 21:37:49 +02:00
jekkos
6d5c192447 Add jquery-ui slider for datepicker #169 2015-10-17 00:22:57 +02:00
FrancescoUK
1b90ac14d2 #169 regenerate dist/ js scripts adding datetimepicker jQuery plugin 2015-10-15 19:12:50 +01:00
FrancescoUK
9c775ca44b #169 Add date and time picker to receivings/form
Some code indentation for better readibility.
2015-10-15 18:03:46 +01:00
FrancescoUK
0d87fc51d9 #169 Add a date time picker to sales/form such user can edit transaction date not in a manual manner
Needs more testing with different date & time formats and sorting out of min.js
2015-10-14 11:40:59 +01:00
jekkos
c4c7d9d792 Merge pull request #169 from marteserede/master
Fix dateformat value in SQL-Query app_config
2015-10-12 09:36:37 +02:00
jekkos
455a5f59d1 Merge pull request #199 from souparno/bug-condition-statement
if condition statement missing, may result in server error
2015-10-10 15:09:10 +02:00
souparno
9cf5d5734f if condition statement missing, may result in server error 2015-10-10 13:11:32 +05:30
jekkos
43b8d32efc Don't use empty on php expression (#196)
Signed-off-by: jekkos <jeroen.peelaerts@gmail.com>
2015-10-09 17:11:24 +02:00
jekkos
0c25b01666 Add default line endings 2015-10-09 11:43:19 +02:00
jekkos
1fd7fda645 Fix totals calculation when adding item multiple times (issue #165)
Fix typo in script comments
2015-10-09 10:24:38 +02:00
jekkos
3eb798917d Clear out empty sales and receivings comments on database upgrade
(#192)
2015-10-08 18:43:52 +02:00
jekkos
64023f6eec Avoid comments coercion to 0 when suspending sales (#192)
Invoice number in suspended sales should not be unique
2015-10-08 18:29:55 +02:00
jekkos
d8a369f39d Remove unique constriant from invoice_number column in suspended_sales 2015-10-08 18:29:55 +02:00
jekkos
98b0df9e80 Merge pull request #194 from daN4cat/master
#192 Remove 0 from comments
2015-10-07 13:11:18 +02:00
FrancescoUK
763a9e73fa #192 Remove 0 from comments
Checked in library get_comment if the string is null and return a '' if that's the case. That removes the 0 from sale comments
2015-10-07 09:37:27 +01:00
jekkos
df5a0448aa Merge pull request #193 from daN4cat/master
#192 Fix to comment not saved when suspending a Sale
2015-10-07 10:07:31 +02:00
Aamir Shahzad
76365afbd2 Added my name, ID and website in COPING 2015-10-06 22:58:37 +05:00
Aamir Shahzad
6e27b4c9ec Extra comments removed 2015-10-06 22:52:00 +05:00
FrancescoUK
a7e2ea5fa7 #192 Fix to comment not saved when suspending a Sale
The issue was that for a strange reason the comment was fetched directly from the form instead of using the sale_lib->get_comment like in the rest of the code.
2015-10-06 17:55:58 +01:00
Aamir Shahzad
986bbc9b36 Better Navigation with TAB key on Sales page 2015-10-06 03:31:57 +05:00
FrancescoUK
03f6d234bc #175 Fix inverted sorting issue 2015-09-28 22:47:16 +01:00
FrancescoUK
79361c976c Refactoring around items and sales search 2015-09-28 19:21:35 +01:00
FrancescoUK
1296f393d7 #175 Add pagination links 2015-09-28 18:24:02 +01:00
FrancescoUK
e49dd4e0b9 #179 Make Items Kit icon visible on home page
Remove the if statement that was in the end preventing any module having a _ to be displayed in the home page.
This solution is consistent with navigation bar one.

Also done some indentation in header and footer to improve readibility.
2015-09-28 13:12:22 +01:00
FrancescoUK
319545b989 #180 Fix to allowing a sale suspend before any payment
Reformatted the register code to increase readibility.
Please note that the real change is just moving the Suspend Sale button from finish_sale_form to cancel_sale_form, adding float:left style to Cancel button and changing the javascript for Suspend sale to address the correct form.
2015-09-28 08:59:22 +01:00
FrancescoUK
4a3e9ef79d #167 Limit description and serialnumber to 30 char before saving item to sale or suspended sale tables 2015-09-27 18:08:10 +01:00
FrancescoUK
e566223db9 #168 Items Kit: search by KIT id 2015-09-27 16:49:50 +01:00
FrancescoUK
22406d0c3a Merge pull request #176 from daN4cat/master
#165 Fix invoice wrong date on sale completion
2015-09-27 16:39:52 +01:00
FrancescoUK
8bb108503c #165 Fix invoice wrong date on sale completion 2015-09-25 19:02:03 +01:00
jekkos
1eb43d2a74 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-09-24 22:02:23 +02:00
jekkos
56f7be21ae Merge pull request #171 from souparno/bug-fix-reset-database
reset database syntax contains check, so as it can be used to create…
2015-09-23 22:57:46 +02:00
FrancescoUK
ba6ecf0319 #132 Fix date range missing end date items 2015-09-23 18:04:04 +01:00
souparno
47c8d6c0bd reset database syntax contains check, so as it ccan be used to create the database for the first time 2015-09-23 21:29:17 +05:30
FrancescoUK
d9c49c1a72 #132 revert a modification in item model 2015-09-23 13:00:34 +01:00
FrancescoUK
5af7473769 #132 Set 1-1-2010 as starting date for the date range 2015-09-22 19:01:40 +01:00
FrancescoUK
aa9cd1fe6a #132 Make sure we don't show multiple times the same item given a range 2015-09-22 18:38:21 +01:00
FrancescoUK
58899ca4cf #132 Added date range in item model. Smoke test fine, more to test 2015-09-22 18:38:20 +01:00
FrancescoUK
404bc47e96 #132 Added date picker to Items manage, added date range to controller + model 2015-09-22 18:38:19 +01:00
jekkos
7dfcec394f Substitute invoice numbers on complete once again (#163, #150) 2015-09-22 18:21:19 +02:00
jekkos
0646200f6c Increase colspan for suppliers list
Multiple item kit price with quantity at hand
2015-09-22 07:40:48 +02:00
Martes Erede
2bc7b688ff Fix dateformat value in SQL-Query app_config 2015-09-22 07:17:57 +02:00
FrancescoUK
9309d7f15b Fix to COPYING file to follow correct license & copyright format (see http://mit-license.org/) 2015-09-20 21:48:23 +01:00
FrancescoUK
87153fc70e Add time ranges for quick report searches 2015-09-20 15:03:16 +01:00
FrancescoUK
ff12531b42 Revert "#159 Fixed typo in comment"
This reverts commit f18b54a758.
2015-09-20 14:54:54 +01:00
FrancescoUK
f18b54a758 #159 Fixed typo in comment 2015-09-20 09:18:57 +01:00
FrancescoUK
9a47b448ac #153 Set private internal functions 2015-09-20 09:18:03 +01:00
FrancescoUK
569bf4db69 #111 Change databse.sql barcode defaults 2015-09-19 17:52:14 +01:00
FrancescoUK
f97e02c3d4 Items: allow custom field suggestion and search if checkbox is ticked 2015-09-19 17:46:28 +01:00
FrancescoUK
893345d334 #111 Change barcode types from numbers to strings for better code readability 2015-09-19 17:44:43 +01:00
FrancescoUK
80fcede1ca #152 Remove Alain name and add it to the COPYING under the Copyright section 2015-09-19 17:40:00 +01:00
FrancescoUK
461de2f048 #162 fix further issues due to cost & retail prices added to the table 2015-09-19 15:23:16 +01:00
FrancescoUK
4106378a6c Changed CONCAT and use of " & ' 2015-09-19 13:19:49 +01:00
FrancescoUK
dfb556b27b Fixed typo in comment 2015-09-19 12:43:08 +01:00
FrancescoUK
41607c23bd Fix to #161 when searching a Kit by name in Sales 2015-09-19 12:38:21 +01:00
FrancescoUK
a29b8c2a62 Added Kit prices to table view and barcode #162
Some spacing and retouching here and there.
2015-09-19 12:05:44 +01:00
FrancescoUK
dc45b77573 Fix to Gift card totals issue #159
Various indentation adjustments
2015-09-19 09:22:24 +01:00
FrancescoUK
ad948ac81e Fix to rebase/merge mistake with Barcode_lib 2015-09-18 18:05:43 +01:00
FrancescoUK
eee7f137ef Fix to rebase/merge mistake with Barcode_lib 2015-09-18 18:33:32 +02:00
jekkos
2237c332b9 Derive barcode id from item array 2015-09-18 18:33:22 +02:00
FrancescoUK
d5cf608bac Fix to #152 remove name of people from code comment and add them to COPYING license file 2015-09-18 18:33:22 +02:00
FrancescoUK
96973da280 Item kits issue #155 fix
Added Kit Id column to table view
2015-09-18 18:33:22 +02:00
FrancescoUK
bca4386aed Fix to sale and receiving receipt barcode 2015-09-18 18:33:22 +02:00
FrancescoUK
27f89a63be remove the - from language/id/common_lang.php 2015-09-17 22:00:06 +02:00
FrancescoUK
3f5d0b781b Fix to $lang["common_last_page"] issue #156 2015-09-17 22:00:06 +02:00
FrancescoUK
0984cdbfc4 Fix to sale and receiving receipt barcode 2015-09-17 22:00:06 +02:00
FrancescoUK
c48106f2f5 Fix items view search issue having a ' in the string. Bug #149 2015-09-17 21:59:34 +02:00
jekkos
e1ddcbbb5b Rename Item_quantities model to Item_quantity
Rename Stock_locations model to Stock_location
Fix barcode generation in receipts (sales + receivings)
2015-09-17 21:59:33 +02:00
FrancescoUK
2b7ceb4228 Move Print button in sale/manage (Takings) to top right 2015-09-17 21:59:33 +02:00
jekkos
3c89416b83 Update languages 2015-09-15 23:21:59 +02:00
jekkos
290aee4671 Merge branch 'patch-13' of https://github.com/songwutk/opensourcepos 2015-09-15 23:01:10 +02:00
FrancescoUK
10ea821b2a Leave item_number empty if Code39/128 is selected
Added Empty UPC checkbox in Items view to easily select empty items that need barcode code generation and in case of EAN8/13 fill in item_number
Added language for Empty UPC string
Indentation/spacing adjustment
2015-09-15 17:49:51 +01:00
FrancescoUK
cf0276c772 If item_number (UPC/EAN/ISBN) is empty and a new barcode is generated save it in the item_number field and update the item entry
Refactoring of barcode_lib
Some code alignment adjustment here and there
2015-09-15 11:13:58 +01:00
FrancescoUK
8f2740d349 Centred barcode image
Moved $data to base class and added getData
Fixed indentation
2015-09-14 23:20:20 +01:00
FrancescoUK
eb71dbc300 Fix EAN 13 typos + set pix per bar
Add EAN 8 support
2015-09-14 23:20:19 +01:00
FrancescoUK
68915dd28c Ean13 code generation implementation 2015-09-14 23:20:19 +01:00
FrancescoUK
93d8775ac5 Remove extra comma from end of array 2015-09-14 23:20:18 +01:00
FrancescoUK
807d48ac7b Add EAN13 in Barcode lib
Sketched EAN13 class code
Fix typo
2015-09-14 23:20:17 +01:00
FrancescoUK
79fd666bff Add Ean13 file and class
Fixed typos
2015-09-14 23:20:16 +01:00
FrancescoUK
393ac9bb97 Fixed some minor issues 2015-09-14 23:20:15 +01:00
songwutk
ac95e1f7d8 Update common_lang.csv
Fill thai blank topic.
2015-09-14 16:30:40 +07:00
jekkos
c843c174ed Initialize table sorting if this didn't happen when the page was loaded
initially (#139)
2015-09-14 08:26:41 +02:00
jekkos
d6f052f082 Add default translation in other languages as well (#142) 2015-09-12 20:55:54 +02:00
jekkos
a78ef2fb08 Merge branch 'master' of https://github.com/marteserede/opensourcepos 2015-09-12 20:16:46 +02:00
Martes Erede
4cbbd3a6f7 [#32] using to_currency for currency values in table-data 2015-09-11 16:16:34 +08:00
Martes Erede
4a8c3a83b3 [#32] adding new language-strings and running generate_languages.php 2015-09-11 15:59:27 +08:00
Martes Erede
308be8079f [#32] improving the inventory summary report, including total inventory value 2015-09-11 15:58:57 +08:00
jekkos
335ced948e Remove unneeded fields from sales_temp table 2015-09-09 23:20:31 +02:00
jekkos
b41a006a79 Fix duplicated payment amounts (#136) 2015-09-09 23:09:28 +02:00
jekkos
506aced23e amount_due and change_due were incorrect if multiple items in sale
(#136)
2015-09-09 19:25:44 +02:00
jekkos
e9ea2ba792 Create temp table when necessary 2015-09-07 22:53:19 +02:00
jekkos
2c5f3ee759 Add grunt-cache-breaker plugin (#137)
Fix tax inclusive pricing for daily sales overview (#136)
Fix table sorting when using search in daily sales overview (#131)
2015-09-07 22:15:41 +02:00
jekkos
b680cdff36 Fix table sorting after loading search results 2015-09-07 08:35:59 +02:00
jekkos
80f7966d1c Add default dateformat and timeformat in data scripts 2015-09-06 15:53:11 +02:00
jekkos
e62df579f1 Keep last row in position even after filtering 2015-09-06 13:33:12 +02:00
jekkos
2b6b3914a7 Mark totals row as static (keep it at bottom of the table issue #131) 2015-09-06 13:19:32 +02:00
jekkos
756b675e2b use configured dateformat for jquery ui date parser
disable sorting on columns 0 and 9 (no data there)
default sorting enabled on column 1
2015-09-05 15:05:20 +02:00
jekkos
1d65ceaccf Merge branch 'master' of https://github.com/daN4cat/opensourcepos 2015-09-05 09:52:48 +02:00
jekkos
0c92cc661f Remove date field type for filters 2015-09-05 09:52:30 +02:00
FrancescoUK
c87a936e22 Fix language issue 2015-09-04 23:24:53 +01:00
FrancescoUK
c041a18624 Added Print button to print the current view 2015-09-04 22:51:12 +01:00
jekkos
ac3aab51fa Fix payment summary update on search 2015-09-04 23:35:23 +02:00
jekkos
9281995029 Fix payment summary update on search
Merge branch 'master' of https://github.com/daN4cat/opensourcepos into daN4cat-master
2015-09-04 23:14:06 +02:00
jekkos
f36c700129 Add date filtering in sales overview
Add jquery-ui datepicker
Format dates in sale and receiving forms according to configured
dateformat and timeformat settings
Add missing translations in sale (click delete when not selecting
anything)
Add search box back to search for customer sales and ticket numbers
2015-09-04 22:09:24 +02:00
FrancescoUK
d35ef071bb - Added cash only filter
- Set to 'all' the sale_type so even returns are shown (we might want to add a drop down filter for this too)
2015-09-04 19:30:43 +01:00
FrancescoUK
852f83a8f6 Rename Overview to be Takings (normally used word in retail world) 2015-09-04 10:31:02 +01:00
FrancescoUK
7bbd651779 Remove commented out lines 2015-09-04 10:11:02 +01:00
jekkos
a624d21fcd Fix sale detail edit
Make last row in sale table bold (css)
Add default date range between yesterday and today
Temporarily comment out payment type listing in table itself (tbd)
2015-09-04 08:44:20 +02:00
jekkos
9a2cafc1b1 Review payment type overview
Add some padding to bottom of content area
Fix invoice only searching
Make start and end dates optional
2015-09-03 23:35:57 +02:00
FrancescoUK
b226a40efc Make Gift Card one payment item and not multiple ones in Sale/Overview and in Summary Payment report.
Fixed also the colspan and set to 10.
2015-09-03 19:18:15 +01:00
FrancescoUK
0b8a263443 Sale Overview change:
- set today as view date and comment out the debug dates
2015-09-02 23:22:44 +01:00
FrancescoUK
75fa706299 Sale Overview change
- Refactor and optimise payments part (added now amount to detail sale report too)
- fix some </tr> that should have been </td>
- minor indentation fixes

NOTE: The only_invoices checkbox is not responsive
2015-09-02 23:16:26 +01:00
FrancescoUK
c88f37f8e7 Change Sale Overview to become a daily takings view with totals. 2015-09-01 23:37:26 +01:00
jekkos
3e24b9caff Remove non working datepicker icon
Remove in_array check for duplicated company_name
2015-08-24 21:52:41 +02:00
jekkos
517363b485 Fix deleted checkbox in items form
Clear suggestion cache when toggling deleted filter
2015-08-18 18:10:00 +02:00
jekkos
011caf375f Apply is_deleted in item suggestion search 2015-08-18 08:35:21 +02:00
FrancescoUK
9f1485cfe5 Added Cost & Count to reports, improved Items suggest, added copyrights and some fixes
Added cost and count to reports

- Added cost in temp table, reports at bottom of page and in each
summary and detailed report
- Added count in all the reports
- Renamed some report fields name to make it generic and consistent
across views
- Fixed few issues here and there
- Adjusted some code indentation

NOTE: Proper translation of word Cost is required in all the languages
but English

Improved Items suggestion

- Added select to restrict results fields
- Added distinct in suppliers instead of the array match
- Added $is_deleted in model part but is not still effective

Add copyright statements in COPYING license file

- Added jekkos and FrancescoUK / daN4cat

Other people that contributed should add their statements.
2015-08-17 11:13:04 +01:00
jekkos
0336fe6298 Stop showing duplicate suggestions for company_name 2015-08-16 15:52:25 +02:00
jekkos
4ab2ec1b5b Add supplier attribute search for items (pull request #106)
Add company name to supplier column in summary report
2015-08-16 15:41:39 +02:00
jekkos
eb3657e76f Fix upgrade script (2) 2015-08-13 22:53:52 +02:00
jekkos
61206547cb FIll in empty location_ids for existing data 2015-08-12 15:10:08 +02:00
songwutk
9ae6e3242b Update Thai translate (Pull requests #98, #99, #100, #101, #102) 2015-08-11 18:49:28 +02:00
jekkos
7f5fe9efde Upgrade grunt-mocha-webdriver 2015-08-10 15:32:00 +02:00
jekkos
9e189a503e Merge pull request #105 from gabrielperezs/master
Solved to issues in this request. Spanish support, and temp table creation.
2015-08-10 11:03:58 +02:00
Gabriel Pérez S
da41aec0d1 Spanish traslation 2015-08-10 10:26:11 +02:00
Gabriel Pérez S
03b9924d57 Create table if not exists 2015-08-10 10:14:03 +02:00
jekkos
87222611e6 Remove duplicated last name for suppliers 2015-08-10 09:30:01 +02:00
FrancescoUK
cc06d93d30 Remove LICENSE file (use COPYING now instead)
Update agency_name constraint in update script
Show supplier_id in suppliers for use with item excel import
2015-08-09 12:01:09 +02:00
jekkos
7926a05948 Regenerate language files
Remove committed merge conflict in giftcard_numbering.js
Add sql upgrade script for 2.3.3
2015-08-07 17:17:53 +02:00
FrancescoUK
d7ff4a371c Fix to the License naming clash issue
- Instead of LICENSE used COPYING (it's accepted see:
http://www.theregister.co.uk/2013/04/18/github_licensing_study)
- removed license.txt inside license dir to avoid unnecessary
duplications or clash of license of the ospos code. COPYING is anyway a
rename of LICENSE that was a newer version than the one in
license/license.txt
2015-08-07 15:02:15 +02:00
FrancescoUK
aa144b43eb Fixed invoice date bug
The invoice date was not showing the correct date and neither following
the selected format
2015-08-07 15:02:15 +02:00
FrancescoUK
f806ea84b3 Update to Suppliers feature
- added Agency name to identify agent or distributor behind a brand
- updated view to show supplier ID useful for item imports via excel
sheet
- update database table
- updated language although missing translations
- various bit an pieces missing due to failed rebase
2015-08-07 15:02:15 +02:00
jekkos
17ac5b1837 Bump version number to 2.3.3 2015-07-25 12:03:04 +02:00
FrancescoUK
8bcd2a69dc Add better locale config support (pull request #93)
I've added in this commit the following:

- the means to configure date and time format
- date and time is shown with the selected formats
- a locale tab in the configuration page
- changed location tab to be stock tab and the same for the file names
- translation strings (only English) for the case

NOTE 1: Not related to Locale support but I removed an extra <div
class="field_row clearfix"> from general_config.php

NOTE 2: There is no rules in the submit checks of Locale. Probably this
is something to iron out a bit

NOTE 3: It would be probably nice to add a button in the Locale tab to
regenerate all the translation files in case somebody updates the
translations .csv

Fixed Local config

- Removed text in Red as really not mandatory configuration
- Added time format in 24h and 12h

Updated General Config tab

- reorganised the layout grouping things like company info, taxes and
invoice formating
- increased the limit of max lines per page to 1000 because 50 is too
little. People can do what they want with up to 1000
2015-07-25 12:02:10 +02:00
jekkos
e0f80528f4 Fix report generation regression 2015-07-15 18:14:58 +02:00
jekkos
491d8d0b72 Increase testcase delays
Keep keys order when reversing array for stock location options
2015-07-14 18:17:54 +02:00
jekkos
80dcc2f63f Increase waiting timeout for phantomjs test
Revert old database script
Add styling rules for number typed input fields
2015-07-14 12:36:43 +02:00
jekkos
92da2749ad Adapt report summary to chosen stock location
Update release notes
2015-07-13 18:39:50 +02:00
jekkos
83a297cf15 Add stock location as filter to detailed sales + receivings reports 2015-07-10 19:04:52 +02:00
jekkos
70b7a03c63 Show item location next to quantity purchased in detailed receiving and
sale report
Remove duplicate suggestions in sale and receiving module
Show item location on receipt if multiple are configured
Check if item location is allowed when adding items in sale or receiving
2015-07-08 21:41:41 +02:00
jekkos
b1f1feda48 Show alternative description on invoice only if not empty 2015-07-01 08:29:53 +02:00
jekkos
48fe4aa4cf Show item alternative description if available
Show sale instead of customer comments on invoice
2015-06-30 23:08:56 +02:00
jekkos
0788f4eef9 Set precision to 5 decimals (constants.php)
Show item description if serialized (invoice.php)
2015-06-28 14:20:39 +02:00
jekkos
fc5f097820 Add proper validation for module grants (issue #87) 2015-06-23 23:32:56 +02:00
jekkos
df7907fb8f Don't lose date precision when editing sale or receiving
Extend date validator to allow timestamps as well (sale + receiving)
Fix receiving edit
2015-06-20 20:58:41 +02:00
jekkos
46b5c18aca Add receiving_quantity field to ospos_receivings (issue #78)
Detailed receiving now correctly shows purchased quantity
2015-06-20 14:59:37 +02:00
jekkos
5c1ecf4618 Update .gitattributes with merge strategy for specific files 2015-05-25 13:28:03 +02:00
jekkos
ccc2af2a26 Show tax exclusive subtotal in case of tax inclusive pricing 2015-05-23 16:51:42 +02:00
jekkos
872d6857cd Add decent delay for waitForElement in wd test 2015-05-22 23:29:25 +02:00
jekkos
658792c1fc Fix invoice return 2015-05-22 19:26:56 +02:00
jekkos
4a324fbf4c Fix inventory update on deleting sale (issue #80) 2015-05-22 19:26:56 +02:00
jekkos
97d268e323 Tax summary report calculation fixes 2015-05-22 07:54:07 +02:00
jekkos
ca05583ec3 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-05-21 22:12:50 +02:00
jekkos
7d0a6dc7ae Merge branch 'feature/travis-ci' 2015-05-21 22:12:30 +02:00
jekkos
3ba3a3dea0 Merge branch 'travis-ci-setup'
Conflicts:
	test/login.js
2015-05-21 22:10:28 +02:00
jekkos
1ad08c014f Fix giftcard numbering issue #65 2015-05-21 22:00:33 +02:00
jekkos
3936f2dcf3 Add giftcard numbering test 2015-05-20 18:35:10 +02:00
jekkos
fcc71a5f74 Sale reporting now takes tax inclusive pricing into account 2015-05-19 22:44:03 +02:00
jekkos
46f6824199 Fix rounding issues with tax inclusive pricing
Add autocomplete in return mode
2015-05-19 20:46:42 +02:00
jekkos
7c0f884872 Remove trailing space (issue #76) 2015-05-19 09:40:30 +02:00
jekkos
15493ae58e Set correct url 2015-05-17 22:36:00 +02:00
jekkos
ac7c0241e5 Merge pull request #79 from nalamapu/patch-1
Update general_config.php
2015-05-17 21:44:32 +02:00
A.K.M. Nurul Alam
fd933e3ed6 Update general_config.php
'Comma' is the original spelling in English.
2015-05-16 12:14:21 +06:00
jekkos
6a2a5278b8 Fix general test setup (finally)
Add basic selenium test for application login
Adapt default database template file
Add correct db settings for travis-ci
2015-05-15 00:47:25 +02:00
jekkos
687d4c06c6 Fix general test setup (finally)
Add basic selenium test for application login
Adapt default database template file
Add correct db settings for travis-ci
2015-05-15 00:45:55 +02:00
jekkos
19f7c6aa57 Initialize mysql on travis 2015-05-13 00:14:11 +02:00
jekkos
ccf1a6209f Set travis.yml language to php (node should be default) 2015-05-12 23:44:43 +02:00
jekkos
4db6f28c76 Try to fix php-fpm absence (3) 2015-05-12 22:26:37 +02:00
jekkos
3e08ec99a5 Try to fix php-fpm absence (2) 2015-05-12 13:59:08 +02:00
jekkos
4142f0fc71 Try to fix php-fpm absence 2015-05-12 13:53:16 +02:00
jekkos
1d9a0bc8b6 Add travis-ci-apache 2015-05-12 13:52:32 +02:00
jekkos
a58510c541 Add apache2 + mysql setup for travis 2015-05-12 13:46:34 +02:00
jekkos
b2a37b7ded Add category column again 2015-05-01 12:11:49 +02:00
jekkos
69528baa21 Merge pull request #60
Update common_lang.csv

Spanish translation to CSV files. Spanish translation updated - xepaez 20150424

Added translation labels missing in CSV import forms.
2015-04-27 19:07:28 +02:00
jekkos
c5defaab35 Empty person_id field in giftcard edit if id is null 2015-04-27 19:07:28 +02:00
jekkos
af7910a6a8 Show giftcard number instead of id in edit form 2015-04-27 19:07:28 +02:00
jekkos
86eb397866 Enable sorting on giftcard number
Add default stock permissions for sales and receivings in upgrade script
2015-04-27 19:07:28 +02:00
jekkos
9b1785df01 Correct obvious punctuation error in item form.php 2015-04-27 19:07:28 +02:00
jekkos
8f09a32ef5 Correct latest alter table statements for 2015-04-27 19:07:28 +02:00
jekkos
c6d9a8a994 Show correct quantity in item form
invert ternary condittions to show correct quantity at any time
2015-04-27 19:07:28 +02:00
jekkos
54855849b3 Show item number in order report
Conflicts:

	application/controllers/reports.php
	database/database.sql
2015-04-27 19:07:28 +02:00
jekkos
7a9590359e Fix currency symbol when no dollars are chosen 2015-04-27 19:07:28 +02:00
jekkos
11eed40718 Update receivings.php
clear invoice number when changing receive mode
2015-04-27 19:07:28 +02:00
jekkos
bc7eeb5d30 Do not clear session state when switching sale or receiving modes
Set receiving quantity and discount validation to numeric instead of
integer
2015-04-27 19:07:27 +02:00
jekkos
4916f98bcb Fix currency symbol when no dollars are chosen 2015-04-14 13:04:46 +02:00
jekkos
c85dd1660e Add .idea folder to .gitignore 2015-04-13 18:21:15 +02:00
jekkos
08c0c2c63f Giftcard remaining balance is always shown in cash register
Giftcard person_id is optional now
Add some extra translations for giftcard warnings

Conflicts:

	database/2.3.1_to_2.3.2.sql
2015-04-09 18:28:57 +02:00
jekkos
81c24d7151 Do not clear sale and receiving libs when switching modes 2015-04-09 18:28:57 +02:00
jekkos
3d62a73c8c Report subpermission labels are shown properly in employee form now
Fix logic to show correct report subpermissions
2015-04-09 18:28:53 +02:00
jekkos
b8fba91244 Show tax names and amounts in invoice and invoice_email views
Fix invoice numbering for $YCO after update
2015-04-09 18:28:23 +02:00
jekkos
80dbe6efa7 Company name can be DEFAULT NULL in database 2015-04-09 07:18:50 +02:00
jekkos
3f46f1aca9 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-04-08 21:56:18 +02:00
jekkos
26fddcf8d4 Add custom repository for grunt-script-link-tags 2015-04-08 13:47:16 +02:00
jekkos
7a4df2a050 Fixup db script 2015-04-07 19:13:45 +02:00
jekkos
de3d7ce726 Add new language line for check_remainder 2015-04-07 19:10:46 +02:00
jekkos
4ffc5351af Add customer as a required field for giftcard
Show giftcard remainder if at least one payment is done using giftcard
2015-04-07 17:28:44 +02:00
jekkos
3f14c51c97 Update travis.yml 2015-04-06 16:55:46 +02:00
jekkos
e9b4e57c06 Add company_name column to ospos_customers 2015-04-06 15:47:38 +02:00
jekkos
70bb02c753 Change button order (default is submit now) 2015-04-06 15:45:49 +02:00
jekkos
6f7090d7ba Upgrade jquery.color
Conflicts:

	dist/opensourcepos.js
	dist/opensourcepos.min.js
2015-04-06 15:42:57 +02:00
jekkos
43ecda44e0 Receipt totals layout improvement (show top border when no discount or
tax section present)
Remove unexistant script include from invoice_email template
2015-04-06 15:38:52 +02:00
jekkos
04abb716fa Merge branch 'master' of https://github.com/jekkos/opensourcepos
Conflicts:
	dist/opensourcepos.min.js
2015-04-06 15:16:43 +02:00
jekkos
95ae2766cd Giftcard get_all parameters were in opposite order
Invoice layout improvements
2015-04-06 15:15:40 +02:00
jekkos
f45f75e458 Add functionality to keep item edit form open for easier working (in
sales, receivings and items module)
Refactor duplicated custom field code in item form
2015-04-06 15:15:40 +02:00
jekkos
b85b9d37a1 Add company_name field to customers for invoicing purposes
Total discount is now shown as one amount in receipt

Conflicts:

	application/controllers/sales.php

Conflicts:

	database/migrate_phppos.sql
2015-04-06 15:15:34 +02:00
jekkos
ebd473ea11 Update README.md
Add build status to Readme.md
2015-04-06 15:15:20 +02:00
jekkos
7d7ee83ef4 Add test folder + basic unit test setup
Add grunt mochaWebdriver plugin for phantomJs test

Conflicts:

	.travis.yml
	dist/opensourcepos.min.js
2015-04-06 15:15:14 +02:00
jekkos
27c6f275d1 Set focus to scan field when refreshing receivings module 2015-04-06 15:13:42 +02:00
jekkos
39edf5ccdb Add basic unit tests 2015-04-06 15:13:36 +02:00
jekkos
90c4df7f2a Update README.md
Add build status to Readme.md
2015-04-01 00:01:19 +02:00
jekkos
ae99555fec Add test folder + basic unit test setup
Add grunt mochaWebdriver plugin for phantomJs test
2015-03-31 23:58:05 +02:00
jekkos
8ff742085a Multiple total disconuts are shown correctly now 2015-03-31 21:56:44 +02:00
jekkos
86bf8866f0 Do duplicated cookie check before echo'ing output in items (fix for #49) 2015-03-31 16:33:29 +02:00
jekkos
a8f353de9c Add constraint for trans_location foreign key
Use Code128 for receipt barcodes in sales and receivings
2015-03-31 15:05:30 +02:00
jekkos
9b98f15f69 Receiving cancel delete should work now (confirm result was ignored)
receivings_items will now store the correct quantity_purchased when
using a value > 1 for receiving_quantity
Receiving delete message corrected
2015-03-30 16:37:26 +02:00
jekkos
138d1cbeef Remove duplicated click handlers on add/remove location 2015-03-26 13:00:08 +01:00
jekkos
9ead6fcca9 Add mochaSelenium config in Gruntfile (tests not running yet) 2015-03-20 13:50:14 +01:00
jekkos
ced5ca4e2e Make invoice numbers more consistent 2015-03-17 18:05:43 +01:00
jekkos
ca2c9a6ae4 Item refresh fix for issue #42
Invoice number in email message are denoted with $INV
Sale id's in email message are denoted with POS $sale_id
2015-03-17 17:41:12 +01:00
jekkos
cae9d3b67e Remove tags:css task in Grunfile (css files are imported the old way
again)
Fix sale delete confirmation in edit dialog
Add bower.json (still unused)
Fix autogenerated javascript load order
2015-03-17 16:47:49 +01:00
jekkos-t520
aa65593ce3 Add Gruntfile.js for concat+uglification of javascript
Enable debug=true cookie for full source inclusion in header.php
Add template in header.php to inject generated javascript files
2015-03-15 16:56:37 +01:00
jekkos-t520
c10860a005 Intercept pagination link click when search field is empty and filtering
checkboxes are set
2015-03-11 08:36:20 +01:00
jekkos-t520
a39e12e76d Externalize nominatim autcomplete functionality
Add chosen language to nominatim request
2015-03-10 14:37:36 +01:00
jekkos-t520
b29cb85b9b Add ticket suggestions for #40 2015-03-07 22:41:03 +01:00
jekkos-t520
6faaec53d6 Fix duplicate item suggestion issue #38
Fix return ticket suggestion issue #38
Fix discounted_total after hitting edit in sales register
2015-03-07 21:55:15 +01:00
jekkos-t520
b29ec8ef31 Fix show discounts functionality
Review tax price calculations
Remove tax exclusive price in invoice.php template
2015-03-07 19:35:13 +01:00
jekkos-t520
4ac1a943eb Update totals calculation
Update tax inclusive calculation
2015-03-06 00:58:44 +01:00
jekkos-t520
0e357f14f6 Add option to show total discounts on receipt 2015-03-05 08:28:58 +01:00
jekkos-t520
e0fd35220e Add custom search back into items
Fix proper pagintaion for filtered item views w/o search
2015-03-04 20:53:38 +01:00
jekkos-t520
ffb8501276 Fix custom search 2015-02-27 16:03:52 +01:00
jekkos-t520
8981efbd2a Fix error in database script
Add script to reset database easily (with root user)
Remove old git-svn script
2015-02-26 22:08:14 +01:00
jekkos-t520
b2f76f3fe6 Improve thai translation (Merge Pull Request #20)
Improve login screen
2015-02-26 21:55:55 +01:00
jekkos-t520
98cae8928b Cleanup table encoding + auto_increment
Conflicts:

	database/database.sql
2015-02-26 14:38:13 +01:00
jekkos-t520
b02b16b63e Only show company name in supplier's dropdown 2015-02-25 13:30:18 +01:00
jekkos-t520
81cb46bb8b Add router for sales overview 2015-02-25 13:30:18 +01:00
jekkos-t520
b11bf919af Automatically resize report columns
Remove text-transform for invoice header
2015-02-25 13:30:17 +01:00
jekkos-t520
9ee63294a4 Make report table headers resizable
Add suffix to pagination url (so extra filters can be maintained)
2015-02-25 13:30:17 +01:00
jekkos-t520
dbddb34ed4 Receipt total is recalculatd after edit now
Some css improvements for receipt printing
Adaptation of one or more labels
2015-02-25 13:30:17 +01:00
jekkos-t520
71c9294978 Giftcard customer selection cleanup 2015-02-25 13:30:17 +01:00
jekkos-t520
1226d217a6 Pagination search limit_from fixes (add limit_from hidden fields) 2015-02-25 13:30:17 +01:00
jekkos-t520
3204391521 Always show name instead of description (twice) 2015-02-25 13:30:17 +01:00
jekkos-t520
40ebba4252 Improve table layout a bit (change header sizes) 2015-02-25 13:30:17 +01:00
jekkos-t520
9351a263ee Review sales overview pagination (use generic intialisation in
secure_area.php)
2015-02-25 13:30:03 +01:00
jekkos-t520
cb1075e6c0 Remove sale_type parameter from get_detailed_sales and
get_detailed_receivings methods
2015-02-24 10:22:19 +01:00
jekkos-t520
33cf0422a7 Make javascript selector more specific 2015-02-24 09:21:03 +01:00
jekkos-t520
bd54a180d5 Remove location field from bulk edit 2015-02-24 08:55:44 +01:00
jekkos-t520
b752ec9952 Fix item bulk update 2015-02-24 08:51:09 +01:00
jekkos-t520
e688a24326 Fix sale suspend (redundant payment_type field was removed)
Gender is now properly saved in suppliers module
2015-02-24 08:10:53 +01:00
jekkos-t520
468b3e3580 Fix item_number barcode generation for item kits
Fix supplier pagination
2015-02-22 00:04:47 +01:00
jekkos-t520
e96dd7883e remove count_all
fix pagination row counts for modules
2015-02-21 23:58:31 +01:00
jekkos-t520
8e221033bf Add label for products on low inventory (items filtering)
Add stock location to method call for items pagination
Move item pagination links
2015-02-21 22:35:28 +01:00
jekkos-t520
17594f95f1 Add lines per page option
Add default sales discount option
Fix supplier pagination
2015-02-21 21:57:41 +01:00
jekkos-t520
9e427485f3 Fix items module filtering
Fix double to_currency wrapper for amount_change in receipt
Fix tablesorter js error with empty tables
Upgrade tablesorter.js to latest version
Adapt some labels for dutch
2015-02-21 18:05:12 +01:00
jekkos-t520
c389e6030c Fix pagination for all modules (links updated for index+search through
AJAX)
2015-02-20 17:36:03 +01:00
jekkos-t520
0f77300131 Sales overview added to register screen
Add pagination to default search routine
Remove payment_type column from sales table (was redundant)
Fix search spinner location (just toggle ac_loading class)
Complete sale labels
2015-02-20 15:54:13 +01:00
jekkos-t520
9856f0bc65 Add invoice dom sanity check before print 2015-02-20 09:25:31 +01:00
jekkos-t520
378d45691b invoice printer field greyed out if jsPrint addon is not installed 2015-02-20 09:22:21 +01:00
jekkos-t520
e7f9f29cd3 Create invoice checkbox was inverted 2015-02-19 18:15:35 +01:00
jekkos-t520
babddd524c Refactor variable substitution for receiving invoice numbers
Use localStorage to store selected printer
Add printer selection for invoice template
Print after sale checkbox is now present in receivings and sales screen
Remove print after sale options from receipt_config
Add default translations to receivings_lang.csv
Fix some bugs preventing to print and email at the same time
2015-02-19 18:10:31 +01:00
jekkos-t520
6ff19cb3f3 Merge branch 'feature/invoice_template' 2015-02-19 16:11:57 +01:00
jekkos-t520
42c30bf30b Invoice PDF generation working properly
PDF's can be sent as mail attachment
2015-02-19 15:32:16 +01:00
jekkos-t520
50006aeb6a Email pdf generation
Added invoice template
Add latest dompdf release
2015-02-18 18:18:09 +01:00
jekkos-t520
8edff136d0 Show company name on receipt when no logo is set 2015-02-18 08:53:18 +01:00
jekkos-t520
f6fb275dff Fix stock permission names (no more empty labels) 2015-02-18 07:42:20 +01:00
jekkos-t520
4025883765 show taxes was reversed 2015-02-18 00:16:18 +01:00
jekkos-t520
b9b8e2b4e5 remove php shorthand tags (incompatibility across installs) 2015-02-17 23:06:24 +01:00
jekkos-t520
13f6640576 Add show taxes checkbox value (state was not persisted)
Disable printing options when unchecking print after sale
2015-02-17 22:58:10 +01:00
jekkos-t520
aa969273db Disable config fields that require addon when this one is not enabled
Obey to user confirm outcome to save config or not
Fallback to window.print when addon is not installed (as it was
previously)
2015-02-17 17:08:46 +01:00
jekkos-t520
a809807288 jsPrintSetup plugin integration
All receipt print configuration options present now
2015-02-17 16:46:57 +01:00
jekkos-t520
2a07bbaef9 Merge branch 'master' into feature/receipt_config 2015-02-17 12:40:59 +01:00
jekkos-t520
4bc1d87782 Fix reports listing (listing itself was based on empty labels) 2015-02-17 12:39:32 +01:00
jekkos-t520
6710112f3d Change to bc-style operations for totals calculation in receivings 2015-02-17 12:20:53 +01:00
jekkos-t520
7ec4c21587 Merge branch 'master' into feature/receipt_config 2015-02-17 12:20:33 +01:00
jekkos-t520
9b61e0ad67 Add proper location id for 0 quantities 2015-02-17 11:14:28 +01:00
jekkos-t520
40eef74aa0 Adapt load_config hook to fallback to english if no valid language is
present
Move CI system language files back to their correct location
(form_validation_lang)
Add upload_lang.php and email_lang.php to system files (default english
version for the time being)
Add account_number check when importing customer data from excel
Avoid unnecessary calls to check_item_number when importing items from
excel
2015-02-17 11:06:28 +01:00
jekkos-t520
c7c4ac15d6 Set update_row response datatype to html
Remove MY_Validation override (not needed anymore)
Add jquery validation check for account_number
2015-02-17 09:03:47 +01:00
jekkos-t520
cf2ca1e6c7 Start receipt rework 2015-02-17 09:01:56 +01:00
jekkos-t520
9d0fb43fb1 add file extension to company logo filename 2015-02-15 12:53:56 +01:00
jekkos-t520
99c37ad9a7 Show real giftcard remainder on receipt (fix) 2015-02-12 15:51:46 +01:00
jekkos-t520
a8e15f7db0 Add company logo upload feature in config (will show on receipts) 2015-02-12 15:47:31 +01:00
jekkos-t520
b5c33b4fcb Add $YCO parameter (invoice numbering per year) 2015-02-12 15:19:57 +01:00
jekkos-t520
9e9a9a80a9 Fix tax percentage calculations (issue #42)
Use bcadd calculations for payment totals
Add tax inclusive option back into general_config
2015-02-12 14:57:39 +01:00
jekkos-t520
fe081779c5 Fix number_format bug when entering an empty payment amount
Add giftcard balance to final receipt (if giftcard payment present)
2015-02-12 14:34:08 +01:00
jekkos-t520
1267e92117 Fix sale and receiving return (incorrect receipt numbers were generated)
Fix item form width in receivings
2015-02-12 10:47:09 +01:00
jekkos-t520
d6f27141af Add back create invoice label 2015-02-11 17:25:45 +01:00
jekkos-t520
4b48a97166 Remove duplicated labels after merge
Add accidentally removed language lines
2015-02-11 16:42:28 +01:00
jekkos-t520
ed70fdc40b Change female language in english to 'F' 2015-02-11 16:33:28 +01:00
jekkos-t520
ade913f0e4 Merge github pull request #30 2015-02-11 16:31:31 +01:00
jekkos-t520
cd92f85691 Merge branch 'feature/customer_gender' 2015-02-11 14:30:15 +01:00
jekkos-t520
081bf77782 Fix module hotkeys 2015-02-11 14:29:57 +01:00
jekkos-t520
4e6a6d6434 Add gender to people + employees form 2015-02-11 14:29:46 +01:00
jekkos-t520
57cbbdab56 Remove content-length header for download
Clean headers (if already output) before force_download
2015-02-11 14:00:27 +01:00
jekkos-t520
4a6a69bdef Enable image headers again 2015-02-11 13:53:21 +01:00
jekkos-t520
88a9193d3a Remove escape characters from receivings_lang
Adapt confirmation dialog text for logout
2015-02-11 13:50:21 +01:00
jekkos-t520
4b99252a83 Change font-family globally to fixed order Arial-sans-serif-...
Remove second submit button on general_config page
2015-02-11 13:47:20 +01:00
jekkos-t520
8b1186c4f9 Fix barcode generation for item kits 2015-02-11 13:31:08 +01:00
jekkos-t520
2e36b7e03b Fix undefined offset error when using company_name with trailing
whitespace
2015-02-11 13:14:33 +01:00
jekkos-t520
b7751bde1a Fix serialized search filter in items module 2015-02-11 12:19:32 +01:00
jekkos-t520
f021215cbb Show proper error message on upload misconfiguration
Use jquery-validation to do item_number check
Fix invoice_number validation in sale edit form
2015-02-11 11:32:58 +01:00
jekkos-t520
9191eb4535 Show error messages in item form when upload fails
Remove check for validation flag in handle_server_validation
2015-02-11 08:53:16 +01:00
jekkos-t520
0fdb760d6f Add specific mime type for backup download 2015-02-10 21:20:10 +01:00
jekkos-t520
a46221ad04 Change compression method to zip again (retry) 2015-02-10 18:32:17 +01:00
jekkos-t520
da5c65e42e Fix location config bug (add check for disallowed characters)
Add labels for different languages (just default to english for now)
2015-02-10 16:34:16 +01:00
jekkos-t520
3594c348ee Fix stock location permissions for github issue #34 2015-02-10 16:04:52 +01:00
jekkos-t520
c40ad31ed0 Review item import (check item_number and throw proper error) 2015-02-10 15:43:10 +01:00
jekkos-t520
4579f16518 Add empty uploads/item_pics directories
Add .gitignore files to ignore uploaded item pics (or saved db scripts)
2015-02-10 11:17:46 +01:00
jekkos-t520
49a0a4e127 download backpus as plain sql file 2015-02-10 11:00:09 +01:00
jekkos-t520
d208e6dccb set menubar font sizes to px instead of pt
add item_number duplication check when adding new items
fix barcode on receivings receipt (after completion)
change backup db download format to gz
2015-02-10 10:56:37 +01:00
jekkos-t520
8b2a2f8074 Fix sale_id generation for sale receipt 2015-02-10 00:31:53 +01:00
jekkos-t520
84ffe5d4eb Add try catch to barcode generation (so errors are displayed in case of
config problems)
2015-02-10 00:05:42 +01:00
jekkos-t520
39301e7091 Fix receipts after sale and receiving completion 2015-02-09 23:37:19 +01:00
jekkos-t520
0a29809f7a Add item code as barcode label 2015-02-09 19:56:16 +01:00
jekkos-t520
4332bce401 Replace old code39 generator for receipts with new barcode_lib
functionality
2015-02-09 18:08:46 +01:00
jekkos-t520
42f4eb9c7b Add code128 as barcode_type 2015-02-09 17:32:45 +01:00
jekkos-t520
bd5e5b0b94 Remove item code as barcode parameter
Always show barcode itself as a second row
2015-02-09 17:03:52 +01:00
jekkos-t520
c763e8831f Increase width config tab
Increase width item kits form
Add ob_clean call to before force_download
2015-02-09 16:57:44 +01:00
jekkos-t520
0616560e3e Change barcode width/height constraints (set to minimum 10 for height
and 60 for width)
2015-02-09 09:47:01 +01:00
jekkos-t520
c7a898a89d Location autocomplete zipcode/city will fallback on different fields
when defaults are empty
Try to fix default text removal in register's customer/item selection fields
2015-02-09 08:51:00 +01:00
jekkos-t520
377284f491 Add company name to barcode layout options 2015-02-08 18:05:29 +01:00
jekkos-t520
93968814db Add sales and receivings format in general config 2015-02-08 17:51:03 +01:00
jekkos-t520
941ff4cd4a Upgrade jquery form to 3.51
Make item_number field non required
Save item_number properly
2015-02-07 20:22:21 +01:00
jekkos-t520
4d2de519a1 Set explicit version number for jquery-validation (1.13.1) 2015-02-06 17:34:37 +01:00
jekkos-t520
8fd315e389 Fix error message styling + add UPC required error message in items_lang 2015-02-06 17:28:49 +01:00
jekkos-t520
fe786b5888 Fix enable invoice labels (sales and receivings) 2015-02-06 17:06:31 +01:00
jekkos-t520
28711df45a Merge branch 'feature/item_pics'
Conflicts:
	application/helpers/table_helper.php
2015-02-06 16:55:09 +01:00
jekkos-t520
f77f2e6e29 item pics are now resized and cached server side 2015-02-06 16:53:37 +01:00
jekkos-t520
707114805d Fix autocomplete problem with new item in sales module 2015-02-06 15:48:57 +01:00
jekkos-t520
aebed9347b Merge branch 'feature/address_completion'
Conflicts:
	application/controllers/items.php
2015-02-06 15:01:54 +01:00
jekkos-t520
aa1c46738b Country code is now resolved using ipinfo.io api call
Address autocompletion mostly works now
2015-02-06 14:59:11 +01:00
jekkos-t520
080ae5df3a Upgrade jQuery to 1.8.3
Upgrade jQuery Validation to 1.3.2
Add jQuery migrate (for developmet purpose)
2015-02-06 14:58:22 +01:00
jekkos-t520
c04fa362b1 Add database backup feature in config 2015-02-06 11:22:03 +01:00
jekkos-t520
c7280e6018 Minor code review 2015-02-05 17:26:27 +01:00
jekkos-t520
374f9556d1 Don't try to preview images when there are none 2015-02-05 17:25:35 +01:00
jekkos-t520
ec6455647f Merge branch 'feature/item_pics'
Conflicts:
	database/2.3_to_2.3.1.sql
	database/database.sql
	translations/items_lang.csv
2015-02-05 17:05:51 +01:00
jekkos-t520
7081fe0338 Remove non free barcodegen library
Add width and height parameters for code39 barcode generation
2015-02-05 17:00:41 +01:00
jekkos-t520
8b6182dded Further fine tuning address autocompletion 2015-02-05 15:26:37 +01:00
jekkos-t520
f2fd360d23 Minimal working OpenStreetMap autocomplete
Refactor jkey F-key bindings
2015-02-05 14:08:40 +01:00
jekkos-t520
8ccba57d98 Images are not removed from items when no file is chosen
Image thumbnails are resized proportionally and updated after update_row
refresh
Add some padding to the thumbnails
Move select specific styles to ospos.css stylesheet
2015-02-04 15:29:34 +01:00
jekkos-t520
7efb1428f5 Basic image upload working now 2015-02-04 13:27:09 +01:00
jekkos-t520
46cfe0b18a Add databse upgrade script for 2.3.2 2015-02-03 17:33:43 +01:00
jekkos-t520
2f74c400bd Fix receipt barcodes (revert to the old script) 2015-02-03 15:08:21 +01:00
jekkos-t520
7c24682584 Fix stock location removal 2015-02-02 16:55:26 +01:00
jekkos-t520
215a2104a1 Add item_id/upc barcode content option
Fix tabcontent width
Improve location config screen
2015-02-02 15:48:41 +01:00
jekkos-t520
aae02b7420 Move location config to separate tab
Fix javascript error message display in barcode and location config
2015-02-02 14:46:05 +01:00
jekkos-t520
48867d44be Remove barcode.png
Set correct permissions on Arial.ttf
2015-02-02 13:24:26 +01:00
jekkos-t520
d3b9bc08c9 Merge branch 'master' into feature/barcode_patch 2015-02-02 12:54:04 +01:00
jekkos-t520
1bf839601a Barcode patch applied (using barcodegen) 2015-02-02 12:44:58 +01:00
jekkos-t520
bd763596b9 Bump version to 2.3.2 2015-02-01 14:48:25 +01:00
jekkos
dc12c7bdd2 Merge pull request #29 from marteserede/master
Two small edits (#27 and #28)
2015-01-30 08:01:22 +01:00
Martes Erede
4ddec66d7b #27 Using bc-style operations now. 2015-01-29 16:22:44 +01:00
Martes Erede
839849bf8d Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-01-29 16:16:55 +01:00
Martes Erede
b4ac74aa55 Bugfix #28 if invoice number is empty, set it to null, so no error occurs 2015-01-29 16:14:12 +01:00
jekkos-t520
8ac58a4612 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-01-28 19:25:37 +01:00
jekkos-t520
08325c8cf7 Fix last stock_locations config quirks 2015-01-28 19:25:18 +01:00
jekkos
43f4e9e790 Update README.md
add bitcoin donation address to readme
2015-01-27 23:40:50 +01:00
jekkos-t520
f497ac54f1 Review stock location management in config screen (merged old refactor
branch)
Remove some obsolete labels from tranlations csv's
2015-01-27 23:27:43 +01:00
jekkos-t520
f323bec9ca Merge branch 'refactor/edit_stock_locations'
Conflicts:
	application/controllers/config.php
	application/models/stock_locations.php
2015-01-27 19:24:59 +01:00
jekkos-t520
24a6c9c34f Config location editing works now 2015-01-27 19:03:57 +01:00
jekkos-t520
4f456c75f7 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-01-26 08:13:55 +01:00
jekkos-t520
8705b91bd3 Start refactoring the stock locations configuration screen 2015-01-26 08:11:21 +01:00
jekkos
16814f2d12 Update README.md 2015-01-25 16:39:31 +01:00
jekkos-t520
b9ee7b6b01 Invert quantity correction when deleting sales 2015-01-25 16:07:53 +01:00
jekkos-t520
344cb5c749 Add route for no_access controller with just one parameter
Remove permission dependency between sales, receivings and items module
Add explicit stock permission to sales and receiving modules
2015-01-25 15:46:42 +01:00
jekkos-t520
4556938154 Add cookie cleanup after search() and get_row() 2015-01-25 14:32:15 +01:00
jekkos-t520
a2b7ff688d Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-01-25 14:13:38 +01:00
jekkos
df71cb9cf8 Merge pull request #26 from marteserede/master
Fix for bug #39, error in excel_import
2015-01-25 00:22:26 +01:00
Martes Erede
927dbbabb6 Feature #27: Changing cost price while receiving items 2015-01-24 21:40:07 +01:00
Malte Srocke
7544aae394 Bug #25: Deleting a sale/receiving would not effect the stock/quantity. 2015-01-24 19:44:19 +01:00
jekkos-t520
868721c6f5 Adapt sql scripts for new barcode label options 2015-01-24 15:18:00 +01:00
jekkos-t520
1d9661d0b0 Add name, price and company name as possible barcode labels 2015-01-24 15:06:29 +01:00
jekkos-t520
e7fd57afdf Cleanup duplicate cookies when browsing items module 2015-01-23 00:18:43 +01:00
jekkos-t520
ad51278ba5 UPC config option now adds UPC content to barcodes as well 2015-01-22 23:36:56 +01:00
Malte Srocke
606eb01a67 - fixed excel import: if there was missing a location-id in the import-csv, then there would not have been created an entry into item_quantities for the item and location.
- fixed also the inventory info-part: before in the inventory-table there was no quantity inserted and data[10] as the location_id
2015-01-22 22:19:23 +01:00
jekkos-t520
94287ddec4 Make barcode text configurable 2015-01-21 13:14:16 +01:00
jekkos-t520
3d6d473145 Add item field autofocus in sales module
auto submit payment form when hitting enter in amount_tendered input
field
2015-01-19 12:35:09 +01:00
jekkos-t520
565a143c71 Merge branch 'master' of https://github.com/jekkos/opensourcepos 2015-01-19 12:07:40 +01:00
jekkos-t520
c959d97fd1 Fix for bug #39: item with 0 stock is not listed in item-list 2015-01-19 12:02:53 +01:00
jekkos
62c122e7ee Update WHATS_NEW.txt 2015-01-19 12:01:58 +01:00
jekkos
f3b3904b43 Merge pull request #23 from marteserede/master
Fixing session-table-name bug
2015-01-19 11:56:42 +01:00
jekkos-t520
883237a41c Regenerate language files (obsolete labels) 2015-01-16 18:43:39 +01:00
jekkos-t520
dd369118c5 Add check payment type to temp sales table again 2015-01-16 18:43:38 +01:00
jekkos-t520
b0aa62b044 Add turkish language (patch #24 Turkish Language) 2015-01-16 18:29:57 +01:00
jekkos-t520
84a141d9c5 Move translations into CSV files
Add generate_languages.php script (run using `php
generate_languages.php`)
Add generated language files
2015-01-16 17:40:41 +01:00
Malte Srocke
acb764a040 Changing config-sess_table_name value so no error occurs if dbprefix is changed to something else than "ospos_" 2015-01-14 23:34:43 +01:00
jekkos
37be5c9446 Merge pull request #17 from songwutk/patch-5
Update config_lang.php
2015-01-12 09:02:22 +01:00
jekkos
cd8d9a4a3d Merge pull request #16 from flodef/patch-4
Patch 4
2015-01-12 09:01:48 +01:00
jekkos
b1baa5609a Merge pull request #19 from songwutk/patch-7
Update items_lang.php
2015-01-12 09:00:53 +01:00
jekkos
614b4d48b6 Merge pull request #18 from songwutk/patch-6
Update module_lang.php (Thai)
2015-01-12 09:00:18 +01:00
songwutk
0b98050ea1 Update items_lang.php
Update Thai Translate
2015-01-12 12:36:24 +07:00
songwutk
3e0a6d9ba6 Update module_lang.php
Fix duplicate variable
2015-01-12 12:25:45 +07:00
songwutk
94c4a0c909 Update config_lang.php
Update more translate config from English.
2015-01-12 12:23:56 +07:00
Florian
ae454026dc Update upload_lang.php 2015-01-10 18:43:12 +01:00
Florian
e9e6290151 Update unit_test_lang.php 2015-01-10 18:42:41 +01:00
Florian
d7ed07f4f4 Update profiler_lang.php 2015-01-10 18:39:51 +01:00
Florian
ed3234ff30 Update number_lang.php 2015-01-10 18:39:22 +01:00
Florian
1ff7e271a5 Update migration_lang.php 2015-01-10 18:37:38 +01:00
Florian
5e4a6af3b7 Update imglib_lang.php 2015-01-10 18:37:01 +01:00
Florian
34d8ef7637 Update ftp_lang.php 2015-01-10 18:36:39 +01:00
Florian
cb760d9ed8 Update form_validation_lang.php 2015-01-10 18:36:08 +01:00
Florian
5af96fb082 Update email_lang.php 2015-01-10 18:35:32 +01:00
Florian
248c47d94a Update db_lang.php 2015-01-10 18:35:04 +01:00
Florian
1ee5b66a45 Update date_lang.php 2015-01-10 18:34:28 +01:00
Florian
fc0e691569 Create calendar_lang.php 2015-01-10 18:33:17 +01:00
jekkos
2ad00de947 Update 2.3_to_2.3.1.sql
[opensourcepos:bugs] #38 remove hardcoded reference to database name
2015-01-09 15:57:45 +01:00
Florian
6445c463a4 Create upload_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 15:09:09 +01:00
Florian
1b8d40d7ed Create unit_test_lang.php
Translate unit_test_lang.php to French.
2014-12-31 15:08:33 +01:00
Florian
4d6a5189c1 Create profiler_lang.php
Translate profiler_lang.php to French.
2014-12-31 15:05:43 +01:00
Florian
326b074a22 Create number_lang.php
Translate number_lang.php to French
2014-12-31 14:59:46 +01:00
Florian
ccbe227666 Create migration_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 14:58:25 +01:00
Florian
228b99ebbf Create index.html
Translate index.html to French
2014-12-31 14:57:48 +01:00
Florian
9df3236176 Create imglib_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 14:56:21 +01:00
Florian
546b94f1e9 Create ftp_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 14:55:55 +01:00
Florian
dbec337742 Create form_validation_lang.php
Translate form_validation_lang.php to French
2014-12-31 14:55:24 +01:00
Florian
e387ddaf1a Create email_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 14:45:23 +01:00
Florian
2fc34a55b1 Create db_lang.php
Didn't translate this one yet, but will finish the job later ...
2014-12-31 14:44:43 +01:00
Florian
17b0f452ca Create date_lang.php
Translate date_lang.php to French
2014-12-31 14:43:12 +01:00
jekkos-t520
0f34a6ace4 Ignore receiving_quantity = 0 for receivings 2014-12-26 11:39:26 +01:00
jekkos-t520
58dc5e3062 Newly created item in sales module is auto added to sale again 2014-12-19 08:47:40 +01:00
jekkos-t520
c00c604c21 Fix tax inclusive pricing for non taxable customer
Show receiving quantity in receiving receipt
Allow to use invoice number as zero (a bug prevented 0 to be saved to
db, causing it to stop incrementing next time)
2014-12-18 19:55:20 +01:00
jekkos-t520
0132c9092c Remove clear enable functions 2014-12-16 19:00:15 +01:00
jekkos-t520
efff9d20c1 Add giftcard number autogeneration 2014-12-16 18:36:26 +01:00
jekkos-t520
07a32a0deb Remove invoice / sale format enable option
Add giftcards -> person_id foreign key constraint
Fix tax calculation for non taxable customers
Improve giftcard person autocompletion
2014-12-16 08:49:49 +01:00
jekkos-t520
b546883d2a Dashes are allowed now in barcode text
Update barcode with newer drop in version (thanks Odie)
2014-12-15 00:09:44 +01:00
jekkos-t520
0569275c4e Add receivings invoice number enable/disable
Ignore invoice number unique constraint when invoice is disabled
2014-12-06 10:46:16 +01:00
jekkos-t520
e3288ae759 Revert newly added receivings functionality 2014-12-04 23:23:10 +01:00
jekkos-t520
64f1b4191a Invoice number can now be enabled/disabled
Invoice unique constraint only applies when enabling invoice
Correct several HTML structure errors in sale and order modules
Make the top module bar a bit wider
Fix payment details css when hiding/showing invoice number field
2014-12-04 22:01:40 +01:00
jekkos-t520
1c1b89db21 Fix detailed sales report for sale_type = sale 2014-12-04 08:49:36 +01:00
jekkos-t520
ee30b178b4 Remove duplicate statement from 2.3.1 sql upgrade script
Remove quantity column from database.sql
Update item import example with correct location id
Fix detailed report receipt links
2014-11-28 08:51:08 +01:00
jekkos-t520
44b5404fe7 Fix missing invoice number in sales receipt 2014-11-27 08:48:15 +01:00
jekkos-t520
78ca94e036 Fix detailed report editing 2014-11-27 08:44:50 +01:00
jekkos-t520
d7a61080e2 Add duplicate invoice number error message in sales module
Fix colspan width for receivings (one column was added for
receiving_quantity)
2014-11-26 21:56:18 +01:00
jekkos
27e1bfe871 Merge pull request #11 from flodef/master
Add record time to giftcard
2014-11-26 08:55:49 +01:00
jekkos
7d70fa70a6 Merge pull request #13 from flodef/patch-3
Update register.php
2014-11-26 08:54:44 +01:00
jekkos-t520
6bd6080ccc Fix customer field focus in register screen 2014-11-26 08:25:45 +01:00
jekkos-t520
b311eca62e Fix receiving_quantity error in receivings page 2014-11-26 08:17:43 +01:00
jekkos-t520
99a804c1ac Fix item quantity after edit 2014-11-26 08:10:15 +01:00
jekkos-t520
5f3a81ee5c Merge branch 'master' of https://github.com/jekkos/opensourcepos 2014-11-25 23:04:25 +01:00
jekkos-t520
af8b88d030 Fix config module layout (wider + adapt setting labels) 2014-11-25 21:45:01 +01:00
Florian
08368b6279 Update register.php
Correct an HTML mistake : replace </tr> by </td>
2014-11-25 20:24:46 +01:00
jekkos-t520
97d37b5ad9 Merge branch 'feature/sale_numbering'
Conflicts:
	application/libraries/Receiving_lib.php
	database/2.3_to_2.3.1.sql
	js/manage_tables.js
2014-11-25 17:20:05 +01:00
jekkos
969abe1d34 Merge pull request #7 from flodef/patch-1
Update Sale_lib.php
2014-11-25 11:35:07 +01:00
jekkos-t520
5a40c31af3 Merge branch 'fix/recv_amount_multiplication' 2014-11-25 08:43:10 +01:00
jekkos-t520
62977bf89f Refresh only editd rows after bulk refresh 2014-11-25 08:32:55 +01:00
jekkos
f88baad4b7 Merge pull request #3 from songwutk/patch-2
fix bug duplicate config
2014-11-25 00:11:26 +01:00
Florian
27de99fe78 Update giftcards.php
Add a "record_time" to the giftcard saving function to be know when a new giftcard has been added.
2014-11-24 20:11:47 +01:00
Florian
44515ee999 Update database.sql 2014-11-24 20:06:44 +01:00
jekkos
90c1934d92 Merge pull request #6 from curthauta/import_items
fixed quantities on items import
2014-11-20 10:19:41 +01:00
jekkos
bb3fbb03b1 Merge pull request #9 from flodef/patch-2
Update register.php
2014-11-20 10:17:39 +01:00
jekkos
d6926fee9f Merge pull request #10 from flodef/patch-3
Update register.php
2014-11-20 10:15:49 +01:00
flodef
ba47d5e4ff Update register.php
- Correct previous commit when it was impossible to set any value anymore (oooops, I went too quickly on this one)
- Use .val instead of .attr("value") because the latter is deprecated
2014-11-14 22:40:36 +01:00
flodef
fe14180ec5 Update register.php
- Remove unused variable : $cur_item_info
- Change .click for .focus : correct a bug when the text doesn't disappear on chrome after changing tab
2014-11-14 22:30:16 +01:00
flodef
15d15b9750 Update register.php
Price should have it's currency
2014-11-14 20:31:04 +01:00
jekkos-t520
46af17845f Merge branch 'master' of https://github.com/jekkos/opensourcepos 2014-11-13 16:51:09 +01:00
jekkos-t520
2c706dc752 Rename receivings_quantity to receiving_quantity 2014-11-13 16:50:52 +01:00
jekkos-t520
4893da0e43 Added enable invoice checkbox 2014-11-13 13:28:42 +01:00
flodef
26bee3e5a6 Update Sale_lib.php
Clean "add_payment" to be simpler : don't need to declare $payment in the main as it used only to add to an existing array
Fix "edit_payment" that was trying to set a payment on the $payment_id (expected payment data : $payments)
2014-11-11 13:04:27 +01:00
jekkos-t520
1b41c93441 Fix item row refresh in detailed receivings and sales 2014-11-07 18:03:45 +01:00
jekkos
1dd9a7ea2c Merge pull request #4 from songwutk/patch-3
Update Thai translate
2014-11-06 08:52:27 +01:00
jekkos
6286f6cc11 Merge pull request #2 from songwutk/patch-1
Rename Thai menu (Gift Card)
2014-11-06 08:14:11 +01:00
jekkos-t520
094a293c78 Fix invoice number insert in receivings 2014-11-06 07:35:54 +01:00
Curt Hauta
8ae21bbcb7 fixed quantities on items import 2014-11-05 20:01:25 -07:00
jekkos-t520
035f2ad946 Review receivings quantity mulitplier 2014-11-04 08:14:16 +01:00
jekkos-t520
54fe0c4c30 Fix sales/receivings deletion 2014-11-03 19:22:36 +01:00
jekkos-t520
d43015e8c9 Set default receivings value for items to 1 in database
Fix item quantity save
2014-11-03 18:08:57 +01:00
jekkos-t520
7a46078734 Add receivings_quantity to item form
Conflicts:

	application/libraries/Receiving_lib.php
	database/2.3_to_2.3.1.sql
2014-11-03 18:07:50 +01:00
jekkos-t520
3007173833 Add invoice numbering to sales module 2014-10-31 07:58:46 +01:00
jekkos-t520
96c349b099 Add invoice numbering to sales module 2014-10-30 19:22:49 +01:00
songwutk
e5e74f3ffb Update Thai translate
Update Thai translate
2014-10-26 06:37:53 +07:00
songwutk
851333b72c fix bug duplicate config
fix bug duplicate config & update thai translate
2014-10-26 06:29:07 +07:00
songwutk
00045c3f97 Rename Thai menu (Gift Card) 2014-10-26 06:14:28 +07:00
jekkos-t520
cc9adeef47 Set supplier_info to default value (fix warning with empty supplier)
Conflicts:

	application/controllers/receivings.php
2014-10-23 21:32:19 +02:00
jekkos-t520
37c80deb83 Show error message correctly in receivings 2014-10-23 18:35:34 +02:00
jekkos-t520
9d765efc94 Add invoice number duplication check in receivings screen
Add invoice number duplication check in receivings detailed report
2014-10-23 18:02:33 +02:00
jekkos-t520
4e071c9fbb Fix blank page when returning receivings
Conflicts:

	application/libraries/Receiving_lib.php
2014-10-22 07:11:37 +02:00
jekkos-t520
fe6820920b Add edit form in detailed receivings report
Add language lines for detailed sale & receiving validation
Add permission for getting updated sale & receiving detail row
2014-10-21 21:39:22 +02:00
jekkos-t520
08dcd9e384 Fix totals calculation in receivings module 2014-10-20 18:31:33 +02:00
jekkos-t520
31877528b1 Security update for report subpermissions 2014-10-17 08:29:46 +02:00
jekkos-t520
7fad710277 Reports module now has checks on the required submodules when entering direct urls 2014-10-16 18:31:35 +02:00
jekkos-t520
7bcb1d7531 Fix totals calculation in sales register 2014-10-16 08:23:47 +02:00
jekkos-t520
0863b4ebba Add extra permissiosn checks to report methods
Adapt no_access page to show missing grant
Adapt Email library to customize return_path header
2014-10-16 08:20:36 +02:00
jekkos-t520
20fed1d457 Update database script to latest version again 2014-10-13 19:09:42 +02:00
jekkos-t520
bc514889a8 Add detailed reports again (permission_id wasn't set properly)
Finish updqate script
2014-10-13 18:57:07 +02:00
jekkos-t520
868de15fcb Invoice number is now substituted correctly after complete
Fix payments summary report
Update upgrade script (not tested yet)
2014-10-13 12:30:37 +02:00
jekkos-t520
dad16b7a71 Receivings comments and recv_invoice_format fields are updated on keyup now 2014-10-12 12:47:45 +02:00
jekkos-t520
de06b64e4e Fix warning in specific discount report (add category to query)
Add grant for default stock location in sql
2014-10-12 03:18:19 +02:00
jekkos-t520
ac667a23dc Refactor report listing (again)
All reports have proper permissions now (categories, taxes, discounts,..)
Minor refactoring and code cleanup
2014-10-12 02:54:54 +02:00
jekkos-t520
54fbb4e7d7 Refactor stock location save
Add config to permissions and grants in database script
2014-10-11 17:55:00 +02:00
jekkos-t520
cda41622e4 Merge branch 'refactor/module_permissions' into feature/invoice_numbering
Conflicts:
	database/database.sql
2014-10-10 16:38:07 +02:00
jekkos-t520
802a0e6a59 Refactor report listing (move sales specific grants to employee model) 2014-10-09 17:56:24 +02:00
jekkos-t520
77222c1989 Fix supplier selection 2014-10-08 19:27:07 +02:00
jekkos-t520
bb9ab9bd9c Finish stock location refactoring
Modules are inaccessible if permissions not configured correctly
2014-10-07 21:47:07 +02:00
jekkos-t520
a1eb735d96 Remove empty check for item_id and quantity_id when saving item_quantities
Add configuration key to database script
2014-10-07 08:27:31 +02:00
jekkos-t520
aee5f3d27e Add ospos_grants table
Refactor permission and module system
2014-10-07 00:47:30 +02:00
jekkos-t520
97ff190ba5 Receivings can now use invoice numbers with a specified format (in config section)
Fix some more stock location related bugs
Some refactoring todo for creating/updating stock locations
2014-10-05 22:53:42 +02:00
jekkos-t520
1afbc03304 Merge branch 'feature/multistore_support' into feature/invoice_numbering 2014-10-04 16:49:22 +02:00
jekkos-t520
5e8367681b Fix default location in items, sales and receivings 2014-10-04 13:38:52 +02:00
jekkos-t520
bac80e3a92 Added invoice_number field to receivings table
Save comments field in receivings as in sales
Add translations for cancel button in receivings
Add cascading deletes for ospos_permissions
2014-10-04 13:19:24 +02:00
jekkos-t520
5a4ac8dde3 Fix comments in receivings 2014-10-03 17:41:39 +02:00
jekkos-t520
e994cd5444 Fix default location selected (now uses allowed locations only) 2014-10-03 10:33:34 +02:00
jekkos-t520
d486202c4f Merge branch 'feature/multistore_support' into feature/invoice_numbering 2014-10-03 08:03:59 +02:00
jekkos-t520
298135dabc Remove obsolete item_unit method 2014-10-03 08:03:37 +02:00
jekkos-t520
eb51b680aa Show stock location names in employee form 2014-10-03 00:27:50 +02:00
jekkos-t520
48acd204f1 Show stock location names in employee form 2014-10-02 23:26:29 +02:00
jekkos-t520
2929dfe9dd Add stock location filtering on items 2014-10-02 19:33:35 +02:00
jekkos-t520
290533612e Fix submodules in header 2014-09-29 21:06:06 +02:00
jekkos-t520
13127c4dc7 Deny access to report submodules on which employee doesn't have permissions 2014-09-24 08:47:00 +02:00
jekkos-t520
5cf73130c5 Modules are not accessible if employee has no permissions on at least one of it's submodules
Some more db script modifications
2014-09-23 19:14:25 +02:00
jekkos-t520
4b16b68f24 Added more granular permissions for report module
Extend permission system to allow 'submodule' permissions
Add permissions for stock locations (multistore support)
2014-09-22 20:41:53 +02:00
jekkos-t520
e03611080e Merge branch 'feature/tax_included_pricing' 2014-09-15 21:27:33 +02:00
jekkos-t520
ff7b305058 Added tax inclusive pricing to sales and receivings 2014-09-15 21:27:11 +02:00
jekkos-t520
0d76974e69 Discount field in receiving made editable again 2014-09-15 20:18:24 +02:00
jekkos-t520
87c242b35f Discount field in receiving made editable again 2014-09-15 20:14:37 +02:00
jekkos-t520
e43f7ac7bb Add deleted checkbox filter in items page (was remove due to wrong merge) 2014-09-10 19:03:19 +02:00
jekkos
c9c389e9f3 Update README and WHATS NEW
git-svn-id: svn+ssh://svn.code.sf.net/p/opensourcepos/code/@132 c3eb156b-1dc0-44e1-88ae-e38439141b53
2014-09-10 18:58:56 +02:00
jekkos-t520
b06e103895 Database script renamed 2014-08-17 01:55:51 +02:00
jekkos-t520
2cb322f88f Default stock name is the same as in update script 2014-08-17 01:45:36 +02:00
jekkos-t520
ed15532cc4 Merge branch 'merge/padungsak'
Conflicts:
	database/database.sql
2014-08-17 01:22:12 +02:00
jekkos-t520
a61bc10dde Location column is kept in database
Added a data migration script for stock_locations and item_quantities tables
2014-08-17 00:49:48 +02:00
jekkos-t520
43189d0748 Clear sale and receiving libs (sessoin state) when changing stock locations 2014-08-13 01:16:37 +02:00
jekkos-t520
e1e5434e2a Stock locations are now shown on receivings and sales receipts
Database migration script now defines a default stock location name
Rmeove obsolete constraints from migration script
2014-08-11 13:10:29 +02:00
jekkos-t520
aed9fb8dd7 Fix barcode generation (removed whitespace from stock_locations model)
Fix error in receivings receipt
Update database migration script (needs more review)
2014-08-10 17:51:14 +02:00
jekkos-t520
b3b19ab4c5 Add migration script for 2.2.2 to 2.3
Update database script (add extra foreign keys + minor cleanup)
2014-08-09 10:16:12 +02:00
jekkos-t520
55ad3a20c2 Fix requisitions report (can be found under receiving type = requisitions) 2014-08-07 13:15:21 +02:00
jekkos-t520
e53265cca8 Requisition is now registered as receiving for destination stock and return for source stock
Remove specific requisition report and code
Adapt receivings report to show requisitions in a generic way
2014-08-07 12:50:42 +02:00
jekkos-t520
cf20194e23 Fixed sale suspending / unsuspending (adapt db scripts)
Cleanup old code
More code review
Update item_quantities database model (composite pk)
2014-08-07 02:07:09 +02:00
jekkos-t520
8802831831 Add foregin key constraints to stock_locations and item_quantities tables
Requisition options is only shown when multiple stock locations are configured
Fix stock locations config in the configuration page
Rename item_quantitys to item_quantities
Fix a missing label (need to check if present in master)
Fix display of the stock quantities in items/manage view
2014-07-25 00:15:34 +02:00
Padungsak
a1e1883ddc Add quantity column in item page
Fix bug about validating stock location config

PS
2014-07-11 22:32:47 +07:00
jekkos-t520
9607300514 Added empty check in stock_locations config
Rework database script (contains stock_locations + item_quantities tables)
2014-07-05 13:47:33 +02:00
Padungsak
8e8b5d84dc Fix quantity removal in items page
PS
2014-07-02 20:50:32 +07:00
Padungsak
25fa78eedb Add multi-stock feature
Finished task
1. User can add stock location in config page. Adding format is StockA,StockB,StockC for example
2. Item page, there is no more quantity column show in cert table. The quantity tracking is integrated in inventory detail
3. Receiving page, There is a stock location for user to select before receiving or returning stuff
4. Sale page, There is a stock location which is for user to select a stock location they sell from

Remain task
1. Requisition work flow
2. Language editing
3. Remove unuse code

PS
2014-07-02 11:58:08 +07:00
jekkos-t520
4f367eb168 Merge branch 'master' into merge/padungsak
Conflicts:
	application/views/config.php
2014-06-30 11:30:08 +02:00
Padungsak
d020b53215 Fix: Qty. column is not show in requisition report
Padungsak
2014-06-17 23:47:16 +07:00
jekkos-t520
e1bfac5eae requisition receipt fixed
database.sql script merged with current ospos one
remaining problems in reporting (sale_type to add in sales_temp query?)
data model should be refactored to allow more genericity for custom item locations (2+)
inventory tracking should be adapted to use multiple locations (instead of duplicating items for different locations)
2014-06-15 15:30:32 +02:00
2709 changed files with 413520 additions and 74900 deletions

7
.bowerrc Normal file
View File

@@ -0,0 +1,7 @@
{
"directory": "public/bower_components",
"scripts": {
"postinstall": "grunt default genlicense",
"postuninstall": "grunt default genlicense"
}
}

20
.dockerignore Normal file
View File

@@ -0,0 +1,20 @@
node_modules
tmp
application/config/email.php
application/config/database.php
*.patch
patches/
.idea/
git-svn-diff.py
*.bash
.swp
.buildpath
.project
.settings/*
*.swp
*.rej
*.orig
*~
*.~
*.log
application/sessions/*

5
.gitattributes vendored Normal file
View File

@@ -0,0 +1,5 @@
dist/ merge=ours
application/language/**/*.php merge=ours
text=auto
application/config/config.php ident
application/views/partial/footer.php ident

37
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,37 @@
### IMPORTANT IMPORTANT IMPORTANT
Chose what you want to report: New Feature or Bug.
If you remove the template when submitting a Bug your issue will be closed as we cannot help without basic information.
### New Feature / Enhacement
For New Features or Enhacements please remove all the template text and clearly write your proposal.
It's important to state whether you expect the community to implement it or you will contribute the work.
Please bear in mind that we will implement new features only on the current code, there is no support for old versions.
### Issue / Question / Bug
Before submitting an issue please make sure you remove the first section of the template and you tick (add a x between the square brakets) and agree with all the following check boxes:
- [] Checked the current issues database and no similar issue was already discussed
- [] Read the README, WHATS_NEW and UPGRADE
- [] Read the FAQ (https://github.com/jekkos/opensourcepos#faq) for any known install and/or upgrade gotchas (in specific PHP has php5-gd, php-intl and sockets installed)
- [] Reporting an issue of an unmodified OSPOS installation
- [] PHP version is at least 5.5 and not 7.x
- [] MySQL version is 5.5 or 5.6 and not 5.7
- [] Ran any database upgrade scripts (e.g. database/2.4_to_3.0.sql)
- [] Know the version of OSPOS and git commit hash (check the footer of your OSPOS) and will add to my issue report
- [] Know the name and version of OS, Web server and MySQL and will add to my issue report
### Installation information
### Expected behaviour
### Actual behaviour
### Steps to reproduce the issue

18
.gitignore vendored
View File

@@ -1,10 +1,24 @@
node_modules
tmp
application/config/email.php
application/config/database.php
application/sessions/*
application/logs/*
application/uploads/*
public/license/.licenses
public/bower_components
*.patch
patches/
.idea/
git-svn-diff.py
*.bash
*.sh
*.swp
.swp
.buildpath
.project
.settings/*
*.swp
*.rej
*.orig
*~
*.~
*.log

60
.htaccess Executable file
View File

@@ -0,0 +1,60 @@
# disable directory browsing
# For security reasons, Option all cannot be overridden.
Options +ExecCGI +Includes +IncludesNOEXEC +SymLinksIfOwnerMatch -Indexes
# prevent folder listing
IndexIgnore *
# Apache 2.4
<IfModule authz_core_module>
# secure htaccess file
<Files .htaccess>
Require all denied
</Files>
# prevent access to PHP error log
<Files error_log>
Require all denied
</Files>
# prevent access to LICENSE
<Files LICENSE>
Require all denied
</Files>
# prevent access to csv, txt and md files
<FilesMatch "\.(csv|txt|md|yml|json|lock)$">
Require all denied
</FilesMatch>
</IfModule>
# Apache 2.2
<IfModule !authz_core_module>
# secure htaccess file
<Files .htaccess>
Order allow,deny
Deny from all
Satisfy all
</Files>
# prevent access to PHP error log
<Files error_log>
Order allow,deny
Deny from all
Satisfy all
</Files>
# prevent access to LICENSE
<Files LICENSE>
Order allow,deny
Deny from all
Satisfy all
</Files>
# prevent access to csv, txt and md files
<FilesMatch "\.(csv|txt|md|yml|json|lock)$">
Order allow,deny
Deny from all
Satisfy all
</FilesMatch>
</IfModule>

21
.travis.yml Normal file
View File

@@ -0,0 +1,21 @@
sudo: true # Required to install packages
branches:
except:
- weblate
services:
- docker
before_install:
- curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > docker-compose
- chmod +x docker-compose
- sudo mv docker-compose /usr/local/bin
script:
- docker-compose build
- docker-compose up -d
env:
- TAG=$(echo ${TRAVIS_BRANCH} | sed s/feature\\///)
after_success:
-
- '[ -n ${DOCKER_USERNAME} ] && docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" && docker tag opensourcepos_php "jekkos/opensourcepos:$TAG" && docker tag opensourcepos_sqlscript jekkos/opensourcepos:sqlscript && docker push "jekkos/opensourcepos:$TAG" && docker push jekkos/opensourcepos:sqlscript'

24
Dockerfile Normal file
View File

@@ -0,0 +1,24 @@
FROM php:5-apache
MAINTAINER jekkos
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
php5-apcu \
libicu-dev \
libgd-dev \
sendmail
RUN a2enmod rewrite
RUN docker-php-ext-install mysql mysqli bcmath intl gd sockets mbstring
RUN echo "date.timezone = \"\${PHP_TIMEZONE}\"" > /usr/local/etc/php/conf.d/timezone.ini
RUN echo -e “$(hostname -i)\t$(hostname) $(hostname).localhost” >> /etc/hosts
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 775 /app/public/uploads
RUN cp application/config/database.php.tmpl application/config/database.php && \
sed -i -e "s/\(localhost\)/web/g" test/ospos.js && \
sed -i -e "s/\(user.*\?=.\).*\(.\)$/\1getenv('MYSQL_USERNAME')\2/g" application/config/database.php && \
sed -i -e "s/\(password.*\?=.\).*\(.\)$/\1getenv('MYSQL_PASSWORD')\2/g" application/config/database.php && \
sed -i -e "s/\(database.*\?=.\).*\(.\)$/\1getenv('MYSQL_DB_NAME')\2/g" application/config/database.php && \
sed -i -e "s/\(hostname.*\?=.\).*\(.\)$/\1getenv('MYSQL_HOST_NAME')\2/g" application/config/database.php

9
Dockerfile.dev Normal file
View File

@@ -0,0 +1,9 @@
FROM jekkos/opensourcepos:master
MAINTAINER jekkos
RUN mkdir -p /app/bower_components && ln -s /app/bower_components /var/www/html/bower_components
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini

11
Dockerfile.test Normal file
View File

@@ -0,0 +1,11 @@
FROM digitallyseamless/nodejs-bower-grunt:5
MAINTAINER jekkos
# apt-get install curl
COPY Gruntfile.js .
COPY package.json .
COPY test .
RUN npm install
CMD ['while ! curl web/index.php | grep username; do sleep 1; done; grunt mochaWebdriver:test']

229
Gruntfile.js Normal file
View File

@@ -0,0 +1,229 @@
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
wiredep: {
task: {
ignorePath: '../../../public/',
src: ['application/views/partial/header.php']
}
},
bower_concat: {
all: {
mainFiles: {
'bootstrap-table': [ "src/bootstrap-table.js", "src/bootstrap-table.css", "dist/extensions/export/bootstrap-table-export.js", "dist/extensions/mobile/bootstrap-table-mobile.js"]
},
dest: {
'js': 'tmp/opensourcepos_bower.js',
'css': 'tmp/opensourcepos_bower.css'
}
}
},
bowercopy: {
options: {
report: false
},
targetdistbootswatch: {
options: {
srcPrefix: 'public/bower_components/bootswatch',
destPrefix: 'public/dist/bootswatch'
},
files: {
'cerulean/bootstrap.min.css': 'cerulean/bootstrap.min.css',
'cosmo/bootstrap.min.css': 'cosmo/bootstrap.min.css',
'cyborg/bootstrap.min.css': 'cyborg/bootstrap.min.css',
'darkly/bootstrap.min.css': 'darkly/bootstrap.min.css',
'flatly/bootstrap.min.css': 'flatly/bootstrap.min.css',
'journal/bootstrap.min.css': 'journal/bootstrap.min.css',
'paper/bootstrap.min.css': 'paper/bootstrap.min.css',
'readable/bootstrap.min.css': 'readable/bootstrap.min.css',
'sandstone/bootstrap.min.css': 'sandstone/bootstrap.min.css',
'slate/bootstrap.min.css': 'slate/bootstrap.min.css',
'spacelab/bootstrap.min.css': 'spacelab/bootstrap.min.css',
'superhero/bootstrap.min.css': 'superhero/bootstrap.min.css',
'united/bootstrap.min.css': 'united/bootstrap.min.css',
'yeti/bootstrap.min.css': 'yeti/bootstrap.min.css',
'fonts': 'fonts'
}
},
targetlicense: {
options: {
srcPrefix: './'
},
files: {
'public/license': 'LICENSE'
}
},
},
cssmin: {
target: {
files: {
'public/dist/<%= pkg.name %>.min.css': ['tmp/opensourcepos_bower.css', 'public/css/*.css', '!public/css/login.css', '!public/css/invoice_email.css', '!public/css/barcode_font.css', '!public/css/style.css']
}
}
},
concat: {
js: {
options: {
separator: ';'
},
files: {
'tmp/<%= pkg.name %>.js': ['tmp/opensourcepos_bower.js', 'public/js/jquery*', 'public/js/*.js']
}
},
sql: {
options: {
banner: '-- >> This file is autogenerated from tables.sql and constraints.sql. Do not modify directly << --'
},
files: {
'database/database.sql': ['database/tables.sql', 'database/constraints.sql'],
'database/migrate_phppos_dist.sql': ['database/tables.sql', 'database/phppos_migrate.sql', 'database/constraints.sql']
}
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'public/dist/<%= pkg.name %>.min.js': ['tmp/<%= pkg.name %>.js']
}
}
},
jshint: {
files: ['Gruntfile.js', 'public/js/*.js'],
options: {
// options here to override JSHint defaults
globals: {
jQuery: true,
console: true,
module: true,
document: true
}
}
},
tags: {
css_header: {
options: {
scriptTemplate: '<rel type="text/css" src="{{ path }}"></rel>',
openTag: '<!-- start css template tags -->',
closeTag: '<!-- end css template tags -->',
ignorePath: '../../../public/'
},
src: ['public/css/*.css', '!public/css/login.css', '!public/css/invoice_email.css', '!public/css/barcode_font.css'],
dest: 'application/views/partial/header.php',
},
mincss_header: {
options: {
scriptTemplate: '<rel type="text/css" src="{{ path }}"></rel>',
openTag: '<!-- start mincss template tags -->',
closeTag: '<!-- end mincss template tags -->',
ignorePath: '../../../public/'
},
src: ['public/dist/*.css', '!public/dist/login.css', '!public/dist/invoice_email.css', '!public/dist/barcode_font.css'],
dest: 'application/views/partial/header.php',
},
css_login: {
options: {
scriptTemplate: '<rel type="text/css" src="{{ path }}"></rel>',
openTag: '<!-- start css template tags -->',
closeTag: '<!-- end css template tags -->',
ignorePath: '../../public/'
},
src: ['public/dist/login.css'],
dest: 'application/views/login.php'
},
js: {
options: {
scriptTemplate: '<script type="text/javascript" src="{{ path }}"></script>',
openTag: '<!-- start js template tags -->',
closeTag: '<!-- end js template tags -->',
ignorePath: '../../../public/'
},
src: ['public/js/jquery*', 'public/js/*.js'],
dest: 'application/views/partial/header.php'
},
minjs: {
options: {
scriptTemplate: '<script type="text/javascript" src="{{ path }}"></script>',
openTag: '<!-- start minjs template tags -->',
closeTag: '<!-- end minjs template tags -->',
ignorePath: '../../../public/'
},
src: ['public/dist/*min.js'],
dest: 'application/views/partial/header.php'
}
},
mochaWebdriver: {
options: {
timeout: 1000 * 60 * 3
},
test : {
options: {
usePhantom: true,
usePromises: true
},
src: ['test/**/*.js']
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint']
},
cachebreaker: {
dev: {
options: {
match: [ {
'opensourcepos.min.js': 'public/dist/opensourcepos.min.js',
'opensourcepos.min.css': 'public/dist/opensourcepos.min.css'
} ],
replacement: 'md5'
},
files: {
src: ['application/views/partial/header.php', 'application/views/login.php']
}
}
},
clean: {
license: ['public/bower_components/**/bower.json']
},
license: {
all: {
// Target-specific file lists and/or options go here.
options: {
// Target-specific options go here.
directory: 'public/bower_components',
output: 'public/license/bower.LICENSES'
},
},
},
'bower-licensechecker': {
options: {
/*directory: 'path/to/bower',*/
acceptable: [ 'MIT', 'BSD', 'LICENSE.md' ],
printTotal: true,
warn: {
nonBower: true,
noLicense: true,
allGood: true,
noGood: true
},
log: {
outFile: 'public/license/.licenses',
nonBower: true,
noLicense: true,
allGood: true,
noGood: true,
}
}
}
});
require('load-grunt-tasks')(grunt);
grunt.loadNpmTasks('grunt-mocha-webdriver');
grunt.registerTask('default', ['wiredep', 'bower_concat', 'bowercopy', 'concat', 'uglify', 'cssmin', 'tags', 'cachebreaker']);
grunt.registerTask('genlicense', ['clean:license', 'license', 'bower-licensechecker']);
};

20
LICENSE
View File

@@ -1,6 +1,16 @@
The MIT License (MIT)
Copyright (c) 2014 pappastech
Copyright (c) 2012-2014 pappastech
Copyright (c) 2012 Alain
Copyright (c) 2013 Rob Garrison
Copyright (c) 2013 Parq
Copyright (c) 2013 Ramel
Copyright (c) 2014-2016 jekkos
Copyright (c) 2015-2016 FrancescoUK (aka daN4cat)
Copyright (c) 2015 Aamir Shahzad (aka asakpke), RoshanTech.com
Copyright (c) 2015 Toni Haryanto (aka yllumi)
Copyright (c) 2016 Ramkrishna Mondal (aka RamkrishnaMondal)
Copyright (c) 2016 Rinaldy@dbarber (aka rnld26)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
@@ -12,9 +22,15 @@ subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
You cannot claim copyright or ownership of the Software.
Footer signatures "You are using Open Source Point Of Sale" and/or "Open Source Point Of Sale"
with version, hash and URL link to the original distribution of the code MUST BE RETAINED,
MUST BE VISIBLE IN EVERY PAGE and CANNOT BE MODIFIED.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

170
README.md
View File

@@ -1,4 +1,168 @@
ospos
=====
[![Build Status](https://travis-ci.org/jekkos/opensourcepos.svg?branch=master)](https://travis-ci.org/jekkos/opensourcepos)
[![Join the chat at https://gitter.im/jekkos/opensourcepos](https://badges.gitter.im/jekkos/opensourcepos.svg)](https://gitter.im/jekkos/opensourcepos?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![devDependency Status](https://david-dm.org/jekkos/opensourcepos/dev-status.svg)](https://david-dm.org/jekkos/opensourcepos#info=devDependencie)
[![Dependency Status](https://gemnasium.com/badges/github.com/jekkos/opensourcepos.svg)](https://gemnasium.com/github.com/jekkos/opensourcepos)
[![GitHub version](https://badge.fury.io/gh/jekkos%2Fopensourcepos.svg)](https://badge.fury.io/gh/jekkos%2Fopensourcepos)
[![Translation status](http://weblate.jpeelaer.net/widgets/ospos/-/svg-badge.svg)](http://weblate.jpeelaer.net/engage/ospos/?utm_source=widget)
Open Source Point of Sale
Introduction
------------
Open Source Point of Sale is a web based point of sale system.
The main features are:
* Stock management
* Sale register with transactions logging
* Receipt and invoice printing and emailing
* Suppliers and Customers database
* Multiuser with permission control
* Reporting
* Gift card
* Receivings
* Barcode generation and printing
* Messaging
* Multilanguage
* Different UI themes
The software is written in PHP language, it uses MySQL or MariaDB as data storage back-end and has a simple but intuitive user interface.
The latest version 3.0.1 is a complete overhaul of the original software.
It is now based on Bootstrap 3.x using Bootswatch themes, and still uses CodeIgniter 3.x as framework.
It also has improved functionality and security.
Deployed to a Cloud it can be defined as a SaaS (Software as as Service) type of solution.
License
-------
Open Source Point of Sale is licensed under MIT terms with an important addition:
_The footer signature "You are using Open Source Point Of Sale" with version,
hash and link to the original distribution of the code MUST BE RETAINED,
MUST BE VISIBLE IN EVERY PAGE and CANNOT BE MODIFIED._
Also worth noting:
_The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software._
For more details please read the file __LICENSE__.
It's important to understand that althought you are free to use the software the copyright stays and the license agreement applies in all cases.
Therefore any actions like:
- Removing LICENSE and any license files is prohibited
- Authoring the footer notice replacing it with your own or even worse claiming the copyright is absolutely prohibited
- Claiming full ownership of the code is prohibited
In short you are free to use the software but you cannot claim any property on it.
Any person or company found breaching the license agreement will be chased up.
Keep the Machine Running
------------------------
If you like the project, and you are making money out of it on a daily basis, then consider buying me a coffee so I can keep adding features.
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MUN6AEG7NY6H8)
Server Requirements
-------------------
PHP version 5.5 or newer is recommended but PHP 7.x is not fully supported yet.
PHP needs to have `php-gd`, `php-bcmath`, `php-intl`, `php-sockets` and `php-mcrypt` installed and enabled.
MySQL 5.5 or 5.6 are fine but MySQL 5.7 is not supported yet.
Apache 2.2 and 2.4 are working both fine.
Local install
-------------
1. Create/locate a new mysql database to install open source point of sale into
2. Execute the file database/database.sql to create the tables needed
3. unzip and upload Open Source Point of Sale files to web server
4. Copy application/config/database.php.tmpl to application/config/database.php
5. Modify application/config/database.php to connect to your database
6. Modify application/config/config.php encryption key with your own
7. Go to your point of sale install public dir via the browser
8. LOGIN using
* username: admin
* password: pointofsale
9. Enjoy
10. Oops an issue? Please read the FAQ first thing :-)
P.S.: For more info about a local install based on Raspberry PI please read our wiki
Local install using Docker
--------------------------
From now on ospos can be deployed using Docker on Linux, Mac or Windows. This setup dramatically reduces the number of possible issues as all setup is now done in a Dockerfile. Docker runs natively on mac and linux, but will require more overhead on windows. Please refer to the docker documentation for instructions on how to set it up on your platform.
To build and run the image, issue following commands in a terminal with docker installed
docker-compose build
docker-compose up
Cloud install
-------------
A quick option would be to install directly to [Digitalocean](https://m.do.co/c/ac38c262507b) using their preconfigured LAMP stack.
Create a DO account first, add a droplet with preconfigured LAMP and follow the instructions for Local Install below. You will be running a provisioned VPS within minutes.
Cloud install using Docker
--------------------------
If you want to run a quick demo of ospos or run it permanently in the cloud, then we
suggest using Docker cloud together with the DigitalOcean hosting platform. This way all the
configuration is done automatically and the install will just work.
If you choose *DigitalOcean* [through this link](https://m.do.co/c/ac38c262507b), you will get a *$10 credit* for a first
month of uptime on the platform. A full setup will only take about 2 minutes by following steps below.
1. Create a [Digitalocean account](https://m.do.co/c/ac38c262507b)
2. Create a [docker cloud account](https://cloud.docker.com)
3. Login to docker cloud
4. Associate your docker cloud account with your previously created digital ocean account under settings
5. Create a new node on DigitalOcean through the `Infrastructure > Nodes` tab. Fill in a name (ospos) and choose a region near to you. We recommend to choose a node with minimum 1G RAM for the whole stack
6. Click [![Deploy to Docker Cloud](https://files.cloud.docker.com/images/deploy-to-dockercloud.svg)](https://cloud.docker.com/stack/deploy/?repo=https://github.com/jekkos/opensourcepos)
7. Othewise create a new stack under `Applications > Stacks` and paste the [contents of docker-cloud.yml](https://github.com/jekkos/opensourcepos/blob/master/docker-cloud.yml) from the source repository in the text field and hit `Create and deploy`
8. Find your website url under `Infrastructure > Nodes > <yournode> > Endpoints > web`
9. Login with default username/password admin/pointofsale
10. DNS name for this server can be easily configured in the DigitalOcean control panel
More info [on maintaining a docker](https://github.com/jekkos/opensourcepos/wiki/Docker-cloud-maintenance) install can be found on the wiki
Reporting Bugs
--------------
If you are taking a release candidate code please make sure you always run the latest database upgrade script and you took the latest code from master.
Please DO NOT post issues if you have not done those step.
Bug reports must follow this schema:
1. Ospos **version string with git commit hash** (see ospos footer)
2. OS name and version running your Web Server (e.g. Linux Ubuntu 15.0)
3. Web Server name and version (e.g. Apache 2.4)
4. Database name and version (e.g. =< MySQL 5.6)
5. PHP version (e.g. PHP 5.5)
6. Language selected in OSPOS (e.g. English, Spanish)
7. Any configuration of OSPOS that you changed
8. Exact steps to reproduce the issue (test case)
9. Optionally some screenshots to illustrate each step
If above information is not provided in full, your issue will be tagged as pending.
If missing information is not provided within a week we will close your issue.
FAQ
---
* If a blank page (HTTP status 500) shows after search completion or receipt generation, then double check `php5-gd` presence in your php installation. On windows check in php.ini whether the lib is installed. On Ubuntu issue `sudo apt-get install php5-gd`. Also have a look at the Dockerfile for a complete list of recommended packages.
* If sales and receiving views don't show properly, please make sure BCMath lib (`php-bcmath`) is installed. On windows check php.ini and make sure php_bcmath extension is not commented out
* If the following error is seen in sales module `Message: Class 'NumberFormatter' not found` then you don't have `php5-intl` extension installed. Please check the [wiki](https://github.com/jekkos/opensourcepos/wiki/Localisation-support#php5-intl-extension-installation) to resolve this issue on your platform. If you use WAMP, please read [issue #949](https://github.com/jekkos/opensourcepos/issues/949)
* If you are getting the error `Message: Can't use method return value in write context` that means that you are probably using PHP7 which is not completely supported yet. Check your hosting configuration to verify whether you have a supported PHP version installed
* If you read errors containing messages with Socket word in it, please make sure you have installed PHP Sockets support (e.g. go to PHP.ini and make sure all the needed modules are not commented out. This means `php5-gd`, `php-intl` and `php-sockets`. Restart the web server)
* If you get various errors at item creation, opening views or reports, or having issues at login please make sure you are not using MySQL 5.7 as it's not supported yet
* If you installed your OSPOS under a web server subdir, please edit public/.htaccess and go to the lines with comment `if in web root` and `if in subdir comment above line, uncomment below one and replace <OSPOS path> with your path` and follow the instruction on the second comment line. If you face more issues please read [issue #920](https://github.com/jekkos/opensourcepos/issues/920) for more help
* If the avatar pictures are not shown in Items or at Item save time you get an error, please make sure your public and subdirs are assigned to the correct owner and the access permission is set to 755
* If you have problems with the encryption support or you get an error please make sure `php5-mcrypt` is installed

View File

@@ -1,13 +0,0 @@
How to Install
-------------------------
1. Create/locate a new mysql database to install open source point of sale into
2. Execute the file database/database.sql to create the tables needed
3. unzip and upload Open Source Point of Sale files to web server
4. Copy application/config/database.php.tmpl to application/config/database.php
5. Modify application/config/database.php to connect to your database
6. Modify application/config/config.php encryption key with your own
7. Go to your point of sale install via the browser
8. LOGIN using
username: admin
password:pointofsale
9. Enjoy

View File

@@ -1,4 +1,15 @@
How to Upgrade
-------------------------
1. Replace all code from your point of sale installation with the code downloaded
2. Run the necessary database upgrades from the database folder
1. Backup all your current database and OSPOS code
2. Make sure you have a copy of application/config/config.php and application/config/database.php
3. Remove all directories
4. Install the new OSPOS
5. Run the database upgrade scripts from database/ dir (check which ones you need according to the version you are upgrading from)
6. Take the saved old config.php and upgrade the new config.php with any additional changes you made in the old.
Take time to understand if new config rules require some changes (e.g. encryption keys)
7. Copy application/config/database.php.tmpl to application/config/database.php
8. Take the saved old database.php and change the new database.php to contain all the configuration you had in the old setup.
Please try not to use the old layout, use the new one and just copy the content of the config variables
9. Restore the content of the old uploads/ folder into public/uploads/ one
10. Once new code is in place, database is updated and config files are sorted you are good to start the new OSPOS
11. If any issue please check FAQ and/or GitHub issues as somebody else might have had your problem already or post a question

View File

@@ -1,12 +1,154 @@
* Ver. 2.1.0
Version 3.0.1
-----------
+ *CodeIgniter 3.1.2 Upgrade*
+ *Substantial database performance improvements*
+ *Improved security: email and sms passwords encryption, removed phpinfo.php*
+ *Set code to be production and not development in index.php*
+ *Reports improvements, fixed table sorting, tax calculation and made profit to be net profit*
+ Better Apache 2.4 support in .htaccess
+ Updates to language translations
+ Fixed excel template download links
+ Fixed employee name in Sale receipt and invoice reprinting
+ Fixed 2.3.2_to_2.3.3.sql database upgrade script mistake
+ Fixed phppos to ospos database migration script
+ Minor bugfixes and some general code clean up
Version 3.0.0
-----------
+ *CodeIgniter 3.1 Upgrade*
+ Major UI overhaul based on *Boostrap 3.0 and Bootswatch Themes*
+ New tabular views with advanced filtering using *Bootstrap Tables*
+ New graphical reports with no more Adobe flash dependency
+ Redesign of all modal dialogs
+ Updated Sales register with simplified payment flow
+ *Improved security: MySQL injection, XSS, CSFR, BCrypt password encryption, safer project layout*
+ Support for TXT messaging (interfacing to specific support required)
+ Email configuration
+ Improved Localisation support
+ Improved Store Config page
+ Docker container ready for Cloud installation
+ Composer PHP support
+ More languages and integration with Weblate for continuous translation
+ About 280 closed issues under 3.0.0 release label, too many to produce a meaningful list
+ Various code cleanup, refactoring, optimisation and etc.
Version 2.4
-----------
+ *CodeIgniter 3.0.5* Upgrade (please read UPGRADE.txt)
+ Fix for spurious logouts
+ Apache .htaccess mod_expiry caching and security optimizations
+ Bulk item edit fixes (category, tax and supplier fields)
+ Remove f-key shortcuts used for module navigation
+ Allow to use custom invoice numbers when suspending sale
+ PHP7 fixes
+ Specific warnings to distinguish between reorder level and out of stock situation in sales
+ Fix malware detection issues due to usage of base64 encoding for storing session variables
+ Improve language generation scripts (use PHP builtin functionality)
+ Add extra buttons for navigation and printing to receipt and invoice
+ Improve print layout for invoices
+ Make layout consistent for items between receipt and invoice templates
+ Minor bugfixes
Version 2.3.4
-------------
+ Migration script fixes
+ Improved continuous integration setup
+ More integration tests
+ Virtualized container setup (docker install)
+ Live clock functionality + favicon
+ Improved PHP 7 compatbility
+ Added de_CH (German) as language
+ Minor code cleanup
+ Removal of annoying backup prompt on logout
Version 2.3.3
-------------
+ Item kit fixes (search, list, ..)
+ Add datepicker widgets in sale/receiving edit forms
+ Add date filter in items module
+ Add barcode generation logic for EAN8, EAN13
+ Add barcode validation + fallback logic for EAN8, EAN13
+ New config option to generate barcodes if item_number empty
+ Add cost + count to inventory reports
+ Giftcard fixes
+ Refactor sales overview (added date filtering + search options)
+ Better locale config support
+ Improve php compatibility
+ Fix invoice numbering bug on suspend
+ Add configurable locale-dependent dateformat
+ Add grunt-cache-breaker plugin
+ Suspend button appeaers before adding a payment
+ Searching of deleted items, filtering part is removed
+ Remove infamous "0" after leaving sale or receiving comments empty
+ Add SQL script to clean zeroes in sales/receivings comments
+ Numerous other bug fixes
Version 2.3.2
-------------
+ Nominatim (OpenStreetMap) customer address autocompletion
+ Sale invoice templating
+ Configurable barcode generation for items
+ Stock location filtering in detailed sales and receivings reports
+ Giftcards bugfixes
+ Proper pagination support for most modules
+ Language updates
+ Bugfix for decimal taxrates
+ Add gender + company name attributes to customer
+ Stock location config screen refactor
+ Basic travis-ci + phantomJs setup
+ Database backup on admin logout
+ Modifiable item thumbnails
+ Email invoice PDF generation using DomPDF
+ Modifiable company logo
+ jQuery upgrade (1.2 -> 1.8.3)
+ Javascript minification (using grunt)
+ Numerous bugfixes
Version 2.3.1
-------------
+ Extra report permissions (this includes a refactoring of the database model - new grants table)
+ Tax inclusive/exclusive pricing
+ Receivings amount multiplication (can be configured in items section)
+ Customizable sale and receiving numbering
+ Giftcard improvements
+ Fix item import through csv
+ Bug fixes for reports
Version 2.3
-----------
+ Support for multiple stock locations
Version 2.2.2
-------------
+ French language added
+ Thai language added
+ Upgrade to CodeIgniter 2.2 (contains several security fixes)
+ Database types for amounts all changed to decimal types (this will fix rounding errors in the sales and receivings reports) the rest of the application
+ Fix duplicated session cookies in http headers (this broke the application when running on nginx)
Version 2.1.1
-------------
+ Barcodes on the order receipt weren't generated correctly
+ Sales edit screen for detailed sales reports is now available with thickbox as in the rest of the application
+ Indonesian language files updated (Oktafianus)
+ Default language set to 'en' in config.php
+ Fix some css bugs in suspended sales section
+ Default cookie sess_time_expire set to 86400 (24h)
Version 2.1.0
-------------
+ Various upgrades, too numerous to list here.
+ Removed dependancy on ofc upload library due to vulnerability found.
-------------------------------------------------------------------------------
* Ver. 2.0.2
Version 2.0.2
-------------
+ Fixed multiple giftcards issue per Bug #4 reported on Sourceforge where a
second giftcard added would have its balance set to $0 even if the sale did
not require the total of the second giftcard to pay the remaining amount due.
+ Small code cleanup
-------------------------------------------------------------------------------
Version 2.1.0
-------------
* Upgrade to CodeIgniter 2.1.0
* Various small improvements
* Various small improvements

View File

@@ -1 +1,6 @@
Deny from all
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

View File

@@ -1 +1,6 @@
deny from all
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| AUTO-LOADER
@@ -20,40 +22,64 @@
|
| 1. Packages
| 2. Libraries
| 3. Helper files
| 4. Custom config files
| 5. Language files
| 6. Models
| 3. Drivers
| 4. Helper files
| 5. Custom config files
| 6. Language files
| 7. Models
|
*/
/*
| -------------------------------------------------------------------
| Auto-load Packges
| Auto-load Packages
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
*/
$autoload['packages'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your application/libraries folder.
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
| $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array('database', 'form_validation', 'session', 'user_agent', 'pagination', 'encryption');
$autoload['libraries'] = array('database','form_validation','session','user_agent', 'pagination');
/*
| -------------------------------------------------------------------
| Auto-load Drivers
| -------------------------------------------------------------------
| These classes are located in system/libraries/ or in your
| application/libraries/ directory, but are also placed inside their
| own subdirectory and they extend the CI_Driver_Library class. They
| offer multiple interchangeable driver options.
|
| Prototype:
|
| $autoload['drivers'] = array('cache');
|
| You can also supply an alternative property name to be assigned in
| the controller:
|
| $autoload['drivers'] = array('cache' => 'cch');
|
*/
$autoload['drivers'] = array();
/*
| -------------------------------------------------------------------
@@ -63,8 +89,7 @@ $autoload['libraries'] = array('database','form_validation','session','user_agen
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('form','url','table','text','currency', 'html', 'download', 'directory');
$autoload['helper'] = array('form', 'url', 'table', 'text', 'locale', 'html', 'download', 'directory');
/*
| -------------------------------------------------------------------
@@ -78,10 +103,8 @@ $autoload['helper'] = array('form','url','table','text','currency', 'html', 'dow
| config files. Otherwise, leave it blank.
|
*/
$autoload['config'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Language files
@@ -94,22 +117,19 @@ $autoload['config'] = array();
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('model1', 'model2');
| $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array('Appconfig','Person','Customer','Employee','Module','Item', 'Item_taxes', 'Sale', 'Sale_suspended', 'Supplier','Inventory','Receiving','Giftcard', 'Item_kit', 'Item_kit_items');
/* End of file autoload.php */
/* Location: ./application/config/autoload.php */
$autoload['model'] = array('Appconfig', 'Person', 'Customer', 'Employee', 'Module', 'Item', 'Item_taxes', 'Sale', 'Sale_suspended', 'Supplier', 'Inventory', 'Receiving', 'Giftcard', 'Item_kit', 'Item_kit_items', 'Stock_location', 'Item_quantity');

View File

@@ -1,18 +1,50 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Code Version
|--------------------------------------------------------------------------
|
| This is the version of Open Source Point of Sale you're running
|
|
*/
$config['application_version'] = '3.0.1';
/*
|--------------------------------------------------------------------------
| Commit sha1
|--------------------------------------------------------------------------
|
| This is the commit hash for the version you are currently using
|
|
*/
$config['commit_sha1'] = '$Id$';
/*
|--------------------------------------------------------------------------
| Internal to OSPOS XSS Clean
|--------------------------------------------------------------------------
|
| This is to indicated whether we want XSS clean to be performed or not
| By default it's enabled as it's assumed the installation has Internet access and needs to be protected,
| however intranet only installations may not need this so they can set FALSE to improve performance
|
*/
$config['ospos_xss_clean'] = TRUE;
/*
|--------------------------------------------------------------------------
| Code Version
| Enable database query logging hook
|--------------------------------------------------------------------------
|
| This is the version of Open Source Point of Sale you're running
|
| Logs are stored in application/logs
|
*/
$config['application_version'] = '2.2.1';
$config['db_log_enabled'] = FALSE;
/*
|--------------------------------------------------------------------------
/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
@@ -21,13 +53,21 @@ $config['application_version'] = '2.2.1';
|
| http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try guess the protocol and path
| your installation, but due to security concerns the hostname will be set
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
$config['base_url'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
$config['base_url'] .= '://' . $_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
/*
|--------------------------------------------------------------------------
@@ -39,7 +79,7 @@ $config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';
$config['index_page'] = '';
/*
|--------------------------------------------------------------------------
@@ -47,17 +87,16 @@ $config['index_page'] = 'index.php';
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string. The default setting of 'AUTO' works for most servers.
| URI string. The default setting of 'REQUEST_URI' works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO' Default - auto detects
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
| 'REQUEST_URI' Uses $_SERVER['REQUEST_URI']
| 'QUERY_STRING' Uses $_SERVER['QUERY_STRING']
| 'PATH_INFO' Uses $_SERVER['PATH_INFO']
|
| WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
*/
$config['uri_protocol'] = 'AUTO';
$config['uri_protocol'] = 'REQUEST_URI';
/*
|--------------------------------------------------------------------------
@@ -67,9 +106,8 @@ $config['uri_protocol'] = 'AUTO';
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/urls.html
| https://codeigniter.com/user_guide/general/urls.html
*/
$config['url_suffix'] = '';
/*
@@ -82,7 +120,7 @@ $config['url_suffix'] = '';
| than english.
|
*/
$config['language'] = 'en';
$config['language'] = 'english';
/*
|--------------------------------------------------------------------------
@@ -92,6 +130,8 @@ $config['language'] = 'en';
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
| See http://php.net/htmlspecialchars for a list of supported charsets.
|
*/
$config['charset'] = 'UTF-8';
@@ -106,7 +146,6 @@ $config['charset'] = 'UTF-8';
*/
$config['enable_hooks'] = TRUE;
/*
|--------------------------------------------------------------------------
| Class Extension Prefix
@@ -115,33 +154,56 @@ $config['enable_hooks'] = TRUE;
| This item allows you to set the filename/classname prefix when extending
| native libraries. For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
| https://codeigniter.com/user_guide/general/core_classes.html
| https://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';
/*
|--------------------------------------------------------------------------
| Composer auto-loading
|--------------------------------------------------------------------------
|
| Enabling this setting will tell CodeIgniter to look for a Composer
| package auto-loader script in application/vendor/autoload.php.
|
| $config['composer_autoload'] = TRUE;
|
| Or if you have your vendor/ directory located somewhere else, you
| can opt to set a specific path as well:
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| For more information about Composer, please visit http://getcomposer.org/
|
| Note: This will NOT disable or override the CodeIgniter-specific
| autoloading (application/config/autoload.php)
*/
$config['composer_autoload'] = realpath(APPPATH . '../vendor/autoload.php');
/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs. When someone tries to submit a URL with disallowed
| characters they will get a warning message.
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| The configured value is actually a regular expression character group
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
/*
|--------------------------------------------------------------------------
| Enable Query Strings
@@ -167,19 +229,17 @@ $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
| use segment based URLs.
|
*/
$config['allow_get_array'] = TRUE;
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd'; // experimental not currently in use
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';
/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
@@ -189,6 +249,10 @@ $config['directory_trigger'] = 'd'; // experimental not currently in use
| 3 = Informational Messages
| 4 = All Messages
|
| You can also pass an array with threshold levels to show individual error types
|
| array(2) = Debug Messages, without Error Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
@@ -201,11 +265,37 @@ $config['log_threshold'] = 0;
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/logs/ folder. Use a full server path with trailing slash.
| application/logs/ directory. Use a full server path with trailing slash.
|
*/
$config['log_path'] = '';
/*
|--------------------------------------------------------------------------
| Log File Extension
|--------------------------------------------------------------------------
|
| The default filename extension for log files. The default 'php' allows for
| protecting the log files via basic scripting, when they are to be stored
| under a publicly accessible directory.
|
| Note: Leaving it blank will default to 'php'.
|
*/
$config['log_file_extension'] = '';
/*
|--------------------------------------------------------------------------
| Log File Permissions
|--------------------------------------------------------------------------
|
| The file system permissions to be applied on newly created log files.
|
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
| integer notation (i.e. 0700, 0644, etc.)
*/
$config['log_file_permissions'] = 0644;
/*
|--------------------------------------------------------------------------
| Date Format for Logs
@@ -217,71 +307,152 @@ $config['log_path'] = '';
*/
$config['log_date_format'] = 'Y-m-d H:i:s';
/*
|--------------------------------------------------------------------------
| Error Views Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/views/errors/ directory. Use a full server path with trailing slash.
|
*/
$config['error_views_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/cache/ folder. Use a full server path with trailing slash.
| application/cache/ directory. Use a full server path with trailing slash.
|
*/
$config['cache_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Include Query String
|--------------------------------------------------------------------------
|
| Whether to take the URL query string into consideration when generating
| output cache files. Valid options are:
|
| FALSE = Disabled
| TRUE = Enabled, take all query parameters into account.
| Please be aware that this may result in numerous cache
| files generated for the same page over and over again.
| array('q') = Enabled, but only take into account the specified list
| of query parameters.
|
*/
$config['cache_query_string'] = FALSE;
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Session class you
| MUST set an encryption key. See the user guide for info.
| If you use the Encryption class, you must set an encryption key.
| See the user guide for more info.
|
| https://codeigniter.com/user_guide/libraries/encryption.html
|
*/
$config['encryption_key'] = 'PUT_YOUR_ENCRYPTION_KEY_HERE';
$config['encryption_key'] = '';
/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_cookie_name' = the name you want for the cookie
| 'sess_expiration' = the number of SECONDS you want the session to last.
| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.
| 'sess_expire_on_close' = Whether to cause the session to expire automatically
| when the browser window is closed
| 'sess_encrypt_cookie' = Whether to encrypt the cookie
| 'sess_use_database' = Whether to save the session data to a database
| 'sess_table_name' = The name of the session database table
| 'sess_match_ip' = Whether to match the user's IP address when reading the session data
| 'sess_match_useragent' = Whether to match the User Agent when reading the session data
| 'sess_time_to_update' = how many seconds between CI refreshing Session Information
| 'sess_driver'
|
| The storage driver to use: files, database, redis, memcached
|
| 'sess_cookie_name'
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
| 'sess_expiration'
|
| The number of SECONDS you want the session to last.
| Setting to 0 (zero) means expire when the browser is closed.
|
| 'sess_save_path'
|
| The location to save sessions to, driver dependent.
|
| For the 'files' driver, it's a path to a writable directory.
| WARNING: Only absolute paths are supported!
|
| For the 'database' driver, it's a table name.
| Please read up the manual for the format with other session drivers.
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
| 'sess_match_ip'
|
| Whether to match the user's IP address when reading the session data.
|
| WARNING: If you're using the database driver, don't forget to update
| your session table's PRIMARY KEY when changing this setting.
|
| 'sess_time_to_update'
|
| How many seconds between CI regenerating the session ID.
|
| 'sess_regenerate_destroy'
|
| Whether to destroy session data associated with the old session ID
| when auto-regenerating the session ID. When set to FALSE, the data
| will be later deleted by the garbage collector.
|
| Other session cookie settings are shared with the rest of the application,
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
*/
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ospos_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = FAlSE;
$config['sess_time_to_update'] = 86400;
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ospos_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path' = Typically will be a forward slash
| 'cookie_secure' = Cookies will only be set if a secure HTTPS connection exists.
| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path' = Typically will be a forward slash
| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists.
| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)
|
| Note: These settings (with the exception of 'cookie_prefix' and
| 'cookie_httponly') will also affect sessions.
|
*/
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = FALSE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
/*
|--------------------------------------------------------------------------
| Standardize newlines
|--------------------------------------------------------------------------
|
| Determines whether to standardize newline characters in input data,
| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value.
|
| This is particularly useful for portability between UNIX-based OSes,
| (usually \n) and Windows (\r\n).
|
*/
$config['standardize_newlines'] = FALSE;
/*
|--------------------------------------------------------------------------
@@ -291,6 +462,9 @@ $config['cookie_secure'] = FALSE;
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
| WARNING: This feature is DEPRECATED and currently available only
| for backwards compatibility purposes!
|
*/
$config['global_xss_filtering'] = FALSE;
@@ -305,11 +479,15 @@ $config['global_xss_filtering'] = FALSE;
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_ospos_v3';
$config['csrf_cookie_name'] = 'csrf_cookie_ospos_v3';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
/*
|--------------------------------------------------------------------------
@@ -321,6 +499,9 @@ $config['csrf_expire'] = 7200;
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| Only used if zlib.output_compression is turned off in your php.ini.
| Please do not use it together with httpd-level output compression.
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts. For
@@ -335,15 +516,14 @@ $config['compress_output'] = FALSE;
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are 'local' or 'gmt'. This pref tells the system whether to use
| your server's local time as the master 'now' reference, or convert it to
| GMT. See the 'date helper' page of the user guide for information
| regarding date handling.
| Options are 'local' or any PHP supported timezone. This preference tells
| the system whether to use your server's local time as the master 'now'
| reference, or convert it to the configured one timezone. See the 'date
| helper' page of the user guide for information regarding date handling.
|
*/
$config['time_reference'] = 'local';
/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
@@ -353,23 +533,25 @@ $config['time_reference'] = 'local';
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files. Options are TRUE or FALSE (boolean)
|
| Note: You need to have eval() enabled for this to work.
|
*/
$config['rewrite_short_tags'] = FALSE;
/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
| header in order to properly identify the visitor's IP address.
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
| If your server is behind a reverse proxy, you must whitelist the proxy
| IP addresses from which CodeIgniter should trust headers such as
| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
| the visitor's IP address.
|
| You can use both an array or a comma-separated list of proxy addresses,
| as well as specifying whole subnets. Here are a few examples:
|
| Comma-separated: '10.0.1.200,192.168.5.0/24'
| Array: array('10.0.1.200', '192.168.5.0/24')
*/
$config['proxy_ips'] = '';
/* End of file config.php */
/* Location: ./application/config/config.php */
$config['proxy_ips'] = '';

View File

@@ -1,4 +1,17 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Display Debug backtrace
|--------------------------------------------------------------------------
|
| If set to TRUE, a backtrace will be displayed along with php errors. If
| error_reporting is disabled, the backtrace will not display, regardless
| of this setting
|
*/
defined('SHOW_DEBUG_BACKTRACE') OR define('SHOW_DEBUG_BACKTRACE', TRUE);
/*
|--------------------------------------------------------------------------
@@ -13,10 +26,10 @@
| always be used to set the mode correctly.
|
*/
define('FILE_READ_MODE', 0644);
define('FILE_WRITE_MODE', 0666);
define('DIR_READ_MODE', 0755);
define('DIR_WRITE_MODE', 0777);
defined('FILE_READ_MODE') OR define('FILE_READ_MODE', 0644);
defined('FILE_WRITE_MODE') OR define('FILE_WRITE_MODE', 0666);
defined('DIR_READ_MODE') OR define('DIR_READ_MODE', 0755);
defined('DIR_WRITE_MODE') OR define('DIR_WRITE_MODE', 0755);
/*
|--------------------------------------------------------------------------
@@ -26,16 +39,47 @@ define('DIR_WRITE_MODE', 0777);
| These modes are used when working with fopen()/popen()
|
*/
defined('FOPEN_READ') OR define('FOPEN_READ', 'rb');
defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b');
defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab');
defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b');
defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb');
defined('FOPEN_READ_WRITE_CREATE_STRICT') OR define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
define('FOPEN_READ', 'rb');
define('FOPEN_READ_WRITE', 'r+b');
define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
define('FOPEN_WRITE_CREATE', 'ab');
define('FOPEN_READ_WRITE_CREATE', 'a+b');
define('FOPEN_WRITE_CREATE_STRICT', 'xb');
define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
/* End of file constants.php */
/* Location: ./application/config/constants.php */
/*
|--------------------------------------------------------------------------
| Exit Status Codes
|--------------------------------------------------------------------------
|
| Used to indicate the conditions under which the script is exit()ing.
| While there is no universal standard for error codes, there are some
| broad conventions. Three such conventions are mentioned below, for
| those who wish to make use of them. The CodeIgniter defaults were
| chosen for the least overlap with these conventions, while still
| leaving room for others to be defined in future versions and user
| applications.
|
| The three main conventions used for determining exit status codes
| are as follows:
|
| Standard C/C++ Library (stdlibc):
| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
| (This link also contains other GNU-specific conventions)
| BSD sysexits.h:
| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
| Bash scripting:
| http://tldp.org/LDP/abs/html/exitcodes.html
|
*/
defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors
defined('EXIT_ERROR') OR define('EXIT_ERROR', 1); // generic error
defined('EXIT_CONFIG') OR define('EXIT_CONFIG', 3); // configuration error
defined('EXIT_UNKNOWN_FILE') OR define('EXIT_UNKNOWN_FILE', 4); // file not found
defined('EXIT_UNKNOWN_CLASS') OR define('EXIT_UNKNOWN_CLASS', 5); // unknown class
defined('EXIT_UNKNOWN_METHOD') OR define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
defined('EXIT_USER_INPUT') OR define('EXIT_USER_INPUT', 7); // invalid user input
defined('EXIT_DATABASE') OR define('EXIT_DATABASE', 8); // database error
defined('EXIT__AUTO_MIN') OR define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
defined('EXIT__AUTO_MAX') OR define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
@@ -12,14 +14,17 @@
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
| ['dsn'] The full DSN string describe a connection to the database.
| ['hostname'] The hostname of your database server.
| ['username'] The username used to connect to the database
| ['password'] The password used to connect to the database
| ['database'] The name of the database you want to connect to
| ['dbdriver'] The database type. ie: mysql. Currently supported:
mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
| ['dbdriver'] The database driver. e.g.: mysqli.
| Currently supported:
| cubrid, ibase, mssql, mysql, mysqli, oci8,
| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
| ['dbprefix'] You can add an optional prefix, which will be added
| to the table name when using the Active Record class
| to the table name when using the Query Builder class
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
@@ -34,36 +39,58 @@
| multi-byte character set and are running versions lower than these.
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
| ['autoinit'] Whether or not to automatically initialize the database.
| ['encrypt'] Whether or not to use an encrypted connection.
|
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
| 'ssl_key' - Path to the private key file
| 'ssl_cert' - Path to the public key certificate file
| 'ssl_ca' - Path to the certificate authority file
| 'ssl_capath' - Path to a directory containing trusted CA certificats in PEM format
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)
|
| ['compress'] Whether or not to use client compression (MySQL only)
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
| - good for ensuring strict SQL while developing
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
| NOTE: Disabling this will also effectively disable both
| $this->db->last_query() and profiling of DB queries.
| When you run a query, with this setting set to TRUE (default),
| CodeIgniter will store the SQL statement for debugging purposes.
| However, this may cause high memory usage, especially if you run
| a lot of SQL queries ... disable this to avoid that problem.
|
| The $active_group variable lets you choose which connection group to
| make active. By default there is only one group (the 'default' group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
| The $query_builder variables lets you determine whether or not to load
| the query builder class.
*/
$active_group = 'default';
$active_record = TRUE;
$query_builder = TRUE;
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = 'ospos_';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
/* End of file database.php */
/* Location: ./application/config/database.php */
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',
'dbdriver' => 'mysqli',
'dbprefix' => 'ospos_',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);

View File

@@ -1,15 +1,24 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$_doctypes = array(
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'html5' => '<!DOCTYPE html>',
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'
);
/* End of file doctypes.php */
/* Location: ./application/config/doctypes.php */
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'html5' => '<!DOCTYPE html>',
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">',
'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">',
'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',
'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">'
);

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| Foreign Characters
@@ -14,51 +16,88 @@ $foreign_characters = array(
'/Ä/' => 'Ae',
'/Ü/' => 'Ue',
'/Ö/' => 'Oe',
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a',
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
'/Б/' => 'B',
'/б/' => 'b',
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
'/ç|ć|ĉ|ċ|č/' => 'c',
'/Ð|Ď|Đ/' => 'D',
'/ð|ď|đ/' => 'd',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e',
'/Ĝ|Ğ|Ġ|Ģ/' => 'G',
'/ĝ|ğ|ġ|ģ/' => 'g',
'/Д/' => 'D',
'/д/' => 'd',
'/Ð|Ď|Đ|Δ/' => 'Dj',
'/ð|ď|đ|δ/' => 'dj',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е/' => 'e',
'/Ф/' => 'F',
'/ф/' => 'f',
'/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G',
'/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g',
'/Ĥ|Ħ/' => 'H',
'/ĥ|ħ/' => 'h',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i',
'/Ĵ/' => 'J',
'/ĵ/' => 'j',
'/Ķ/' => 'K',
'/ķ/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł/' => 'l',
'/Ñ|Ń|Ņ|Ň/' => 'N',
'/ñ|ń|ņ|ň|ʼn/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o',
'/Ŕ|Ŗ|Ř/' => 'R',
'/ŕ|ŗ|ř/' => 'r',
'/Ś|Ŝ|Ş|Š/' => 'S',
'/ś|ŝ|ş|š|ſ/' => 's',
'/Ţ|Ť|Ŧ/' => 'T',
'/ţ|ť|ŧ/' => 't',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u',
'/Ý|Ÿ|Ŷ/' => 'Y',
'/ý|ÿ|ŷ/' => 'y',
'/Ķ|Κ|К/' => 'K',
'/ķ|κ|к/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
'/М/' => 'M',
'/м/' => 'm',
'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
'/ñ|ń|ņ|ň|ʼn|ν/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
'/П/' => 'P',
'/п/' => 'p',
'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
'/ŕ|ŗ|ř|ρ|р/' => 'r',
'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
'/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',
'/ț|ţ|ť|ŧ|т/' => 't',
'/Þ|þ/' => 'th',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
'/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y',
'/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y',
'/В/' => 'V',
'/в/' => 'v',
'/Ŵ/' => 'W',
'/ŵ/' => 'w',
'/Ź|Ż|Ž/' => 'Z',
'/ź|ż|ž/' => 'z',
'/Ź|Ż|Ž|Ζ|З/' => 'Z',
'/ź|ż|ž|ζ|з/' => 'z',
'/Æ|Ǽ/' => 'AE',
'/ß/'=> 'ss',
'/ß/' => 'ss',
'/IJ/' => 'IJ',
'/ij/' => 'ij',
'/Œ/' => 'OE',
'/ƒ/' => 'f'
'/ƒ/' => 'f',
'/ξ/' => 'ks',
'/π/' => 'p',
'/β/' => 'v',
'/μ/' => 'm',
'/ψ/' => 'ps',
'/Ё/' => 'Yo',
'/ё/' => 'yo',
'/Є/' => 'Ye',
'/є/' => 'ye',
'/Ї/' => 'Yi',
'/Ж/' => 'Zh',
'/ж/' => 'zh',
'/Х/' => 'Kh',
'/х/' => 'kh',
'/Ц/' => 'Ts',
'/ц/' => 'ts',
'/Ч/' => 'Ch',
'/ч/' => 'ch',
'/Ш/' => 'Sh',
'/ш/' => 'sh',
'/Щ/' => 'Shch',
'/щ/' => 'shch',
'/Ъ|ъ|Ь|ь/' => '',
'/Ю/' => 'Yu',
'/ю/' => 'yu',
'/Я/' => 'Ya',
'/я/' => 'ya'
);
/* End of file foreign_chars.php */
/* Location: ./application/config/foreign_chars.php */

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
@@ -6,16 +8,27 @@
| This file lets you define "hooks" to extend CI without hacking the core
| files. Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
| https://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['post_controller_constructor'] = array(
'class' => '',
'function' => 'load_config',
'filename' => 'load_config.php',
'filepath' => 'hooks'
$hook['post_controller_constructor'][] = array(
'class' => '',
'function' => 'load_config',
'filename' => 'load_config.php',
'filepath' => 'hooks'
);
$hook['post_controller_constructor'][] = array(
'class' => '',
'function' => 'load_stats',
'filename' => 'load_stats.php',
'filepath' => 'hooks'
);
/* End of file hooks.php */
/* Location: ./application/config/hooks.php */
// 'post_controller' indicated execution of hooks after controller is finished
$hook['post_controller'] = array(
'class' => '',
'function' => 'db_log_queries',
'filename' => 'db_log.php',
'filepath' => 'hooks'
);

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -0,0 +1,19 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Memcached settings
| -------------------------------------------------------------------------
| Your Memcached servers can be specified below.
|
| See: https://codeigniter.com/user_guide/libraries/caching.html#memcached
|
*/
$config = array(
'default' => array(
'hostname' => '127.0.0.1',
'port' => '11211',
'weight' => '1',
),
);

View File

@@ -1,40 +1,84 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Enable/Disable Migrations
|--------------------------------------------------------------------------
|
| Migrations are disabled by default but should be enabled
| whenever you intend to do a schema migration.
|
*/
$config['migration_enabled'] = FALSE;
/*
|--------------------------------------------------------------------------
| Migrations version
|--------------------------------------------------------------------------
|
| This is used to set migration version that the file system should be on.
| If you run $this->migration->latest() this is the version that schema will
| be upgraded / downgraded to.
|
*/
$config['migration_version'] = 0;
/*
|--------------------------------------------------------------------------
| Migrations Path
|--------------------------------------------------------------------------
|
| Path to your migrations folder.
| Typically, it will be within your application path.
| Also, writing permission is required within the migrations path.
|
*/
$config['migration_path'] = APPPATH . 'migrations/';
/* End of file migration.php */
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Enable/Disable Migrations
|--------------------------------------------------------------------------
|
| Migrations are disabled by default for security reasons.
| You should enable migrations whenever you intend to do a schema migration
| and disable it back when you're done.
|
*/
$config['migration_enabled'] = FALSE;
/*
|--------------------------------------------------------------------------
| Migration Type
|--------------------------------------------------------------------------
|
| Migration file names may be based on a sequential identifier or on
| a timestamp. Options are:
|
| 'sequential' = Sequential migration naming (001_add_blog.php)
| 'timestamp' = Timestamp migration naming (20121031104401_add_blog.php)
| Use timestamp format YYYYMMDDHHIISS.
|
| Note: If this configuration value is missing the Migration library
| defaults to 'sequential' for backward compatibility with CI2.
|
*/
$config['migration_type'] = 'timestamp';
/*
|--------------------------------------------------------------------------
| Migrations table
|--------------------------------------------------------------------------
|
| This is the name of the table that will store the current migrations state.
| When migrations runs it will store in a database table which migration
| level the system is at. It then compares the migration level in this
| table to the $config['migration_version'] if they are not the same it
| will migrate up. This must be set.
|
*/
$config['migration_table'] = 'migrations';
/*
|--------------------------------------------------------------------------
| Auto Migrate To Latest
|--------------------------------------------------------------------------
|
| If this is set to TRUE when you load the migrations class and have
| $config['migration_enabled'] set to TRUE the system will auto migrate
| to your latest migration (whatever $config['migration_version'] is
| set to). This way you do not have to call migrations anywhere else
| in your code to have the latest migration.
|
*/
$config['migration_auto_latest'] = FALSE;
/*
|--------------------------------------------------------------------------
| Migrations version
|--------------------------------------------------------------------------
|
| This is used to set migration version that the file system should be on.
| If you run $this->migration->current() this is the version that schema will
| be upgraded / downgraded to.
|
*/
$config['migration_version'] = 0;
/*
|--------------------------------------------------------------------------
| Migrations Path
|--------------------------------------------------------------------------
|
| Path to your migrations folder.
| Typically, it will be within your application path.
| Also, writing permission is required within the migrations path.
|
*/
$config['migration_path'] = APPPATH.'migrations/';

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| MIME TYPES
@@ -7,100 +9,159 @@
| Upload class to help identify allowed file types.
|
*/
$mimes = array( 'hqx' => 'application/mac-binhex40',
'cpt' => 'application/mac-compactpro',
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
'bin' => 'application/macbinary',
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => array('application/octet-stream', 'application/x-msdownload'),
'class' => 'application/octet-stream',
'psd' => 'application/x-photoshop',
'so' => 'application/octet-stream',
'sea' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => array('application/pdf', 'application/x-download'),
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'),
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'),
'wbxml' => 'application/wbxml',
'wmlc' => 'application/wmlc',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'php' => 'application/x-httpd-php',
'php4' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'js' => 'application/x-javascript',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
'aif' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'rv' => 'video/vnd.rn-realvideo',
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
'bmp' => array('image/bmp', 'image/x-windows-bmp'),
'gif' => 'image/gif',
'jpeg' => array('image/jpeg', 'image/pjpeg'),
'jpg' => array('image/jpeg', 'image/pjpeg'),
'jpe' => array('image/jpeg', 'image/pjpeg'),
'png' => array('image/png', 'image/x-png'),
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'shtml' => 'text/html',
'txt' => 'text/plain',
'text' => 'text/plain',
'log' => array('text/plain', 'text/x-log'),
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'xml' => 'text/xml',
'xsl' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => 'video/x-msvideo',
'movie' => 'video/x-sgi-movie',
'doc' => 'application/msword',
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'),
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),
'word' => array('application/msword', 'application/octet-stream'),
'xl' => 'application/excel',
'eml' => 'message/rfc822',
'json' => array('application/json', 'text/json')
);
/* End of file mimes.php */
/* Location: ./application/config/mimes.php */
return array(
'hqx' => array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
'cpt' => 'application/mac-compactpro',
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),
'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => array('application/octet-stream', 'application/x-msdownload'),
'class' => 'application/octet-stream',
'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'),
'so' => 'application/octet-stream',
'sea' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),
'ai' => array('application/pdf', 'application/postscript'),
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),
'wbxml' => 'application/wbxml',
'wmlc' => 'application/wmlc',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),
'php4' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'js' => array('application/x-javascript', 'text/plain'),
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
'z' => 'application/x-compress',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),
'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'),
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
'aif' => array('audio/x-aiff', 'audio/aiff'),
'aiff' => array('audio/x-aiff', 'audio/aiff'),
'aifc' => 'audio/x-aiff',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'rv' => 'video/vnd.rn-realvideo',
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),
'gif' => 'image/gif',
'jpeg' => array('image/jpeg', 'image/pjpeg'),
'jpg' => array('image/jpeg', 'image/pjpeg'),
'jpe' => array('image/jpeg', 'image/pjpeg'),
'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'png' => array('image/png', 'image/x-png'),
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'css' => array('text/css', 'text/plain'),
'html' => array('text/html', 'text/plain'),
'htm' => array('text/html', 'text/plain'),
'shtml' => array('text/html', 'text/plain'),
'txt' => 'text/plain',
'text' => 'text/plain',
'log' => array('text/plain', 'text/x-log'),
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'xml' => array('application/xml', 'text/xml', 'text/plain'),
'xsl' => array('application/xml', 'text/xsl', 'text/xml'),
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),
'movie' => 'video/x-sgi-movie',
'doc' => array('application/msword', 'application/vnd.ms-office'),
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),
'dot' => array('application/msword', 'application/vnd.ms-office'),
'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),
'word' => array('application/msword', 'application/octet-stream'),
'xl' => 'application/excel',
'eml' => 'message/rfc822',
'json' => array('application/json', 'text/json'),
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
'p12' => 'application/x-pkcs12',
'p7a' => 'application/x-pkcs7-signature',
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7r' => 'application/x-pkcs7-certreqresp',
'p7s' => 'application/pkcs7-signature',
'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),
'crl' => array('application/pkix-crl', 'application/pkcs-crl'),
'der' => 'application/x-x509-ca-cert',
'kdb' => 'application/octet-stream',
'pgp' => 'application/pgp',
'gpg' => 'application/gpg-keys',
'sst' => 'application/octet-stream',
'csr' => 'application/octet-stream',
'rsa' => 'application/x-pkcs7',
'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'),
'3g2' => 'video/3gpp2',
'3gp' => array('video/3gp', 'video/3gpp'),
'mp4' => 'video/mp4',
'm4a' => 'audio/x-m4a',
'f4v' => array('video/mp4', 'video/x-f4v'),
'flv' => 'video/x-flv',
'webm' => 'video/webm',
'aac' => 'audio/x-acc',
'm4u' => 'application/vnd.mpegurl',
'm3u' => 'text/plain',
'xspf' => 'application/xspf+xml',
'vlc' => 'application/videolan',
'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'),
'au' => 'audio/x-au',
'ac3' => 'audio/ac3',
'flac' => 'audio/x-flac',
'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'),
'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),
'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),
'ics' => 'text/calendar',
'ical' => 'text/calendar',
'zsh' => 'text/x-scriptzsh',
'7zip' => array('application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),
'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'),
'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),
'svg' => array('image/svg+xml', 'application/xml', 'text/xml'),
'vcf' => 'text/x-vcard',
'srt' => array('text/srt', 'text/plain'),
'vtt' => array('text/vtt', 'text/plain'),
'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon')
);

View File

@@ -0,0 +1,24 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Bootstrap 3 pagination links styling
|--------------------------------------------------------------------------
|
| Source code from http://stackoverflow.com/questions/20088779/bootstrap-3-pagination-with-codeigniter
*/
$config['full_tag_open'] = "<ul class='pagination pagination-sm'>";
$config['full_tag_close'] ="</ul>";
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
$config['next_tag_open'] = "<li>";
$config['next_tagl_close'] = "</li>";
$config['prev_tag_open'] = "<li>";
$config['prev_tagl_close'] = "</li>";
$config['first_tag_open'] = "<li>";
$config['first_tagl_close'] = "</li>";
$config['last_tag_open'] = "<li>";
$config['last_tagl_close'] = "</li>";

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Profiler Sections
@@ -7,11 +9,6 @@
| data are displayed when the Profiler is enabled.
| Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/profiling.html
| https://codeigniter.com/user_guide/general/profiling.html
|
*/
/* End of file profiler.php */
/* Location: ./application/config/profiler.php */

View File

@@ -1,4 +1,6 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
@@ -17,13 +19,13 @@
|
| Please see the user guide for complete details:
|
| http://codeigniter.com/user_guide/general/routing.html
| https://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There area two reserved routes:
| There are three reserved routes:
|
| $route['default_controller'] = 'welcome';
|
@@ -33,32 +35,43 @@
|
| $route['404_override'] = 'errors/page_missing';
|
| This route will tell the Router what URI segments to use if those provided
| in the URL cannot be matched to a valid route.
| This route will tell the Router which controller/method to use if those
| provided in the URL cannot be matched to a valid route.
|
| $route['translate_uri_dashes'] = FALSE;
|
| This is not exactly a route, but allows you to automatically route
| controller and method names that contain dashes. '-' isn't a valid
| class or method name character, so it requires translation.
| When you set this option to TRUE, it will replace ALL dashes in the
| controller and method URI segments.
|
| Examples: my-controller/index -> my_controller/index
| my-controller/my-method -> my_controller/my_method
*/
$route['default_controller'] = "login";
$route['no_access/(:any)'] = "no_access/index/$1";
$route['reports/(summary_:any)/(:any)/(:any)'] = "reports/$1/$2/$3";
$route['reports/summary_:any'] = "reports/date_input_excel_export";
$route['reports/(graphical_:any)/(:any)/(:any)'] = "reports/$1/$2/$3";
$route['reports/graphical_:any'] = "reports/date_input";
$route['reports/(inventory_:any)/(:any)'] = "reports/$1/$2";
$route['reports/inventory_:any'] = "reports/excel_export";
$route['default_controller'] = 'login';
$route['no_access/([^/]+)'] = 'no_access/index/$1';
$route['no_access/([^/]+)/([^/]+)'] = 'no_access/index/$1/$2';
$route['sales/index/([^/]+)'] = 'sales/manage/$1';
$route['sales/index/([^/]+)/([^/]+)'] = 'sales/manage/$1/$2';
$route['sales/index/([^/]+)/([^/]+)/([^/]+)'] = 'sales/manage/$1/$2/$3';
$route['reports/(summary_:any)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/summary_:any'] = 'reports/date_input';
$route['reports/(graphical_:any)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/graphical_:any'] = 'reports/date_input';
$route['reports/(inventory_:any)/([^/]+)'] = 'reports/$1/$2';
$route['reports/inventory_summary'] = 'reports/inventory_summary_input';
$route['reports/(inventory_summary)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2';
$route['reports/(detailed_sales)/(:any)/(:any)'] = "reports/$1/$2/$3";
$route['reports/detailed_sales'] = "reports/date_input";
$route['reports/(detailed_receivings)/(:any)/(:any)'] = "reports/$1/$2/$3";
$route['reports/detailed_receivings'] = "reports/date_input";
$route['reports/(specific_:any)/(:any)/(:any)/(:any)'] = "reports/$1/$2/$3/$4";
$route['reports/specific_customer'] = "reports/specific_customer_input";
$route['reports/specific_employee'] = "reports/specific_employee_input";
$route['reports/specific_discount'] = "reports/specific_discount_input";
$route['reports/(detailed_sales)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3$/$4';
$route['reports/detailed_sales'] = 'reports/date_input_sales';
$route['reports/(detailed_receivings)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/detailed_receivings'] = 'reports/date_input_recv';
$route['reports/(specific_:any)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/specific_customer'] = 'reports/specific_customer_input';
$route['reports/specific_employee'] = 'reports/specific_employee_input';
$route['reports/specific_discount'] = 'reports/specific_discount_input';
$route['scaffolding_trigger'] = "";
$route['404_override'] = 'errors/page_missing';
/* End of file routes.php */
/* Location: ./application/config/routes.php */
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

View File

@@ -1,17 +1,18 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| SMILEYS
| -------------------------------------------------------------------
| This file contains an array of smileys for use with the emoticon helper.
| Individual images can be used to replace multiple simileys. For example:
| Individual images can be used to replace multiple smileys. For example:
| :-) and :) use the same image replacement.
|
| Please see user guide for more info:
| http://codeigniter.com/user_guide/helpers/smiley_helper.html
| https://codeigniter.com/user_guide/helpers/smiley_helper.html
|
*/
$smileys = array(
// smiley image name width height alt
@@ -57,10 +58,7 @@ $smileys = array(
':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
':snake:' => array('snake.gif', '19', '19', 'snake'),
':exclaim:' => array('exclaim.gif', '19', '19', 'excaim'),
':question:' => array('question.gif', '19', '19', 'question') // no comma after last item
':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'),
':question:' => array('question.gif', '19', '19', 'question')
);
/* End of file smileys.php */
/* Location: ./application/config/smileys.php */
);

View File

@@ -1,178 +1,214 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| USER AGENT TYPES
| -------------------------------------------------------------------
| This file contains four arrays of user agent data. It is used by the
| This file contains four arrays of user agent data. It is used by the
| User Agent Class to help identify browser, platform, robot, and
| mobile device data. The array keys are used to identify the device
| mobile device data. The array keys are used to identify the device
| and the array values are used to set the actual name of the item.
|
*/
$platforms = array (
'windows nt 6.0' => 'Windows Longhorn',
'windows nt 5.2' => 'Windows 2003',
'windows nt 5.0' => 'Windows 2000',
'windows nt 5.1' => 'Windows XP',
'windows nt 4.0' => 'Windows NT 4.0',
'winnt4.0' => 'Windows NT 4.0',
'winnt 4.0' => 'Windows NT',
'winnt' => 'Windows NT',
'windows 98' => 'Windows 98',
'win98' => 'Windows 98',
'windows 95' => 'Windows 95',
'win95' => 'Windows 95',
'windows' => 'Unknown Windows OS',
'os x' => 'Mac OS X',
'ppc mac' => 'Power PC Mac',
'freebsd' => 'FreeBSD',
'ppc' => 'Macintosh',
'linux' => 'Linux',
'debian' => 'Debian',
'sunos' => 'Sun Solaris',
'beos' => 'BeOS',
'apachebench' => 'ApacheBench',
'aix' => 'AIX',
'irix' => 'Irix',
'osf' => 'DEC OSF',
'hp-ux' => 'HP-UX',
'netbsd' => 'NetBSD',
'bsdi' => 'BSDi',
'openbsd' => 'OpenBSD',
'gnu' => 'GNU/Linux',
'unix' => 'Unknown Unix OS'
);
$platforms = array(
'windows nt 10.0' => 'Windows 10',
'windows nt 6.3' => 'Windows 8.1',
'windows nt 6.2' => 'Windows 8',
'windows nt 6.1' => 'Windows 7',
'windows nt 6.0' => 'Windows Vista',
'windows nt 5.2' => 'Windows 2003',
'windows nt 5.1' => 'Windows XP',
'windows nt 5.0' => 'Windows 2000',
'windows nt 4.0' => 'Windows NT 4.0',
'winnt4.0' => 'Windows NT 4.0',
'winnt 4.0' => 'Windows NT',
'winnt' => 'Windows NT',
'windows 98' => 'Windows 98',
'win98' => 'Windows 98',
'windows 95' => 'Windows 95',
'win95' => 'Windows 95',
'windows phone' => 'Windows Phone',
'windows' => 'Unknown Windows OS',
'android' => 'Android',
'blackberry' => 'BlackBerry',
'iphone' => 'iOS',
'ipad' => 'iOS',
'ipod' => 'iOS',
'os x' => 'Mac OS X',
'ppc mac' => 'Power PC Mac',
'freebsd' => 'FreeBSD',
'ppc' => 'Macintosh',
'linux' => 'Linux',
'debian' => 'Debian',
'sunos' => 'Sun Solaris',
'beos' => 'BeOS',
'apachebench' => 'ApacheBench',
'aix' => 'AIX',
'irix' => 'Irix',
'osf' => 'DEC OSF',
'hp-ux' => 'HP-UX',
'netbsd' => 'NetBSD',
'bsdi' => 'BSDi',
'openbsd' => 'OpenBSD',
'gnu' => 'GNU/Linux',
'unix' => 'Unknown Unix OS',
'symbian' => 'Symbian OS'
);
// The order of this array should NOT be changed. Many browsers return
// multiple browser types so we want to identify the sub-type first.
$browsers = array(
'Flock' => 'Flock',
'Chrome' => 'Chrome',
'Opera' => 'Opera',
'MSIE' => 'Internet Explorer',
'Internet Explorer' => 'Internet Explorer',
'Shiira' => 'Shiira',
'Firefox' => 'Firefox',
'Chimera' => 'Chimera',
'Phoenix' => 'Phoenix',
'Firebird' => 'Firebird',
'Camino' => 'Camino',
'Netscape' => 'Netscape',
'OmniWeb' => 'OmniWeb',
'Safari' => 'Safari',
'Mozilla' => 'Mozilla',
'Konqueror' => 'Konqueror',
'icab' => 'iCab',
'Lynx' => 'Lynx',
'Links' => 'Links',
'hotjava' => 'HotJava',
'amaya' => 'Amaya',
'IBrowse' => 'IBrowse'
);
'OPR' => 'Opera',
'Flock' => 'Flock',
'Edge' => 'Spartan',
'Chrome' => 'Chrome',
// Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string
'Opera.*?Version' => 'Opera',
'Opera' => 'Opera',
'MSIE' => 'Internet Explorer',
'Internet Explorer' => 'Internet Explorer',
'Trident.* rv' => 'Internet Explorer',
'Shiira' => 'Shiira',
'Firefox' => 'Firefox',
'Chimera' => 'Chimera',
'Phoenix' => 'Phoenix',
'Firebird' => 'Firebird',
'Camino' => 'Camino',
'Netscape' => 'Netscape',
'OmniWeb' => 'OmniWeb',
'Safari' => 'Safari',
'Mozilla' => 'Mozilla',
'Konqueror' => 'Konqueror',
'icab' => 'iCab',
'Lynx' => 'Lynx',
'Links' => 'Links',
'hotjava' => 'HotJava',
'amaya' => 'Amaya',
'IBrowse' => 'IBrowse',
'Maxthon' => 'Maxthon',
'Ubuntu' => 'Ubuntu Web Browser'
);
$mobiles = array(
// legacy array, old values commented out
'mobileexplorer' => 'Mobile Explorer',
// 'openwave' => 'Open Wave',
// 'opera mini' => 'Opera Mini',
// 'operamini' => 'Opera Mini',
// 'elaine' => 'Palm',
'palmsource' => 'Palm',
// 'digital paths' => 'Palm',
// 'avantgo' => 'Avantgo',
// 'xiino' => 'Xiino',
'palmscape' => 'Palmscape',
// 'nokia' => 'Nokia',
// 'ericsson' => 'Ericsson',
// 'blackberry' => 'BlackBerry',
// 'motorola' => 'Motorola'
// legacy array, old values commented out
'mobileexplorer' => 'Mobile Explorer',
// 'openwave' => 'Open Wave',
// 'opera mini' => 'Opera Mini',
// 'operamini' => 'Opera Mini',
// 'elaine' => 'Palm',
'palmsource' => 'Palm',
// 'digital paths' => 'Palm',
// 'avantgo' => 'Avantgo',
// 'xiino' => 'Xiino',
'palmscape' => 'Palmscape',
// 'nokia' => 'Nokia',
// 'ericsson' => 'Ericsson',
// 'blackberry' => 'BlackBerry',
// 'motorola' => 'Motorola'
// Phones and Manufacturers
'motorola' => "Motorola",
'nokia' => "Nokia",
'palm' => "Palm",
'iphone' => "Apple iPhone",
'ipad' => "iPad",
'ipod' => "Apple iPod Touch",
'sony' => "Sony Ericsson",
'ericsson' => "Sony Ericsson",
'blackberry' => "BlackBerry",
'cocoon' => "O2 Cocoon",
'blazer' => "Treo",
'lg' => "LG",
'amoi' => "Amoi",
'xda' => "XDA",
'mda' => "MDA",
'vario' => "Vario",
'htc' => "HTC",
'samsung' => "Samsung",
'sharp' => "Sharp",
'sie-' => "Siemens",
'alcatel' => "Alcatel",
'benq' => "BenQ",
'ipaq' => "HP iPaq",
'mot-' => "Motorola",
'playstation portable' => "PlayStation Portable",
'hiptop' => "Danger Hiptop",
'nec-' => "NEC",
'panasonic' => "Panasonic",
'philips' => "Philips",
'sagem' => "Sagem",
'sanyo' => "Sanyo",
'spv' => "SPV",
'zte' => "ZTE",
'sendo' => "Sendo",
// Phones and Manufacturers
'motorola' => 'Motorola',
'nokia' => 'Nokia',
'palm' => 'Palm',
'iphone' => 'Apple iPhone',
'ipad' => 'iPad',
'ipod' => 'Apple iPod Touch',
'sony' => 'Sony Ericsson',
'ericsson' => 'Sony Ericsson',
'blackberry' => 'BlackBerry',
'cocoon' => 'O2 Cocoon',
'blazer' => 'Treo',
'lg' => 'LG',
'amoi' => 'Amoi',
'xda' => 'XDA',
'mda' => 'MDA',
'vario' => 'Vario',
'htc' => 'HTC',
'samsung' => 'Samsung',
'sharp' => 'Sharp',
'sie-' => 'Siemens',
'alcatel' => 'Alcatel',
'benq' => 'BenQ',
'ipaq' => 'HP iPaq',
'mot-' => 'Motorola',
'playstation portable' => 'PlayStation Portable',
'playstation 3' => 'PlayStation 3',
'playstation vita' => 'PlayStation Vita',
'hiptop' => 'Danger Hiptop',
'nec-' => 'NEC',
'panasonic' => 'Panasonic',
'philips' => 'Philips',
'sagem' => 'Sagem',
'sanyo' => 'Sanyo',
'spv' => 'SPV',
'zte' => 'ZTE',
'sendo' => 'Sendo',
'nintendo dsi' => 'Nintendo DSi',
'nintendo ds' => 'Nintendo DS',
'nintendo 3ds' => 'Nintendo 3DS',
'wii' => 'Nintendo Wii',
'open web' => 'Open Web',
'openweb' => 'OpenWeb',
// Operating Systems
'symbian' => "Symbian",
'SymbianOS' => "SymbianOS",
'elaine' => "Palm",
'palm' => "Palm",
'series60' => "Symbian S60",
'windows ce' => "Windows CE",
// Operating Systems
'android' => 'Android',
'symbian' => 'Symbian',
'SymbianOS' => 'SymbianOS',
'elaine' => 'Palm',
'series60' => 'Symbian S60',
'windows ce' => 'Windows CE',
// Browsers
'obigo' => "Obigo",
'netfront' => "Netfront Browser",
'openwave' => "Openwave Browser",
'mobilexplorer' => "Mobile Explorer",
'operamini' => "Opera Mini",
'opera mini' => "Opera Mini",
// Browsers
'obigo' => 'Obigo',
'netfront' => 'Netfront Browser',
'openwave' => 'Openwave Browser',
'mobilexplorer' => 'Mobile Explorer',
'operamini' => 'Opera Mini',
'opera mini' => 'Opera Mini',
'opera mobi' => 'Opera Mobile',
'fennec' => 'Firefox Mobile',
// Other
'digital paths' => "Digital Paths",
'avantgo' => "AvantGo",
'xiino' => "Xiino",
'novarra' => "Novarra Transcoder",
'vodafone' => "Vodafone",
'docomo' => "NTT DoCoMo",
'o2' => "O2",
// Other
'digital paths' => 'Digital Paths',
'avantgo' => 'AvantGo',
'xiino' => 'Xiino',
'novarra' => 'Novarra Transcoder',
'vodafone' => 'Vodafone',
'docomo' => 'NTT DoCoMo',
'o2' => 'O2',
// Fallback
'mobile' => "Generic Mobile",
'wireless' => "Generic Mobile",
'j2me' => "Generic Mobile",
'midp' => "Generic Mobile",
'cldc' => "Generic Mobile",
'up.link' => "Generic Mobile",
'up.browser' => "Generic Mobile",
'smartphone' => "Generic Mobile",
'cellphone' => "Generic Mobile"
);
// Fallback
'mobile' => 'Generic Mobile',
'wireless' => 'Generic Mobile',
'j2me' => 'Generic Mobile',
'midp' => 'Generic Mobile',
'cldc' => 'Generic Mobile',
'up.link' => 'Generic Mobile',
'up.browser' => 'Generic Mobile',
'smartphone' => 'Generic Mobile',
'cellphone' => 'Generic Mobile'
);
// There are hundreds of bots but these are the most common.
$robots = array(
'googlebot' => 'Googlebot',
'msnbot' => 'MSNBot',
'slurp' => 'Inktomi Slurp',
'yahoo' => 'Yahoo',
'askjeeves' => 'AskJeeves',
'fastcrawler' => 'FastCrawler',
'infoseek' => 'InfoSeek Robot 1.0',
'lycos' => 'Lycos'
);
/* End of file user_agents.php */
/* Location: ./application/config/user_agents.php */
'googlebot' => 'Googlebot',
'msnbot' => 'MSNBot',
'baiduspider' => 'Baiduspider',
'bingbot' => 'Bing',
'slurp' => 'Inktomi Slurp',
'yahoo' => 'Yahoo',
'ask jeeves' => 'Ask Jeeves',
'fastcrawler' => 'FastCrawler',
'infoseek' => 'InfoSeek Robot 1.0',
'lycos' => 'Lycos',
'yandex' => 'YandexBot',
'mediapartners-google' => 'MediaPartners Google',
'CRAZYWEBCRAWLER' => 'Crazy Webcrawler',
'adsbot-google' => 'AdsBot Google',
'feedfetcher-google' => 'Feedfetcher Google',
'curious george' => 'Curious George',
'ia_archiver' => 'Alexa Crawler',
'MJ12bot' => 'Majestic-12',
'Uptimebot' => 'Uptimebot'
);

View File

@@ -0,0 +1,590 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Config extends Secure_Controller
{
public function __construct()
{
parent::__construct('config');
$this->load->library('barcode_lib');
}
/*
* This function loads all the licenses starting with the first one being OSPOS one
*/
private function _licenses()
{
$i = 0;
$bower = FALSE;
$composer = FALSE;
$license = array();
$license[$i]['title'] = 'Open Source Point Of Sale ' . $this->config->item('application_version');
if(file_exists('license/LICENSE'))
{
$license[$i]['text'] = $this->xss_clean(file_get_contents('license/LICENSE', NULL, NULL, 0, 2000));
}
else
{
$license[$i]['text'] = 'LICENSE file must be in OSPOS license directory. You are not allowed to use OSPOS application until the distribution copy of LICENSE file is present.';
}
// read all the files in the dir license
$dir = new DirectoryIterator('license');
foreach($dir as $fileinfo)
{
// license files must be in couples: .version (name & version) & .license (license text)
if($fileinfo->isFile())
{
if($fileinfo->getExtension() == 'version')
{
++$i;
$basename = 'license/' . $fileinfo->getBasename('.version');
$license[$i]['title'] = $this->xss_clean(file_get_contents($basename . '.version', NULL, NULL, 0, 100));
$license_text_file = $basename . '.license';
if(file_exists($license_text_file))
{
$license[$i]['text'] = $this->xss_clean(file_get_contents($license_text_file , NULL, NULL, 0, 2000));
}
else
{
$license[$i]['text'] = $license_text_file . ' file is missing';
}
}
elseif($fileinfo->getBasename() == 'bower.LICENSES')
{
// set a flag to indicate that the JS Plugin bower.LICENSES file is available and needs to be attached at the end
$bower = TRUE;
}
elseif($fileinfo->getBasename() == 'composer.LICENSES')
{
// set a flag to indicate that the composer.LICENSES file is available and needs to be attached at the end
$composer = TRUE;
}
}
}
// attach the licenses from the LICENSES file generated by bower
if($composer)
{
++$i;
$license[$i]['title'] = 'Composer Libraries';
$license[$i]['text'] = '';
$file = file_get_contents('license/composer.LICENSES');
$array = json_decode($file, true);
foreach($array as $key => $val)
{
if(is_array($val) && $key == 'dependencies')
{
foreach($val as $key1 => $val1)
{
if(is_array($val1))
{
$license[$i]['text'] .= 'component: ' . $key1 . "\n";
foreach($val1 as $key2 => $val2)
{
if(is_array($val2))
{
$license[$i]['text'] .= $key2 . ': ';
foreach($val2 as $key3 => $val3)
{
$license[$i]['text'] .= $val3 . ' ';
}
$license[$i]['text'] .= "\n";
}
else
{
$license[$i]['text'] .= $key2 . ': ' . $val2 . "\n";
}
}
$license[$i]['text'] .= "\n";
}
else
{
$license[$i]['text'] .= $key1 . ': ' . $val1 . "\n";
}
}
}
}
$license[$i]['text'] = $this->xss_clean($license[$i]['text']);
}
// attach the licenses from the LICENSES file generated by bower
if($bower)
{
++$i;
$license[$i]['title'] = 'JS Plugins';
$license[$i]['text'] = '';
$file = file_get_contents('license/bower.LICENSES');
$array = json_decode($file, true);
foreach($array as $key => $val)
{
if(is_array($val))
{
$license[$i]['text'] .= 'component: ' . $key . "\n";
foreach($val as $key1 => $val1)
{
if(is_array($val1))
{
$license[$i]['text'] .= $key1 . ': ';
foreach($val1 as $key2 => $val2)
{
$license[$i]['text'] .= $val2 . ' ';
}
$license[$i]['text'] .= "\n";
}
else
{
$license[$i]['text'] .= $key1 . ': ' . $val1 . "\n";
}
}
$license[$i]['text'] .= "\n";
}
}
$license[$i]['text'] = $this->xss_clean($license[$i]['text']);
}
return $license;
}
private function _themes()
{
$themes = array();
// read all themes in the dist folder
$dir = new DirectoryIterator('dist/bootswatch');
foreach($dir as $dirinfo)
{
if($dirinfo->isDir() && !$dirinfo->isDot() && $dirinfo->getFileName() != 'fonts')
{
$themes[$dirinfo->getFileName()] = $dirinfo->getFileName();
}
}
asort($themes);
return $themes;
}
public function index()
{
$data['stock_locations'] = $this->Stock_location->get_all()->result_array();
$data['support_barcode'] = $this->barcode_lib->get_list_barcodes();
$data['logo_exists'] = $this->config->item('company_logo') != '';
$data = $this->xss_clean($data);
// load all the license statements, they are already XSS cleaned in the private function
$data['licenses'] = $this->_licenses();
$data['themes'] = $this->_themes();
$this->load->view("configs/manage", $data);
}
public function save_info()
{
$upload_success = $this->_handle_logo_upload();
$upload_data = $this->upload->data();
$batch_save_data = array(
'company' => $this->input->post('company'),
'address' => $this->input->post('address'),
'phone' => $this->input->post('phone'),
'email' => $this->input->post('email'),
'fax' => $this->input->post('fax'),
'website' => $this->input->post('website'),
'return_policy' => $this->input->post('return_policy')
);
if (!empty($upload_data['orig_name']))
{
// XSS file image sanity check
if ($this->xss_clean($upload_data['raw_name'], TRUE) === TRUE)
{
$batch_save_data['company_logo'] = $upload_data['raw_name'] . $upload_data['file_ext'];
}
}
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $upload_success && $result ? TRUE : FALSE;
$message = $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully');
$message = $upload_success ? $message : strip_tags($this->upload->display_errors());
echo json_encode(array('success' => $success, 'message' => $message));
}
public function save_general()
{
$batch_save_data = array(
'theme' => $this->input->post('theme'),
'default_tax_1_rate' => parse_decimals($this->input->post('default_tax_1_rate')),
'default_tax_1_name' => $this->input->post('default_tax_1_name'),
'default_tax_2_rate' => parse_decimals($this->input->post('default_tax_2_rate')),
'default_tax_2_name' => $this->input->post('default_tax_2_name'),
'tax_included' => $this->input->post('tax_included') != NULL,
'receiving_calculate_average_price' => $this->input->post('receiving_calculate_average_price') != NULL,
'lines_per_page' => $this->input->post('lines_per_page'),
'default_sales_discount' => $this->input->post('default_sales_discount'),
'notify_horizontal_position' => $this->input->post('notify_horizontal_position'),
'notify_vertical_position' => $this->input->post('notify_vertical_position'),
'custom1_name' => $this->input->post('custom1_name'),
'custom2_name' => $this->input->post('custom2_name'),
'custom3_name' => $this->input->post('custom3_name'),
'custom4_name' => $this->input->post('custom4_name'),
'custom5_name' => $this->input->post('custom5_name'),
'custom6_name' => $this->input->post('custom6_name'),
'custom7_name' => $this->input->post('custom7_name'),
'custom8_name' => $this->input->post('custom8_name'),
'custom9_name' => $this->input->post('custom9_name'),
'custom10_name' => $this->input->post('custom10_name'),
'statistics' => $this->input->post('statistics') != NULL,
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function check_number_locale()
{
$number_locale = $this->input->post('number_locale');
$fmt = new \NumberFormatter($number_locale, \NumberFormatter::CURRENCY);
$currency_symbol = empty($this->input->post('currency_symbol')) ? $fmt->getSymbol(\NumberFormatter::CURRENCY_SYMBOL) : $this->input->post('currency_symbol');
if ($this->input->post('thousands_separator') == "false")
{
$fmt->setAttribute(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
}
$fmt->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, $currency_symbol);
$number_local_example = $fmt->format(1234567890.12300);
echo json_encode(array(
'success' => $number_local_example != FALSE,
'number_locale_example' => $number_local_example,
'currency_symbol' => $currency_symbol,
'thousands_separator' => $fmt->getAttribute(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL) != ''
));
}
public function save_locale()
{
$exploded = explode(":", $this->input->post('language'));
$batch_save_data = array(
'currency_symbol' => $this->input->post('currency_symbol'),
'language_code' => $exploded[0],
'language' => $exploded[1],
'timezone' => $this->input->post('timezone'),
'dateformat' => $this->input->post('dateformat'),
'timeformat' => $this->input->post('timeformat'),
'thousands_separator' => $this->input->post('thousands_separator'),
'number_locale' => $this->input->post('number_locale'),
'currency_decimals' => $this->input->post('currency_decimals'),
'tax_decimals' => $this->input->post('tax_decimals'),
'quantity_decimals' => $this->input->post('quantity_decimals'),
'country_codes' => $this->input->post('country_codes'),
'payment_options_order' => $this->input->post('payment_options_order')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_email()
{
$password = '';
if($this->_check_encryption())
{
$password = $this->encryption->encrypt($this->input->post('smtp_pass'));
}
$batch_save_data = array(
'protocol' => $this->input->post('protocol'),
'mailpath' => $this->input->post('mailpath'),
'smtp_host' => $this->input->post('smtp_host'),
'smtp_user' => $this->input->post('smtp_user'),
'smtp_pass' => $password,
'smtp_port' => $this->input->post('smtp_port'),
'smtp_timeout' => $this->input->post('smtp_timeout'),
'smtp_crypto' => $this->input->post('smtp_crypto')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_message()
{
$password = '';
if($this->_check_encryption())
{
$password = $this->encryption->encrypt($this->input->post('msg_pwd'));
}
$batch_save_data = array(
'msg_msg' => $this->input->post('msg_msg'),
'msg_uid' => $this->input->post('msg_uid'),
'msg_pwd' => $password,
'msg_src' => $this->input->post('msg_src')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function stock_locations()
{
$stock_locations = $this->Stock_location->get_all()->result_array();
$stock_locations = $this->xss_clean($stock_locations);
$this->load->view('partial/stock_locations', array('stock_locations' => $stock_locations));
}
private function _clear_session_state()
{
$this->load->library('sale_lib');
$this->sale_lib->clear_sale_location();
$this->sale_lib->clear_all();
$this->load->library('receiving_lib');
$this->receiving_lib->clear_stock_source();
$this->receiving_lib->clear_stock_destination();
$this->receiving_lib->clear_all();
}
public function save_locations()
{
$this->db->trans_start();
$deleted_locations = $this->Stock_location->get_allowed_locations();
foreach($this->input->post() as $key => $value)
{
if (strstr($key, 'stock_location'))
{
$location_id = preg_replace("/.*?_(\d+)$/", "$1", $key);
unset($deleted_locations[$location_id]);
// save or update
$location_data = array('location_name' => $value);
if ($this->Stock_location->save($location_data, $location_id))
{
$this->_clear_session_state();
}
}
}
// all locations not available in post will be deleted now
foreach ($deleted_locations as $location_id => $location_name)
{
$this->Stock_location->delete($location_id);
}
$this->db->trans_complete();
$success = $this->db->trans_status();
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_barcode()
{
$batch_save_data = array(
'barcode_type' => $this->input->post('barcode_type'),
'barcode_quality' => $this->input->post('barcode_quality'),
'barcode_width' => $this->input->post('barcode_width'),
'barcode_height' => $this->input->post('barcode_height'),
'barcode_font' => $this->input->post('barcode_font'),
'barcode_font_size' => $this->input->post('barcode_font_size'),
'barcode_first_row' => $this->input->post('barcode_first_row'),
'barcode_second_row' => $this->input->post('barcode_second_row'),
'barcode_third_row' => $this->input->post('barcode_third_row'),
'barcode_num_in_row' => $this->input->post('barcode_num_in_row'),
'barcode_page_width' => $this->input->post('barcode_page_width'),
'barcode_page_cellspacing' => $this->input->post('barcode_page_cellspacing'),
'barcode_generate_if_empty' => $this->input->post('barcode_generate_if_empty') != NULL,
'barcode_content' => $this->input->post('barcode_content')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_receipt()
{
$batch_save_data = array (
'receipt_template' => $this->input->post('receipt_template'),
'receipt_show_taxes' => $this->input->post('receipt_show_taxes') != NULL,
'receipt_show_total_discount' => $this->input->post('receipt_show_total_discount') != NULL,
'receipt_show_description' => $this->input->post('receipt_show_description') != NULL,
'receipt_show_serialnumber' => $this->input->post('receipt_show_serialnumber') != NULL,
'print_silently' => $this->input->post('print_silently') != NULL,
'print_header' => $this->input->post('print_header') != NULL,
'print_footer' => $this->input->post('print_footer') != NULL,
'print_top_margin' => $this->input->post('print_top_margin'),
'print_left_margin' => $this->input->post('print_left_margin'),
'print_bottom_margin' => $this->input->post('print_bottom_margin'),
'print_right_margin' => $this->input->post('print_right_margin')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_invoice()
{
$batch_save_data = array (
'invoice_enable' => $this->input->post('invoice_enable') != NULL,
'sales_invoice_format' => $this->input->post('sales_invoice_format'),
'recv_invoice_format' => $this->input->post('recv_invoice_format'),
'invoice_default_comments' => $this->input->post('invoice_default_comments'),
'invoice_email_message' => $this->input->post('invoice_email_message')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function remove_logo()
{
$result = $this->Appconfig->batch_save(array('company_logo' => ''));
echo json_encode(array('success' => $result));
}
private function _handle_logo_upload()
{
$this->load->helper('directory');
// load upload library
$config = array('upload_path' => './uploads/',
'allowed_types' => 'gif|jpg|png',
'max_size' => '1024',
'max_width' => '800',
'max_height' => '680',
'file_name' => 'company_logo');
$this->load->library('upload', $config);
$this->upload->do_upload('company_logo');
return strlen($this->upload->display_errors()) == 0 || !strcmp($this->upload->display_errors(), '<p>'.$this->lang->line('upload_no_file_selected').'</p>');
}
private function _check_encryption()
{
$encryption_key = $this->config->item('encryption_key');
// check if the encryption_key config item is the default one
if($encryption_key == '' || $encryption_key == 'YOUR KEY')
{
// Config path
$config_path = APPPATH . 'config/config.php';
// Open the file
$config = file_get_contents($config_path);
// $key will be assigned a 32-byte (256-bit) hex-encoded random key
$key = bin2hex($this->encryption->create_key(32));
// replace the empty placeholder with a real randomly generated encryption key
if($encryption_key == '')
{
$config = str_replace("['encryption_key'] = '';", "['encryption_key'] = '" . $key . "';", $config);
}
else
{
$config = str_replace("['encryption_key'] = 'YOUR KEY';", "['encryption_key'] = '" . $key . "';", $config);
}
// set the encryption key in the config item
$this->config->set_item('encryption_key', $key);
// Write the new config.php file
$handle = fopen($config_path, 'w+');
// Chmod the file
@chmod($config_path, 0777);
$result = FALSE;
// Verify file permissions
if(is_writable($config_path))
{
// Write the file
$result = (fwrite($handle, $config) === FALSE) ? FALSE : TRUE;
}
// Chmod the file
@chmod($config_path, 0444);
fclose($handle);
return $result;
}
return TRUE;
}
public function backup_db()
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
if($this->Employee->has_module_grant('config', $employee_id))
{
$this->load->dbutil();
$prefs = array(
'format' => 'zip',
'filename' => 'ospos.sql'
);
$backup = $this->dbutil->backup($prefs);
$file_name = 'ospos-' . date("Y-m-d-H-i-s") .'.zip';
$save = 'uploads/' . $file_name;
$this->load->helper('download');
while(ob_get_level())
{
ob_end_clean();
}
force_download($file_name, $backup);
}
else
{
redirect('no_access/config');
}
}
}
?>

View File

@@ -0,0 +1,253 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Persons.php");
class Customers extends Persons
{
public function __construct()
{
parent::__construct('customers');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_people_manage_table_headers());
$this->load->view('people/manage', $data);
}
/*
Returns customer table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$customers = $this->Customer->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Customer->get_found_rows($search);
$data_rows = array();
foreach($customers->result() as $person)
{
$data_rows[] = get_person_data_row($person, $this);
}
$data_rows = $this->xss_clean($data_rows);
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest()
{
$suggestions = $this->xss_clean($this->Customer->get_search_suggestions($this->input->get('term'), TRUE));
echo json_encode($suggestions);
}
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Customer->get_search_suggestions($this->input->post('term'), FALSE));
echo json_encode($suggestions);
}
/*
Loads the customer edit form
*/
public function view($customer_id = -1)
{
$info = $this->Customer->get_info($customer_id);
foreach(get_object_vars($info) as $property => $value)
{
$info->$property = $this->xss_clean($value);
}
$data['person_info'] = $info;
$data['total'] = $this->xss_clean($this->Customer->get_totals($customer_id)->total);
$this->load->view("customers/form", $data);
}
/*
Inserts/updates a customer
*/
public function save($customer_id = -1)
{
$person_data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'gender' => $this->input->post('gender'),
'email' => $this->input->post('email'),
'phone_number' => $this->input->post('phone_number'),
'address_1' => $this->input->post('address_1'),
'address_2' => $this->input->post('address_2'),
'city' => $this->input->post('city'),
'state' => $this->input->post('state'),
'zip' => $this->input->post('zip'),
'country' => $this->input->post('country'),
'comments' => $this->input->post('comments')
);
$customer_data = array(
'account_number' => $this->input->post('account_number') == '' ? NULL : $this->input->post('account_number'),
'company_name' => $this->input->post('company_name') == '' ? NULL : $this->input->post('company_name'),
'discount_percent' => $this->input->post('discount_percent') == '' ? 0.00 : $this->input->post('discount_percent'),
'taxable' => $this->input->post('taxable') != NULL
);
if($this->Customer->save_customer($person_data, $customer_data, $customer_id))
{
$person_data = $this->xss_clean($person_data);
$customer_data = $this->xss_clean($customer_data);
//New customer
if($customer_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('customers_successful_adding').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => $customer_data['person_id']));
}
else //Existing customer
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('customers_successful_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => $customer_id));
}
}
else//failure
{
$person_data = $this->xss_clean($person_data);
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('customers_error_adding_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => -1));
}
}
public function check_account_number()
{
$exists = $this->Customer->account_number_exists($this->input->post('account_number'), $this->input->post('person_id'));
echo !$exists ? 'true' : 'false';
}
/*
This deletes customers from the customers table
*/
public function delete()
{
$customers_to_delete = $this->xss_clean($this->input->post('ids'));
if($this->Customer->delete_list($customers_to_delete))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('customers_successful_deleted').' '.
count($customers_to_delete).' '.$this->lang->line('customers_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('customers_cannot_be_deleted')));
}
}
/*
Customers import from excel spreadsheet
*/
public function excel()
{
$name = 'import_customers.csv';
$data = file_get_contents('../' . $name);
force_download($name, $data);
}
public function excel_import()
{
$this->load->view('customers/form_excel_import', NULL);
}
public function do_excel_import()
{
if($_FILES['file_path']['error'] != UPLOAD_ERR_OK)
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('customers_excel_import_failed')));
}
else
{
if(($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== FALSE)
{
// Skip the first row as it's the table description
fgetcsv($handle);
$i = 1;
$failCodes = array();
while(($data = fgetcsv($handle)) !== FALSE)
{
// XSS file data sanity check
$data = $this->xss_clean($data);
if(sizeof($data) >= 15)
{
$person_data = array(
'first_name' => $data[0],
'last_name' => $data[1],
'gender' => $data[2],
'email' => $data[3],
'phone_number' => $data[4],
'address_1' => $data[5],
'address_2' => $data[6],
'city' => $data[7],
'state' => $data[8],
'zip' => $data[9],
'country' => $data[10],
'comments' => $data[11]
);
$customer_data = array(
'company_name' => $data[12],
'discount_percent' => $data[14],
'taxable' => $data[15] == '' ? 0 : 1
);
$account_number = $data[13];
$invalidated = FALSE;
if($account_number != '')
{
$customer_data['account_number'] = $account_number;
$invalidated = $this->Customer->account_number_exists($account_number);
}
}
else
{
$invalidated = TRUE;
}
if($invalidated || !$this->Customer->save_customer($person_data, $customer_data))
{
$failCodes[] = $i;
}
++$i;
}
if(count($failCodes) > 0)
{
$message = $this->lang->line('customers_excel_import_partially_failed') . ' (' . count($failCodes) . '): ' . implode(', ', $failCodes);
echo json_encode(array('success' => FALSE, 'message' => $message));
}
else
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('customers_excel_import_success')));
}
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('customers_excel_import_nodata_wrongformat')));
}
}
}
}
?>

View File

@@ -0,0 +1,169 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Persons.php");
class Employees extends Persons
{
public function __construct()
{
parent::__construct('employees');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_people_manage_table_headers());
$this->load->view('people/manage', $data);
}
/*
Returns employee table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$employees = $this->Employee->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Employee->get_found_rows($search);
$data_rows = array();
foreach($employees->result() as $person)
{
$data_rows[] = get_person_data_row($person, $this);
}
$data_rows = $this->xss_clean($data_rows);
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Employee->get_search_suggestions($this->input->post('term')));
echo json_encode($suggestions);
}
/*
Loads the employee edit form
*/
public function view($employee_id = -1)
{
$person_info = $this->Employee->get_info($employee_id);
foreach(get_object_vars($person_info) as $property => $value)
{
$person_info->$property = $this->xss_clean($value);
}
$data['person_info'] = $person_info;
$modules = array();
foreach($this->Module->get_all_modules()->result() as $module)
{
$module->module_id = $this->xss_clean($module->module_id);
$module->grant = $this->xss_clean($this->Employee->has_grant($module->module_id, $person_info->person_id));
$modules[] = $module;
}
$data['all_modules'] = $modules;
$permissions = array();
foreach($this->Module->get_all_subpermissions()->result() as $permission)
{
$permission->module_id = $this->xss_clean($permission->module_id);
$permission->permission_id = $this->xss_clean($permission->permission_id);
$permission->grant = $this->xss_clean($this->Employee->has_grant($permission->permission_id, $person_info->person_id));
$permissions[] = $permission;
}
$data['all_subpermissions'] = $permissions;
$this->load->view("employees/form", $data);
}
/*
Inserts/updates an employee
*/
public function save($employee_id = -1)
{
$person_data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'gender' => $this->input->post('gender'),
'email' => $this->input->post('email'),
'phone_number' => $this->input->post('phone_number'),
'address_1' => $this->input->post('address_1'),
'address_2' => $this->input->post('address_2'),
'city' => $this->input->post('city'),
'state' => $this->input->post('state'),
'zip' => $this->input->post('zip'),
'country' => $this->input->post('country'),
'comments' => $this->input->post('comments'),
);
$grants_data = $this->input->post('grants') != NULL ? $this->input->post('grants') : array();
//Password has been changed OR first time password set
if($this->input->post('password') != '')
{
$employee_data = array(
'username' => $this->input->post('username'),
'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT),
'hash_version' => 2
);
}
else //Password not changed
{
$employee_data = array('username' => $this->input->post('username'));
}
if($this->Employee->save_employee($person_data, $employee_data, $grants_data, $employee_id))
{
$person_data = $this->xss_clean($person_data);
$employee_data = $this->xss_clean($employee_data);
//New employee
if($employee_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('employees_successful_adding').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => $employee_data['person_id']));
}
else //Existing employee
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('employees_successful_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => $employee_id));
}
}
else//failure
{
$person_data = $this->xss_clean($person_data);
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('employees_error_adding_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'], 'id' => -1));
}
}
/*
This deletes employees from the employees table
*/
public function delete()
{
$employees_to_delete = $this->xss_clean($this->input->post('ids'));
if($this->Employee->delete_list($employees_to_delete))
{
echo json_encode(array('success' => TRUE,'message' => $this->lang->line('employees_successful_deleted').' '.
count($employees_to_delete).' '.$this->lang->line('employees_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE,'message' => $this->lang->line('employees_cannot_be_deleted')));
}
}
}
?>

View File

@@ -0,0 +1,125 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Giftcards extends Secure_Controller
{
public function __construct()
{
parent::__construct('giftcards');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_giftcards_manage_table_headers());
$this->load->view('giftcards/manage', $data);
}
/*
Returns Giftcards table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$giftcards = $this->Giftcard->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Giftcard->get_found_rows($search);
$data_rows = array();
foreach($giftcards->result() as $giftcard)
{
$data_rows[] = get_giftcard_data_row($giftcard, $this);
}
$data_rows = $this->xss_clean($data_rows);
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Giftcard->get_search_suggestions($this->input->post('term')));
echo json_encode($suggestions);
}
public function get_row($row_id)
{
$data_row = $this->xss_clean(get_giftcard_data_row($this->Giftcard->get_info($row_id), $this));
echo json_encode($data_row);
}
public function view($giftcard_id = -1)
{
$giftcard_info = $this->Giftcard->get_info($giftcard_id);
$data['selected_person_name'] = ($giftcard_id > 0 && isset($giftcard_info->person_id)) ? $giftcard_info->first_name . ' ' . $giftcard_info->last_name : '';
$data['selected_person_id'] = $giftcard_info->person_id;
$data['giftcard_number'] = $giftcard_id > 0 ? $giftcard_info->giftcard_number : $this->Giftcard->get_max_number()->giftcard_number + 1;
$data['giftcard_id'] = $giftcard_id;
$data['giftcard_value'] = $giftcard_info->value;
$data = $this->xss_clean($data);
$this->load->view("giftcards/form", $data);
}
public function save($giftcard_id = -1)
{
$giftcard_data = array(
'record_time' => date('Y-m-d H:i:s'),
'giftcard_number' => $this->input->post('giftcard_number'),
'value' => parse_decimals($this->input->post('value')),
'person_id' => $this->input->post('person_id') == '' ? NULL : $this->input->post('person_id')
);
if($this->Giftcard->save($giftcard_data, $giftcard_id))
{
$giftcard_data = $this->xss_clean($giftcard_data);
//New giftcard
if($giftcard_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('giftcards_successful_adding').' '.
$giftcard_data['giftcard_number'], 'id' => $giftcard_data['giftcard_id']));
}
else //Existing giftcard
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('giftcards_successful_updating').' '.
$giftcard_data['giftcard_number'], 'id' => $giftcard_id));
}
}
else //failure
{
$giftcard_data = $this->xss_clean($giftcard_data);
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('giftcards_error_adding_updating').' '.
$giftcard_data['giftcard_number'], 'id' => -1));
}
}
public function delete()
{
$giftcards_to_delete = $this->xss_clean($this->input->post('ids'));
if($this->Giftcard->delete_list($giftcards_to_delete))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('giftcards_successful_deleted').' '.
count($giftcards_to_delete).' '.$this->lang->line('giftcards_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('giftcards_cannot_be_deleted')));
}
}
}
?>

View File

@@ -0,0 +1,24 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Home extends Secure_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$this->load->view('home');
}
public function logout()
{
$this->track_page('logout', 'logout');
$this->Employee->logout();
}
}
?>

View File

@@ -0,0 +1,198 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Item_kits extends Secure_Controller
{
public function __construct()
{
parent::__construct('item_kits');
}
/*
Add the total cost and retail price to a passed items kit retrieving the data from each singular item part of the kit
*/
private function _add_totals_to_item_kit($item_kit)
{
$item_kit->total_cost_price = 0;
$item_kit->total_unit_price = 0;
foreach($this->Item_kit_items->get_info($item_kit->item_kit_id) as $item_kit_item)
{
$item_info = $this->Item->get_info($item_kit_item['item_id']);
foreach(get_object_vars($item_info) as $property => $value)
{
$item_info->$property = $this->xss_clean($value);
}
$item_kit->total_cost_price += $item_info->cost_price * $item_kit_item['quantity'];
$item_kit->total_unit_price += $item_info->unit_price * $item_kit_item['quantity'];
}
return $item_kit;
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_item_kits_manage_table_headers());
$this->load->view('item_kits/manage', $data);
}
/*
Returns Item kits table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$item_kits = $this->Item_kit->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Item_kit->get_found_rows($search);
$data_rows = array();
foreach($item_kits->result() as $item_kit)
{
// calculate the total cost and retail price of the Kit so it can be printed out in the manage table
$item_kit = $this->_add_totals_to_item_kit($item_kit);
$data_rows[] = get_item_kit_data_row($item_kit, $this);
}
$data_rows = $this->xss_clean($data_rows);
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Item_kit->get_search_suggestions($this->input->post('term')));
echo json_encode($suggestions);
}
public function get_row($row_id)
{
// calculate the total cost and retail price of the Kit so it can be added to the table refresh
$item_kit = $this->_add_totals_to_item_kit($this->Item_kit->get_info($row_id));
echo json_encode(get_item_kit_data_row($item_kit, $this));
}
public function view($item_kit_id = -1)
{
$info = $this->Item_kit->get_info($item_kit_id);
foreach(get_object_vars($info) as $property => $value)
{
$info->$property = $this->xss_clean($value);
}
$data['item_kit_info'] = $info;
$items = array();
foreach($this->Item_kit_items->get_info($item_kit_id) as $item_kit_item)
{
$item['name'] = $this->xss_clean($this->Item->get_info($item_kit_item['item_id'])->name);
$item['item_id'] = $this->xss_clean($item_kit_item['item_id']);
$item['quantity'] = $this->xss_clean($item_kit_item['quantity']);
$items[] = $item;
}
$data['item_kit_items'] = $items;
$this->load->view("item_kits/form", $data);
}
public function save($item_kit_id = -1)
{
$item_kit_data = array(
'name' => $this->input->post('name'),
'description' => $this->input->post('description')
);
if($this->Item_kit->save($item_kit_data, $item_kit_id))
{
$success = TRUE;
//New item kit
if ($item_kit_id == -1)
{
$item_kit_id = $item_kit_data['item_kit_id'];
}
if($this->input->post('item_kit_item') != NULL)
{
$item_kit_items = array();
foreach($this->input->post('item_kit_item') as $item_id => $quantity)
{
$item_kit_items[] = array(
'item_id' => $item_id,
'quantity' => $quantity
);
}
$success = $this->Item_kit_items->save($item_kit_items, $item_kit_id);
}
$item_kit_data = $this->xss_clean($item_kit_data);
echo json_encode(array('success' => $success,
'message' => $this->lang->line('item_kits_successful_adding').' '.$item_kit_data['name'], 'id' => $item_kit_id));
}
else//failure
{
$item_kit_data = $this->xss_clean($item_kit_data);
echo json_encode(array('success' => FALSE,
'message' => $this->lang->line('item_kits_error_adding_updating').' '.$item_kit_data['name'], 'id' => -1));
}
}
public function delete()
{
$item_kits_to_delete = $this->xss_clean($this->input->post('ids'));
if($this->Item_kit->delete_list($item_kits_to_delete))
{
echo json_encode(array('success' => TRUE,
'message' => $this->lang->line('item_kits_successful_deleted').' '.count($item_kits_to_delete).' '.$this->lang->line('item_kits_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE,
'message' => $this->lang->line('item_kits_cannot_be_deleted')));
}
}
public function generate_barcodes($item_kit_ids)
{
$this->load->library('barcode_lib');
$result = array();
$item_kit_ids = explode(':', $item_kit_ids);
foreach($item_kit_ids as $item_kid_id)
{
// calculate the total cost and retail price of the Kit so it can be added to the barcode text at the bottom
$item_kit = $this->_add_totals_to_item_kit($this->Item_kit->get_info($item_kid_id));
$item_kid_id = 'KIT '. urldecode($item_kid_id);
$result[] = array('name' => $item_kit->name, 'item_id' => $item_kid_id, 'item_number' => $item_kid_id,
'cost_price' => $item_kit->total_cost_price, 'unit_price' => $item_kit->total_unit_price);
}
$data['items'] = $result;
$barcode_config = $this->barcode_lib->get_barcode_config();
// in case the selected barcode type is not Code39 or Code128 we set by default Code128
// the rationale for this is that EAN codes cannot have strings as seed, so 'KIT ' is not allowed
if($barcode_config['barcode_type'] != 'Code39' && $barcode_config['barcode_type'] != 'Code128')
{
$barcode_config['barcode_type'] = 'Code128';
}
$data['barcode_config'] = $barcode_config;
// display barcodes
$this->load->view("barcodes/barcode_sheet", $data);
}
}
?>

View File

@@ -0,0 +1,742 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Items extends Secure_Controller
{
public function __construct()
{
parent::__construct('items');
$this->load->library('item_lib');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_items_manage_table_headers());
$data['stock_location'] = $this->xss_clean($this->item_lib->get_item_location());
$data['stock_locations'] = $this->xss_clean($this->Stock_location->get_allowed_locations());
// filters that will be loaded in the multiselect dropdown
$data['filters'] = array('empty_upc' => $this->lang->line('items_empty_upc_items'),
'low_inventory' => $this->lang->line('items_low_inventory_items'),
'is_serialized' => $this->lang->line('items_serialized_items'),
'no_description' => $this->lang->line('items_no_description_items'),
'search_custom' => $this->lang->line('items_search_custom_items'),
'is_deleted' => $this->lang->line('items_is_deleted'));
$this->load->view('items/manage', $data);
}
/*
Returns Items table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$this->item_lib->set_item_location($this->input->get('stock_location'));
$filters = array('start_date' => $this->input->get('start_date'),
'end_date' => $this->input->get('end_date'),
'stock_location_id' => $this->item_lib->get_item_location(),
'empty_upc' => FALSE,
'low_inventory' => FALSE,
'is_serialized' => FALSE,
'no_description' => FALSE,
'search_custom' => FALSE,
'is_deleted' => FALSE);
// check if any filter is set in the multiselect dropdown
$filledup = array_fill_keys($this->input->get('filters'), TRUE);
$filters = array_merge($filters, $filledup);
$items = $this->Item->search($search, $filters, $limit, $offset, $sort, $order);
$total_rows = $this->Item->get_found_rows($search, $filters);
$data_rows = array();
foreach($items->result() as $item)
{
$data_rows[] = $this->xss_clean(get_item_data_row($item, $this));
}
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
public function pic_thumb($pic_id)
{
$this->load->helper('file');
$this->load->library('image_lib');
$base_path = './uploads/item_pics/' . $pic_id;
$images = glob($base_path . '.*');
if(sizeof($images) > 0)
{
$image_path = $images[0];
$ext = pathinfo($image_path, PATHINFO_EXTENSION);
$thumb_path = $base_path . $this->image_lib->thumb_marker . '.' . $ext;
if(sizeof($images) < 2)
{
$config['image_library'] = 'gd2';
$config['source_image'] = $image_path;
$config['maintain_ratio'] = TRUE;
$config['create_thumb'] = TRUE;
$config['width'] = 52;
$config['height'] = 32;
$this->image_lib->initialize($config);
$image = $this->image_lib->resize();
$thumb_path = $this->image_lib->full_dst_path;
}
$this->output->set_content_type(get_mime_by_extension($thumb_path));
$this->output->set_output(file_get_contents($thumb_path));
}
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Item->get_search_suggestions($this->input->post_get('term'),
array('search_custom' => $this->input->post('search_custom'), 'is_deleted' => $this->input->post('is_deleted') != NULL), FALSE));
echo json_encode($suggestions);
}
public function suggest()
{
$suggestions = $this->xss_clean($this->Item->get_search_suggestions($this->input->post_get('term'),
array('search_custom' => FALSE, 'is_deleted' => FALSE), TRUE));
echo json_encode($suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_category()
{
$suggestions = $this->xss_clean($this->Item->get_category_suggestions($this->input->get('term')));
echo json_encode($suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_location()
{
$suggestions = $this->xss_clean($this->Item->get_location_suggestions($this->input->get('term')));
echo json_encode($suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest_custom()
{
$suggestions = $this->xss_clean($this->Item->get_custom_suggestions($this->input->post('term'), $this->input->post('field_no')));
echo json_encode($suggestions);
}
public function get_row($item_ids)
{
$item_infos = $this->Item->get_multiple_info(explode(":", $item_ids), $this->item_lib->get_item_location());
$result = array();
foreach($item_infos->result() as $item_info)
{
$result[$item_info->item_id] = $this->xss_clean(get_item_data_row($item_info, $this));
}
echo json_encode($result);
}
public function view($item_id = -1)
{
$data['item_tax_info'] = $this->xss_clean($this->Item_taxes->get_info($item_id));
$data['default_tax_1_rate'] = '';
$data['default_tax_2_rate'] = '';
$item_info = $this->Item->get_info($item_id);
foreach(get_object_vars($item_info) as $property => $value)
{
$item_info->$property = $this->xss_clean($value);
}
if($item_id == -1)
{
$data['default_tax_1_rate'] = $this->config->item('default_tax_1_rate');
$data['default_tax_2_rate'] = $this->config->item('default_tax_2_rate');
$item_info->receiving_quantity = 0;
$item_info->reorder_level = 0;
}
$data['item_info'] = $item_info;
$suppliers = array('' => $this->lang->line('items_none'));
foreach($this->Supplier->get_all()->result_array() as $row)
{
$suppliers[$this->xss_clean($row['person_id'])] = $this->xss_clean($row['company_name']);
}
$data['suppliers'] = $suppliers;
$data['selected_supplier'] = $item_info->supplier_id;
$data['logo_exists'] = $item_info->pic_id != '';
$images = glob('./uploads/item_pics/' . $item_info->pic_id . '.*');
$data['image_path'] = sizeof($images) > 0 ? base_url($images[0]) : '';
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$quantity = ($item_id == -1) ? 0 : $quantity;
$location_array[$location['location_id']] = array('location_name' => $location['location_name'], 'quantity' => $quantity);
$data['stock_locations'] = $location_array;
}
$this->load->view('items/form', $data);
}
public function inventory($item_id = -1)
{
$item_info = $this->Item->get_info($item_id);
foreach(get_object_vars($item_info) as $property => $value)
{
$item_info->$property = $this->xss_clean($value);
}
$data['item_info'] = $item_info;
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$this->load->view('items/form_inventory', $data);
}
public function count_details($item_id = -1)
{
$item_info = $this->Item->get_info($item_id);
foreach(get_object_vars($item_info) as $property => $value)
{
$item_info->$property = $this->xss_clean($value);
}
$data['item_info'] = $item_info;
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$this->load->view('items/form_count_details', $data);
}
public function generate_barcodes($item_ids)
{
$this->load->library('barcode_lib');
$item_ids = explode(':', $item_ids);
$result = $this->Item->get_multiple_info($item_ids, $this->item_lib->get_item_location())->result_array();
$config = $this->barcode_lib->get_barcode_config();
$data['barcode_config'] = $config;
// check the list of items to see if any item_number field is empty
foreach($result as &$item)
{
$item = $this->xss_clean($item);
// update the UPC/EAN/ISBN field if empty / NULL with the newly generated barcode
if(empty($item['item_number']) && $this->config->item('barcode_generate_if_empty'))
{
// get the newly generated barcode
$barcode_instance = Barcode_lib::barcode_instance($item, $config);
$item['item_number'] = $barcode_instance->getData();
$save_item = array('item_number' => $item['item_number']);
// update the item in the database in order to save the UPC/EAN/ISBN field
$this->Item->save($save_item, $item['item_id']);
}
}
$data['items'] = $result;
// display barcodes
$this->load->view('barcodes/barcode_sheet', $data);
}
public function bulk_edit()
{
$suppliers = array('' => $this->lang->line('items_none'));
foreach($this->Supplier->get_all()->result_array() as $row)
{
$row = $this->xss_clean($row);
$suppliers[$row['person_id']] = $row['company_name'];
}
$data['suppliers'] = $suppliers;
$data['allow_alt_description_choices'] = array(
'' => $this->lang->line('items_do_nothing'),
1 => $this->lang->line('items_change_all_to_allow_alt_desc'),
0 => $this->lang->line('items_change_all_to_not_allow_allow_desc'));
$data['serialization_choices'] = array(
'' => $this->lang->line('items_do_nothing'),
1 => $this->lang->line('items_change_all_to_serialized'),
0 => $this->lang->line('items_change_all_to_unserialized'));
$this->load->view('items/form_bulk', $data);
}
public function save($item_id = -1)
{
$upload_success = $this->_handle_image_upload();
$upload_data = $this->upload->data();
//Save item data
$item_data = array(
'name' => $this->input->post('name'),
'description' => $this->input->post('description'),
'category' => $this->input->post('category'),
'supplier_id' => $this->input->post('supplier_id') == '' ? NULL : $this->input->post('supplier_id'),
'item_number' => $this->input->post('item_number') == '' ? NULL : $this->input->post('item_number'),
'cost_price' => parse_decimals($this->input->post('cost_price')),
'unit_price' => parse_decimals($this->input->post('unit_price')),
'reorder_level' => parse_decimals($this->input->post('reorder_level')),
'receiving_quantity' => parse_decimals($this->input->post('receiving_quantity')),
'allow_alt_description' => $this->input->post('allow_alt_description') != NULL,
'is_serialized' => $this->input->post('is_serialized') != NULL,
'deleted' => $this->input->post('is_deleted') != NULL,
'custom1' => $this->input->post('custom1') == NULL ? '' : $this->input->post('custom1'),
'custom2' => $this->input->post('custom2') == NULL ? '' : $this->input->post('custom2'),
'custom3' => $this->input->post('custom3') == NULL ? '' : $this->input->post('custom3'),
'custom4' => $this->input->post('custom4') == NULL ? '' : $this->input->post('custom4'),
'custom5' => $this->input->post('custom5') == NULL ? '' : $this->input->post('custom5'),
'custom6' => $this->input->post('custom6') == NULL ? '' : $this->input->post('custom6'),
'custom7' => $this->input->post('custom7') == NULL ? '' : $this->input->post('custom7'),
'custom8' => $this->input->post('custom8') == NULL ? '' : $this->input->post('custom8'),
'custom9' => $this->input->post('custom9') == NULL ? '' : $this->input->post('custom9'),
'custom10' => $this->input->post('custom10') == NULL ? '' : $this->input->post('custom10')
);
if(!empty($upload_data['orig_name']))
{
// XSS file image sanity check
if($this->xss_clean($upload_data['raw_name'], TRUE) === TRUE)
{
$item_data['pic_id'] = $upload_data['raw_name'];
}
}
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->Item->get_info($item_id);
if($this->Item->save($item_data, $item_id))
{
$success = TRUE;
$new_item = FALSE;
//New item
if($item_id == -1)
{
$item_id = $item_data['item_id'];
$new_item = TRUE;
}
$items_taxes_data = array();
$tax_names = $this->input->post('tax_names');
$tax_percents = $this->input->post('tax_percents');
$count = count($tax_percents);
for ($k = 0; $k < $count; ++$k)
{
$tax_percentage = parse_decimals($tax_percents[$k]);
if(is_numeric($tax_percentage))
{
$items_taxes_data[] = array('name' => $tax_names[$k], 'percent' => $tax_percentage);
}
}
$success &= $this->Item_taxes->save($items_taxes_data, $item_id);
//Save item quantity
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$updated_quantity = parse_decimals($this->input->post('quantity_' . $location['location_id']));
$location_detail = array('item_id' => $item_id,
'location_id' => $location['location_id'],
'quantity' => $updated_quantity);
$item_quantity = $this->Item_quantity->get_item_quantity($item_id, $location['location_id']);
if($item_quantity->quantity != $updated_quantity || $new_item)
{
$success &= $this->Item_quantity->save($location_detail, $item_id, $location['location_id']);
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $location['location_id'],
'trans_comment' => $this->lang->line('items_manually_editing_of_quantity'),
'trans_inventory' => $updated_quantity - $item_quantity->quantity
);
$success &= $this->Inventory->insert($inv_data);
}
}
if($success && $upload_success)
{
$message = $this->xss_clean($this->lang->line('items_successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name']);
echo json_encode(array('success' => TRUE, 'message' => $message, 'id' => $item_id));
}
else
{
$message = $this->xss_clean($upload_success ? $this->lang->line('items_error_adding_updating') . ' ' . $item_data['name'] : strip_tags($this->upload->display_errors()));
echo json_encode(array('success' => FALSE, 'message' => $message, 'id' => $item_id));
}
}
else//failure
{
$message = $this->xss_clean($this->lang->line('items_error_adding_updating') . ' ' . $item_data['name']);
echo json_encode(array('success' => FALSE, 'message' => $message, 'id' => -1));
}
}
public function check_item_number()
{
$exists = $this->Item->item_number_exists($this->input->post('item_number'), $this->input->post('item_id'));
echo !$exists ? 'true' : 'false';
}
private function _handle_image_upload()
{
$this->load->helper('directory');
$map = directory_map('./uploads/item_pics/', 1);
// load upload library
$config = array('upload_path' => './uploads/item_pics/',
'allowed_types' => 'gif|jpg|png',
'max_size' => '100',
'max_width' => '640',
'max_height' => '480',
'file_name' => sizeof($map) + 1
);
$this->load->library('upload', $config);
$this->upload->do_upload('item_image');
return strlen($this->upload->display_errors()) == 0 || !strcmp($this->upload->display_errors(), '<p>'.$this->lang->line('upload_no_file_selected').'</p>');
}
public function remove_logo($item_id)
{
$item_data = array('pic_id' => NULL);
$result = $this->Item->save($item_data, $item_id);
echo json_encode(array('success' => $result));
}
public function save_inventory($item_id = -1)
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->Item->get_info($item_id);
$location_id = $this->input->post('stock_location');
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $location_id,
'trans_comment' => $this->input->post('trans_comment'),
'trans_inventory' => parse_decimals($this->input->post('newquantity'))
);
$this->Inventory->insert($inv_data);
//Update stock quantity
$item_quantity = $this->Item_quantity->get_item_quantity($item_id, $location_id);
$item_quantity_data = array(
'item_id' => $item_id,
'location_id' => $location_id,
'quantity' => $item_quantity->quantity + parse_decimals($this->input->post('newquantity'))
);
if($this->Item_quantity->save($item_quantity_data, $item_id, $location_id))
{
$message = $this->xss_clean($this->lang->line('items_successful_updating') . ' ' . $cur_item_info->name);
echo json_encode(array('success' => TRUE, 'message' => $message, 'id' => $item_id));
}
else//failure
{
$message = $this->xss_clean($this->lang->line('items_error_adding_updating') . ' ' . $cur_item_info->name);
echo json_encode(array('success' => FALSE, 'message' => $message, 'id' => -1));
}
}
public function bulk_update()
{
$items_to_update = $this->input->post('item_ids');
$item_data = array();
foreach($_POST as $key => $value)
{
//This field is nullable, so treat it differently
if($key == 'supplier_id' && $value != '')
{
$item_data["$key"] = $value;
}
elseif($value != '' && !(in_array($key, array('item_ids', 'tax_names', 'tax_percents'))))
{
$item_data["$key"] = $value;
}
}
//Item data could be empty if tax information is being updated
if(empty($item_data) || $this->Item->update_multiple($item_data, $items_to_update))
{
$items_taxes_data = array();
$tax_names = $this->input->post('tax_names');
$tax_percents = $this->input->post('tax_percents');
$tax_updated = FALSE;
$count = count($tax_percents);
for ($k = 0; $k < $count; ++$k)
{
if(!empty($tax_names[$k]) && is_numeric($tax_percents[$k]))
{
$tax_updated = TRUE;
$items_taxes_data[] = array('name' => $tax_names[$k], 'percent' => $tax_percents[$k]);
}
}
if($tax_updated)
{
$this->Item_taxes->save_multiple($items_taxes_data, $items_to_update);
}
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('items_successful_bulk_edit'), 'id' => $this->xss_clean($items_to_update)));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_error_updating_multiple')));
}
}
public function delete()
{
$items_to_delete = $this->input->post('ids');
if($this->Item->delete_list($items_to_delete))
{
$message = $this->lang->line('items_successful_deleted') . ' ' . count($items_to_delete) . ' ' . $this->lang->line('items_one_or_multiple');
echo json_encode(array('success' => TRUE, 'message' => $message));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_cannot_be_deleted')));
}
}
/*
Items import from excel spreadsheet
*/
public function excel()
{
$name = 'import_items.csv';
$data = file_get_contents('../' . $name);
force_download($name, $data);
}
public function excel_import()
{
$this->load->view('items/form_excel_import', NULL);
}
public function do_excel_import()
{
if($_FILES['file_path']['error'] != UPLOAD_ERR_OK)
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_failed')));
}
else
{
if(($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== FALSE)
{
// Skip the first row as it's the table description
fgetcsv($handle);
$i = 1;
$failCodes = array();
while(($data = fgetcsv($handle)) !== FALSE)
{
// XSS file data sanity check
$data = $this->xss_clean($data);
if(sizeof($data) >= 23)
{
$item_data = array(
'name' => $data[1],
'description' => $data[11],
'category' => $data[2],
'cost_price' => $data[4],
'unit_price' => $data[5],
'reorder_level' => $data[10],
'supplier_id' => $this->Supplier->exists($data[3]) ? $data[3] : NULL,
'allow_alt_description' => $data[12] != '' ? '1' : '0',
'is_serialized' => $data[13] != '' ? '1' : '0',
'custom1' => $data[14],
'custom2' => $data[15],
'custom3' => $data[16],
'custom4' => $data[17],
'custom5' => $data[18],
'custom6' => $data[19],
'custom7' => $data[20],
'custom8' => $data[21],
'custom9' => $data[22],
'custom10' => $data[23]
);
$item_number = $data[0];
$invalidated = FALSE;
if($item_number != '')
{
$item_data['item_number'] = $item_number;
$invalidated = $this->Item->item_number_exists($item_number);
}
}
else
{
$invalidated = TRUE;
}
if(!$invalidated && $this->Item->save($item_data))
{
$items_taxes_data = NULL;
//tax 1
if(is_numeric($data[7]) && $data[6] != '')
{
$items_taxes_data[] = array('name' => $data[6], 'percent' => $data[7] );
}
//tax 2
if(is_numeric($data[9]) && $data[8] != '')
{
$items_taxes_data[] = array('name' => $data[8], 'percent' => $data[9] );
}
// save tax values
if(count($items_taxes_data) > 0)
{
$this->Item_taxes->save($items_taxes_data, $item_data['item_id']);
}
// quantities & inventory Info
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$emp_info = $this->Employee->get_info($employee_id);
$comment ='Qty CSV Imported';
$cols = count($data);
// array to store information if location got a quantity
$allowed_locations = $this->Stock_location->get_allowed_locations();
for ($col = 24; $col < $cols; $col = $col + 2)
{
$location_id = $data[$col];
if(array_key_exists($location_id, $allowed_locations))
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => $data[$col + 1],
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $location_id);
$excel_data = array(
'trans_items' => $item_data['item_id'],
'trans_user' => $employee_id,
'trans_comment' => $comment,
'trans_location' => $data[$col],
'trans_inventory' => $data[$col + 1]
);
$this->Inventory->insert($excel_data);
unset($allowed_locations[$location_id]);
}
}
/*
* now iterate through the array and check for which location_id no entry into item_quantities was made yet
* those get an entry with quantity as 0.
* unfortunately a bit duplicate code from above...
*/
foreach($allowed_locations as $location_id => $location_name)
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => 0,
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $data[$col]);
$excel_data = array(
'trans_items' => $item_data['item_id'],
'trans_user' => $employee_id,
'trans_comment' => $comment,
'trans_location' => $location_id,
'trans_inventory' => 0
);
$this->Inventory->insert($excel_data);
}
}
else //insert or update item failure
{
$failCodes[] = $i;
}
++$i;
}
if(count($failCodes) > 0)
{
$message = $this->lang->line('items_excel_import_partially_failed') . ' (' . count($failCodes) . '): ' . implode(', ', $failCodes);
echo json_encode(array('success' => FALSE, 'message' => $message));
}
else
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('items_excel_import_success')));
}
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_nodata_wrongformat')));
}
}
}
}
?>

View File

@@ -0,0 +1,76 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Login extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
if($this->Employee->is_logged_in())
{
redirect('home');
}
else
{
$this->form_validation->set_rules('username', 'lang:login_undername', 'callback_login_check');
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
if($this->form_validation->run() == FALSE)
{
$this->load->view('login');
}
else
{
if($this->config->item('statistics'))
{
$this->load->library('tracking_lib');
$this->tracking_lib->track_page('login', 'login');
$this->tracking_lib->track_event('Stats', 'Theme', $this->config->item('theme'));
$this->tracking_lib->track_event('Stats', 'Language', $this->config->item('language'));
$this->tracking_lib->track_event('Stats', 'Timezone', $this->config->item('timezone'));
$this->tracking_lib->track_event('Stats', 'Currency', $this->config->item('currency_symbol'));
$this->tracking_lib->track_event('Stats', 'Tax Included', $this->config->item('tax_included'));
$this->tracking_lib->track_event('Stats', 'Thousands Separator', $this->config->item('thousands_separator'));
$this->tracking_lib->track_event('Stats', 'Currency Decimals', $this->config->item('currency_decimals'));
$this->tracking_lib->track_event('Stats', 'Tax Decimals', $this->config->item('tax_decimals'));
$this->tracking_lib->track_event('Stats', 'Quantity Decimals', $this->config->item('quantity_decimals'));
$this->tracking_lib->track_event('Stats', 'Invoice Enable', $this->config->item('invoice_enable'));
}
redirect('home');
}
}
}
public function login_check($username)
{
$password = $this->input->post('password');
if($this->_security_check($username, $password))
{
$this->form_validation->set_message('login_check', 'Security check failure');
return FALSE;
}
if(!$this->Employee->login($username, $password))
{
$this->form_validation->set_message('login_check', $this->lang->line('login_invalid_username_and_password'));
return FALSE;
}
return TRUE;
}
private function _security_check($username, $password)
{
return preg_match('~\b(Copyright|(c)|<7C>|All rights reserved|Developed|Crafted|Implemented|Made|Powered|Code|Design|unblockUI|blockUI|blockOverlay|hide|opacity)\b~i', file_get_contents(APPPATH . 'views/partial/footer.php'));
}
}
?>

View File

@@ -0,0 +1,65 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Messages extends Secure_Controller
{
public function __construct()
{
parent::__construct('messages');
$this->load->library('sms_lib');
}
public function index()
{
$this->load->view('messages/sms');
}
public function view($person_id = -1)
{
$info = $this->Person->get_info($person_id);
foreach(get_object_vars($info) as $property => $value)
{
$info->$property = $this->xss_clean($value);
}
$data['person_info'] = $info;
$this->load->view('messages/form_sms', $data);
}
public function send()
{
$phone = $this->input->post('phone');
$message = $this->input->post('message');
$response = $this->sms_lib->sendSMS($phone, $message);
if($response)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('messages_successfully_sent') . ' ' . $phone));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('messages_unsuccessfully_sent') . ' ' . $phone));
}
}
public function send_form($person_id = -1)
{
$phone = $this->input->post('phone');
$message = $this->input->post('message');
$response = $this->sms_lib->sendSMS($phone, $message);
if($response)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('messages_successfully_sent') . ' ' . $phone, 'person_id' => $this->xss_clean($person_id)));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('messages_unsuccessfully_sent') . ' ' . $phone, 'person_id' => -1));
}
}
}
?>

View File

@@ -0,0 +1,20 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class No_Access extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
public function index($module_id = '', $permission_id = '')
{
$data['module_name'] = $this->Module->get_module_name($module_id);
$data['permission_id'] = $permission_id;
$data = $this->security->xss_clean($data);
$this->load->view('no_access', $data);
}
}
?>

View File

@@ -0,0 +1,32 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
abstract class Persons extends Secure_Controller
{
public function __construct($module_id = NULL)
{
parent::__construct($module_id);
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest()
{
$suggestions = $this->xss_clean($this->Person->get_search_suggestions($this->input->post('term')));
echo json_encode($suggestions);
}
/*
Gets one row for a person manage table. This is called using AJAX to update one row.
*/
public function get_row($row_id)
{
$data_row = $this->xss_clean(get_person_data_row($this->Person->get_info($row_id), $this));
echo json_encode($data_row);
}
}
?>

View File

@@ -0,0 +1,393 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Receivings extends Secure_Controller
{
public function __construct()
{
parent::__construct('receivings');
$this->load->library('receiving_lib');
$this->load->library('barcode_lib');
}
public function index()
{
$this->_reload();
}
public function item_search()
{
$suggestions = $this->Item->get_search_suggestions($this->input->get('term'), array('search_custom' => FALSE, 'is_deleted' => FALSE), TRUE);
$suggestions = array_merge($suggestions, $this->Item_kit->get_search_suggestions($this->input->get('term')));
$suggestions = $this->xss_clean($suggestions);
echo json_encode($suggestions);
}
public function select_supplier()
{
$supplier_id = $this->input->post('supplier');
if($this->Supplier->exists($supplier_id))
{
$this->receiving_lib->set_supplier($supplier_id);
}
$this->_reload();
}
public function change_mode()
{
$stock_destination = $this->input->post('stock_destination');
$stock_source = $this->input->post('stock_source');
if((!$stock_source || $stock_source == $this->receiving_lib->get_stock_source()) &&
(!$stock_destination || $stock_destination == $this->receiving_lib->get_stock_destination()))
{
$this->receiving_lib->clear_reference();
$mode = $this->input->post('mode');
$this->receiving_lib->set_mode($mode);
}
elseif($this->Stock_location->is_allowed_location($stock_source, 'receivings'))
{
$this->receiving_lib->set_stock_source($stock_source);
$this->receiving_lib->set_stock_destination($stock_destination);
}
$this->_reload();
}
public function set_comment()
{
$this->receiving_lib->set_comment($this->input->post('comment'));
}
public function set_print_after_sale()
{
$this->receiving_lib->set_print_after_sale($this->input->post('recv_print_after_sale'));
}
public function set_reference()
{
$this->receiving_lib->set_reference($this->input->post('recv_reference'));
}
public function add()
{
$data = array();
$mode = $this->receiving_lib->get_mode();
$item_id_or_number_or_item_kit_or_receipt = $this->input->post('item');
$quantity = ($mode == 'receive' || $mode == 'requisition') ? 1 : -1;
$item_location = $this->receiving_lib->get_stock_source();
if($mode == 'return' && $this->Receiving->is_valid_receipt($item_id_or_number_or_item_kit_or_receipt))
{
$this->receiving_lib->return_entire_receiving($item_id_or_number_or_item_kit_or_receipt);
}
elseif($this->Item_kit->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt))
{
$this->receiving_lib->add_item_kit($item_id_or_number_or_item_kit_or_receipt, $item_location);
}
elseif(!$this->receiving_lib->add_item($item_id_or_number_or_item_kit_or_receipt, $quantity, $item_location))
{
$data['error'] = $this->lang->line('receivings_unable_to_add_item');
}
$this->_reload($data);
}
public function edit_item($item_id)
{
$data = array();
$this->form_validation->set_rules('price', 'lang:items_price', 'required|callback_numeric');
$this->form_validation->set_rules('quantity', 'lang:items_quantity', 'required|callback_numeric');
$this->form_validation->set_rules('discount', 'lang:items_discount', 'required|callback_numeric');
$description = $this->input->post('description');
$serialnumber = $this->input->post('serialnumber');
$price = parse_decimals($this->input->post('price'));
$quantity = parse_decimals($this->input->post('quantity'));
$discount = parse_decimals($this->input->post('discount'));
$item_location = $this->input->post('location');
if($this->form_validation->run() != FALSE)
{
$this->receiving_lib->edit_item($item_id, $description, $serialnumber, $quantity, $discount, $price);
}
else
{
$data['error']=$this->lang->line('receivings_error_editing_item');
}
$this->_reload($data);
}
public function edit($receiving_id)
{
$data = array();
$data['suppliers'] = array('' => 'No Supplier');
foreach($this->Supplier->get_all()->result() as $supplier)
{
$data['suppliers'][$supplier->person_id] = $this->xss_clean($supplier->first_name . ' ' . $supplier->last_name);
}
$data['employees'] = array();
foreach ($this->Employee->get_all()->result() as $employee)
{
$data['employees'][$employee->person_id] = $this->xss_clean($employee->first_name . ' '. $employee->last_name);
}
$receiving_info = $this->xss_clean($this->Receiving->get_info($receiving_id)->row_array());
$data['selected_supplier_name'] = !empty($receiving_info['supplier_id']) ? $receiving_info['company_name'] : '';
$data['selected_supplier_id'] = $receiving_info['supplier_id'];
$data['receiving_info'] = $receiving_info;
$this->load->view('receivings/form', $data);
}
public function delete_item($item_number)
{
$this->receiving_lib->delete_item($item_number);
$this->_reload();
}
public function delete($receiving_id = -1, $update_inventory = TRUE)
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$receiving_ids = $receiving_id == -1 ? $this->input->post('ids') : array($receiving_id);
if($this->Receiving->delete_list($receiving_ids, $employee_id, $update_inventory))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('receivings_successfully_deleted') . ' ' .
count($receiving_ids) . ' ' . $this->lang->line('receivings_one_or_multiple'), 'ids' => $receiving_ids));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('receivings_cannot_be_deleted')));
}
}
public function remove_supplier()
{
$this->receiving_lib->clear_reference();
$this->receiving_lib->remove_supplier();
$this->_reload();
}
public function complete()
{
$data = array();
$data['cart'] = $this->receiving_lib->get_cart();
$data['total'] = $this->receiving_lib->get_total();
$data['receipt_title'] = $this->lang->line('receivings_receipt');
$data['transaction_time'] = date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'));
$data['mode'] = $this->receiving_lib->get_mode();
$data['comment'] = $this->receiving_lib->get_comment();
$data['reference'] = $this->receiving_lib->get_reference();
$data['payment_type'] = $this->input->post('payment_type');
$data['show_stock_locations'] = $this->Stock_location->show_locations('receivings');
$data['stock_location'] = $this->receiving_lib->get_stock_source();
if($this->input->post('amount_tendered') != NULL)
{
$data['amount_tendered'] = $this->input->post('amount_tendered');
$data['amount_change'] = to_currency($data['amount_tendered'] - $data['total']);
}
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$employee_info = $this->Employee->get_info($employee_id);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_info = '';
$supplier_id = $this->receiving_lib->get_supplier();
if($supplier_id != -1)
{
$supplier_info = $this->Supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email;
$data['supplier_address'] = $supplier_info->address_1;
if(!empty($supplier_info->zip) or !empty($supplier_info->city))
{
$data['supplier_location'] = $supplier_info->zip . ' ' . $supplier_info->city;
}
else
{
$data['supplier_location'] = '';
}
}
//SAVE receiving to database
$data['receiving_id'] = 'RECV ' . $this->Receiving->save($data['cart'], $supplier_id, $employee_id, $data['comment'], $data['reference'], $data['payment_type'], $data['stock_location']);
$data = $this->xss_clean($data);
if($data['receiving_id'] == 'RECV -1')
{
$data['error_message'] = $this->lang->line('receivings_transaction_failed');
}
else
{
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
}
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
$this->load->view("receivings/receipt",$data);
$this->receiving_lib->clear_all();
}
public function requisition_complete()
{
if($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination())
{
foreach($this->receiving_lib->get_cart() as $item)
{
$this->receiving_lib->delete_item($item['line']);
$this->receiving_lib->add_item($item['item_id'], $item['quantity'], $this->receiving_lib->get_stock_destination());
$this->receiving_lib->add_item($item['item_id'], -$item['quantity'], $this->receiving_lib->get_stock_source());
}
$this->complete();
}
else
{
$data['error'] = $this->lang->line('receivings_error_requisition');
$this->_reload($data);
}
}
public function receipt($receiving_id)
{
$receiving_info = $this->Receiving->get_info($receiving_id)->row_array();
$this->receiving_lib->copy_entire_receiving($receiving_id);
$data['cart'] = $this->receiving_lib->get_cart();
$data['total'] = $this->receiving_lib->get_total();
$data['mode'] = $this->receiving_lib->get_mode();
$data['receipt_title'] = $this->lang->line('receivings_receipt');
$data['transaction_time'] = date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($receiving_info['receiving_time']));
$data['show_stock_locations'] = $this->Stock_location->show_locations('receivings');
$data['payment_type'] = $receiving_info['payment_type'];
$data['reference'] = $this->receiving_lib->get_reference();
$data['receiving_id'] = 'RECV ' . $receiving_id;
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
$employee_info = $this->Employee->get_info($receiving_info['employee_id']);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_id = $this->receiving_lib->get_supplier();
if($supplier_id != -1)
{
$supplier_info = $this->Supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email;
$data['supplier_address'] = $supplier_info->address_1;
if(!empty($supplier_info->zip) or !empty($supplier_info->city))
{
$data['supplier_location'] = $supplier_info->zip . ' ' . $supplier_info->city;
}
else
{
$data['supplier_location'] = '';
}
}
$data['print_after_sale'] = FALSE;
$data = $this->xss_clean($data);
$this->load->view("receivings/receipt", $data);
$this->receiving_lib->clear_all();
}
private function _reload($data = array())
{
$data['cart'] = $this->receiving_lib->get_cart();
$data['modes'] = array('receive' => $this->lang->line('receivings_receiving'), 'return' => $this->lang->line('receivings_return'));
$data['mode'] = $this->receiving_lib->get_mode();
$data['stock_locations'] = $this->Stock_location->get_allowed_locations('receivings');
$data['show_stock_locations'] = count($data['stock_locations']) > 1;
if($data['show_stock_locations'])
{
$data['modes']['requisition'] = $this->lang->line('receivings_requisition');
$data['stock_source'] = $this->receiving_lib->get_stock_source();
$data['stock_destination'] = $this->receiving_lib->get_stock_destination();
}
$data['total'] = $this->receiving_lib->get_total();
$data['items_module_allowed'] = $this->Employee->has_grant('items', $this->Employee->get_logged_in_employee_info()->person_id);
$data['comment'] = $this->receiving_lib->get_comment();
$data['reference'] = $this->receiving_lib->get_reference();
$data['payment_options'] = $this->Receiving->get_payment_options();
$supplier_id = $this->receiving_lib->get_supplier();
$supplier_info = '';
if($supplier_id != -1)
{
$supplier_info = $this->Supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email;
$data['supplier_address'] = $supplier_info->address_1;
if(!empty($supplier_info->zip) or !empty($supplier_info->city))
{
$data['supplier_location'] = $supplier_info->zip . ' ' . $supplier_info->city;
}
else
{
$data['supplier_location'] = '';
}
}
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
$data = $this->xss_clean($data);
$this->load->view("receivings/receiving", $data);
}
public function save($receiving_id = -1)
{
$newdate = $this->input->post('date');
$date_formatter = date_create_from_format($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), $newdate);
$receiving_data = array(
'receiving_time' => $date_formatter->format('Y-m-d H:i:s'),
'supplier_id' => $this->input->post('supplier_id') ? $this->input->post('supplier_id') : NULL,
'employee_id' => $this->input->post('employee_id'),
'comment' => $this->input->post('comment'),
'reference' => $this->input->post('reference') != '' ? $this->input->post('reference') : NULL
);
if($this->Receiving->update($receiving_data, $receiving_id))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('receivings_successfully_updated'), 'id' => $receiving_id));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('receivings_unsuccessfully_updated'), 'id' => $receiving_id));
}
}
public function cancel_receiving()
{
$this->receiving_lib->clear_all();
$this->_reload();
}
}
?>

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,849 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Sales extends Secure_Controller
{
public function __construct()
{
parent::__construct('sales');
$this->load->library('sale_lib');
$this->load->library('barcode_lib');
$this->load->library('email_lib');
}
public function index()
{
$this->_reload();
}
public function manage()
{
$person_id = $this->session->userdata('person_id');
if(!$this->Employee->has_grant('reports_sales', $person_id))
{
redirect('no_access/sales/reports_sales');
}
else
{
$data['table_headers'] = get_sales_manage_table_headers();
// filters that will be loaded in the multiselect dropdown
if($this->config->item('invoice_enable') == TRUE)
{
$data['filters'] = array('only_cash' => $this->lang->line('sales_cash_filter'),
'only_invoices' => $this->lang->line('sales_invoice_filter'));
}
else
{
$data['filters'] = array('only_cash' => $this->lang->line('sales_cash_filter'));
}
$this->load->view('sales/manage', $data);
}
}
public function get_row($row_id)
{
$sale_info = $this->Sale->get_info($row_id)->row();
$data_row = $this->xss_clean(get_sale_data_row($sale_info, $this));
echo json_encode($data_row);
}
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$filters = array('sale_type' => 'all',
'location_id' => 'all',
'start_date' => $this->input->get('start_date'),
'end_date' => $this->input->get('end_date'),
'only_cash' => FALSE,
'only_invoices' => $this->config->item('invoice_enable') && $this->input->get('only_invoices'),
'is_valid_receipt' => $this->Sale->is_valid_receipt($search));
// check if any filter is set in the multiselect dropdown
$filledup = array_fill_keys($this->input->get('filters'), TRUE);
$filters = array_merge($filters, $filledup);
$sales = $this->Sale->search($search, $filters, $limit, $offset, $sort, $order);
$total_rows = $this->Sale->get_found_rows($search, $filters);
$payments = $this->Sale->get_payments_summary($search, $filters);
$payment_summary = $this->xss_clean(get_sales_manage_payments_summary($payments, $sales, $this));
$data_rows = array();
foreach($sales->result() as $sale)
{
$data_rows[] = $this->xss_clean(get_sale_data_row($sale, $this));
}
if($total_rows > 0)
{
$data_rows[] = $this->xss_clean(get_sale_data_last_row($sales, $this));
}
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary));
}
public function item_search()
{
$suggestions = array();
$receipt = $search = $this->input->get('term') != '' ? $this->input->get('term') : NULL;
if($this->sale_lib->get_mode() == 'return' && $this->Sale->is_valid_receipt($receipt))
{
// if a valid receipt or invoice was found the search term will be replaced with a receipt number (POS #)
$suggestions[] = $receipt;
}
$suggestions = array_merge($suggestions, $this->Item->get_search_suggestions($search, array('search_custom' => FALSE, 'is_deleted' => FALSE), TRUE));
$suggestions = array_merge($suggestions, $this->Item_kit->get_search_suggestions($search));
$suggestions = $this->xss_clean($suggestions);
echo json_encode($suggestions);
}
public function suggest_search()
{
$search = $this->input->post('term') != '' ? $this->input->post('term') : NULL;
$suggestions = $this->xss_clean($this->Sale->get_search_suggestions($search));
echo json_encode($suggestions);
}
public function select_customer()
{
$customer_id = $this->input->post('customer');
if($this->Customer->exists($customer_id))
{
$this->sale_lib->set_customer($customer_id);
$discount_percent = $this->Customer->get_info($customer_id)->discount_percent;
// apply customer default discount to items that have 0 discount
if($discount_percent != '')
{
$this->sale_lib->apply_customer_discount($discount_percent);
}
}
$this->_reload();
}
public function change_mode()
{
$stock_location = $this->input->post('stock_location');
if (!$stock_location || $stock_location == $this->sale_lib->get_sale_location())
{
$mode = $this->input->post('mode');
$this->sale_lib->set_mode($mode);
}
elseif($this->Stock_location->is_allowed_location($stock_location, 'sales'))
{
$this->sale_lib->set_sale_location($stock_location);
}
$this->_reload();
}
public function set_comment()
{
$this->sale_lib->set_comment($this->input->post('comment'));
}
public function set_invoice_number()
{
$this->sale_lib->set_invoice_number($this->input->post('sales_invoice_number'));
}
public function set_invoice_number_enabled()
{
$this->sale_lib->set_invoice_number_enabled($this->input->post('sales_invoice_number_enabled'));
}
public function set_print_after_sale()
{
$this->sale_lib->set_print_after_sale($this->input->post('sales_print_after_sale'));
}
public function set_email_receipt()
{
$this->sale_lib->set_email_receipt($this->input->post('email_receipt'));
}
// Multiple Payments
public function add_payment()
{
$data = array();
$this->form_validation->set_rules('amount_tendered', 'lang:sales_amount_tendered', 'trim|required|callback_numeric');
$payment_type = $this->input->post('payment_type');
if($this->form_validation->run() == FALSE)
{
if($payment_type == $this->lang->line('sales_giftcard'))
{
$data['error'] = $this->lang->line('sales_must_enter_numeric_giftcard');
}
else
{
$data['error'] = $this->lang->line('sales_must_enter_numeric');
}
}
else
{
if($payment_type == $this->lang->line('sales_giftcard'))
{
// in case of giftcard payment the register input amount_tendered becomes the giftcard number
$giftcard_num = $this->input->post('amount_tendered');
$payments = $this->sale_lib->get_payments();
$payment_type = $payment_type . ':' . $giftcard_num;
$current_payments_with_giftcard = isset($payments[$payment_type]) ? $payments[$payment_type]['payment_amount'] : 0;
$cur_giftcard_value = $this->Giftcard->get_giftcard_value($giftcard_num);
if(($cur_giftcard_value - $current_payments_with_giftcard) <= 0)
{
$data['error'] = $this->lang->line('giftcards_remaining_balance', $giftcard_num, to_currency($cur_giftcard_value));
}
else
{
$new_giftcard_value = $this->Giftcard->get_giftcard_value($giftcard_num) - $this->sale_lib->get_amount_due();
$new_giftcard_value = $new_giftcard_value >= 0 ? $new_giftcard_value : 0;
$this->sale_lib->set_giftcard_remainder($new_giftcard_value);
$new_giftcard_value = str_replace('$', '\$', to_currency($new_giftcard_value));
$data['warning'] = $this->lang->line('giftcards_remaining_balance', $giftcard_num, $new_giftcard_value);
$amount_tendered = min( $this->sale_lib->get_amount_due(), $this->Giftcard->get_giftcard_value($giftcard_num) );
$this->sale_lib->add_payment($payment_type, $amount_tendered);
}
}
else
{
$amount_tendered = $this->input->post('amount_tendered');
$this->sale_lib->add_payment($payment_type, $amount_tendered);
}
}
$this->_reload($data);
}
// Multiple Payments
public function delete_payment($payment_id)
{
$this->sale_lib->delete_payment($payment_id);
$this->_reload();
}
public function add()
{
$data = array();
$discount = 0;
// check if any discount is assigned to the selected customer
$customer_id = $this->sale_lib->get_customer();
if($customer_id != -1)
{
// load the customer discount if any
$discount_percent = $this->Customer->get_info($customer_id)->discount_percent;
if($discount_percent != '')
{
$discount = $discount_percent;
}
}
// if the customer discount is 0 or no customer is selected apply the default sales discount
if($discount == 0)
{
$discount = $this->config->item('default_sales_discount');
}
$mode = $this->sale_lib->get_mode();
$quantity = ($mode == 'return') ? -1 : 1;
$item_location = $this->sale_lib->get_sale_location();
$item_id_or_number_or_item_kit_or_receipt = $this->input->post('item');
if($mode == 'return' && $this->Sale->is_valid_receipt($item_id_or_number_or_item_kit_or_receipt))
{
$this->sale_lib->return_entire_sale($item_id_or_number_or_item_kit_or_receipt);
}
elseif($this->Item_kit->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt))
{
if(!$this->sale_lib->add_item_kit($item_id_or_number_or_item_kit_or_receipt, $item_location, $discount))
{
$data['error'] = $this->lang->line('sales_unable_to_add_item');
}
}
else
{
if(!$this->sale_lib->add_item($item_id_or_number_or_item_kit_or_receipt, $quantity, $item_location, $discount))
{
$data['error'] = $this->lang->line('sales_unable_to_add_item');
}
else
{
$data['warning'] = $this->sale_lib->out_of_stock($item_id_or_number_or_item_kit_or_receipt, $item_location);
}
}
$this->_reload($data);
}
public function edit_item($item_id)
{
$data = array();
$this->form_validation->set_rules('price', 'lang:items_price', 'required|callback_numeric');
$this->form_validation->set_rules('quantity', 'lang:items_quantity', 'required|callback_numeric');
$this->form_validation->set_rules('discount', 'lang:items_discount', 'required|callback_numeric');
$description = $this->input->post('description');
$serialnumber = $this->input->post('serialnumber');
$price = parse_decimals($this->input->post('price'));
$quantity = parse_decimals($this->input->post('quantity'));
$discount = parse_decimals($this->input->post('discount'));
$item_location = $this->input->post('location');
if($this->form_validation->run() != FALSE)
{
$this->sale_lib->edit_item($item_id, $description, $serialnumber, $quantity, $discount, $price);
}
else
{
$data['error'] = $this->lang->line('sales_error_editing_item');
}
$data['warning'] = $this->sale_lib->out_of_stock($this->sale_lib->get_item_id($item_id), $item_location);
$this->_reload($data);
}
public function delete_item($item_number)
{
$this->sale_lib->delete_item($item_number);
$this->_reload();
}
public function remove_customer()
{
$this->sale_lib->clear_giftcard_remainder();
$this->sale_lib->clear_invoice_number();
$this->sale_lib->remove_customer();
$this->_reload();
}
public function complete()
{
$data = array();
$data['cart'] = $this->sale_lib->get_cart();
$data['subtotal'] = $this->sale_lib->get_subtotal();
$data['discounted_subtotal'] = $this->sale_lib->get_subtotal(TRUE);
$data['tax_exclusive_subtotal'] = $this->sale_lib->get_subtotal(TRUE, TRUE);
$data['taxes'] = $this->sale_lib->get_taxes();
$data['total'] = $this->sale_lib->get_total();
$data['discount'] = $this->sale_lib->get_discount();
$data['receipt_title'] = $this->lang->line('sales_receipt');
$data['transaction_time'] = date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'));
$data['transaction_date'] = date($this->config->item('dateformat'));
$data['show_stock_locations'] = $this->Stock_location->show_locations('sales');
$data['comments'] = $this->sale_lib->get_comment();
$data['payments'] = $this->sale_lib->get_payments();
$data['amount_change'] = $this->sale_lib->get_amount_due() * -1;
$data['amount_due'] = $this->sale_lib->get_amount_due();
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$employee_info = $this->Employee->get_info($employee_id);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$data['company_info'] = implode("\n", array(
$this->config->item('address'),
$this->config->item('phone'),
$this->config->item('account_number')
));
$customer_id = $this->sale_lib->get_customer();
$customer_info = $this->_load_customer_data($customer_id, $data);
$invoice_number = $this->_substitute_invoice_number($customer_info);
if($this->sale_lib->is_invoice_number_enabled() && $this->Sale->check_invoice_number_exists($invoice_number))
{
$data['error'] = $this->lang->line('sales_invoice_number_duplicate');
$this->_reload($data);
}
else
{
$invoice_number = $this->sale_lib->is_invoice_number_enabled() ? $invoice_number : NULL;
$data['invoice_number'] = $invoice_number;
$data['sale_id_num'] = $this->Sale->save($data['cart'], $customer_id, $employee_id, $data['comments'], $invoice_number, $data['payments']);
$data['sale_id'] = 'POS ' . $data['sale_id_num'];
$data = $this->xss_clean($data);
if($data['sale_id_num'] == -1)
{
$data['error_message'] = $this->lang->line('sales_transaction_failed');
}
else
{
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
}
$data['cur_giftcard_value'] = $this->sale_lib->get_giftcard_remainder();
$data['print_after_sale'] = $this->sale_lib->is_print_after_sale();
$data['email_receipt'] = $this->sale_lib->get_email_receipt();
if($this->sale_lib->is_invoice_number_enabled())
{
$this->load->view('sales/invoice', $data);
}
else
{
$this->load->view('sales/receipt', $data);
}
$this->sale_lib->clear_all();
}
}
public function send_invoice($sale_id)
{
$sale_data = $this->_load_sale_data($sale_id);
$result = FALSE;
$message = $this->lang->line('sales_invoice_no_email');
if(!empty($sale_data['customer_email']))
{
$to = $sale_data['customer_email'];
$subject = $this->lang->line('sales_invoice') . ' ' . $sale_data['invoice_number'];
$text = $this->config->item('invoice_email_message');
$text = str_replace('$INV', $sale_data['invoice_number'], $text);
$text = str_replace('$CO', 'POS ' . $sale_data['sale_id'], $text);
$text = $this->_substitute_customer($text, (object) $sale_data);
// generate email attachment: invoice in pdf format
$html = $this->load->view('sales/invoice_email', $sale_data, TRUE);
// load pdf helper
$this->load->helper(array('dompdf', 'file'));
$filename = sys_get_temp_dir() . '/' . $this->lang->line('sales_invoice') . '-' . str_replace('/', '-' , $sale_data['invoice_number']) . '.pdf';
if(file_put_contents($filename, pdf_create($html)) !== FALSE)
{
$result = $this->email_lib->sendEmail($to, $subject, $text, $filename);
}
$message = $this->lang->line($result ? 'sales_invoice_sent' : 'sales_invoice_unsent') . ' ' . $to;
}
echo json_encode(array('success' => $result, 'message' => $message, 'id' => $sale_id));
$this->sale_lib->clear_all();
return $result;
}
public function send_receipt($sale_id)
{
$sale_data = $this->_load_sale_data($sale_id);
$result = FALSE;
$message = $this->lang->line('sales_receipt_no_email');
if(!empty($sale_data['customer_email']))
{
$sale_data['barcode'] = $this->barcode_lib->generate_receipt_barcode($sale_data['sale_id']);
$to = $sale_data['customer_email'];
$subject = $this->lang->line('sales_receipt');
$text = $this->load->view('sales/receipt_email', $sale_data, TRUE);
$result = $this->email_lib->sendEmail($to, $subject, $text);
$message = $this->lang->line($result ? 'sales_receipt_sent' : 'sales_receipt_unsent') . ' ' . $to;
}
echo json_encode(array('success' => $result, 'message' => $message, 'id' => $sale_id));
$this->sale_lib->clear_all();
return $result;
}
private function _substitute_variable($text, $variable, $object, $function)
{
// don't query if this variable isn't used
if(strstr($text, $variable))
{
$value = call_user_func(array($object, $function));
$text = str_replace($variable, $value, $text);
}
return $text;
}
private function _substitute_customer($text, $customer_info)
{
// substitute customer info
$customer_id = $this->sale_lib->get_customer();
if($customer_id != -1 && $customer_info != '')
{
$text = str_replace('$CU', $customer_info->first_name . ' ' . $customer_info->last_name, $text);
$words = preg_split("/\s+/", trim($customer_info->first_name . ' ' . $customer_info->last_name));
$acronym = '';
foreach($words as $w)
{
$acronym .= $w[0];
}
$text = str_replace('$CI', $acronym, $text);
}
return $text;
}
private function _is_custom_invoice_number($customer_info)
{
$invoice_number = $this->config->config['sales_invoice_format'];
$invoice_number = $this->_substitute_variables($invoice_number, $customer_info);
return $this->sale_lib->get_invoice_number() != $invoice_number;
}
private function _substitute_variables($text, $customer_info)
{
$text = $this->_substitute_variable($text, '$YCO', $this->Sale, 'get_invoice_number_for_year');
$text = $this->_substitute_variable($text, '$CO', $this->Sale , 'get_invoice_count');
$text = $this->_substitute_variable($text, '$SCO', $this->Sale_suspended, 'get_invoice_count');
$text = strftime($text);
$text = $this->_substitute_customer($text, $customer_info);
return $text;
}
private function _substitute_invoice_number($customer_info)
{
$invoice_number = $this->config->config['sales_invoice_format'];
$invoice_number = $this->_substitute_variables($invoice_number, $customer_info);
$this->sale_lib->set_invoice_number($invoice_number, TRUE);
return $this->sale_lib->get_invoice_number();
}
private function _load_customer_data($customer_id, &$data, $totals = FALSE)
{
$customer_info = '';
if($customer_id != -1)
{
$customer_info = $this->Customer->get_info($customer_id);
if(isset($customer_info->company_name))
{
$data['customer'] = $customer_info->company_name;
}
else
{
$data['customer'] = $customer_info->first_name . ' ' . $customer_info->last_name;
}
$data['first_name'] = $customer_info->first_name;
$data['last_name'] = $customer_info->last_name;
$data['customer_email'] = $customer_info->email;
$data['customer_address'] = $customer_info->address_1;
if(!empty($customer_info->zip) or !empty($customer_info->city))
{
$data['customer_location'] = $customer_info->zip . ' ' . $customer_info->city;
}
else
{
$data['customer_location'] = '';
}
$data['customer_account_number'] = $customer_info->account_number;
$data['customer_discount_percent'] = $customer_info->discount_percent;
if($totals)
{
$cust_totals = $this->Customer->get_totals($customer_id);
$data['customer_total'] = $cust_totals->total;
}
$data['customer_info'] = implode("\n", array(
$data['customer'],
$data['customer_address'],
$data['customer_location'],
$data['customer_account_number']
));
}
return $customer_info;
}
private function _load_sale_data($sale_id)
{
$this->sale_lib->clear_all();
$sale_info = $this->Sale->get_info($sale_id)->row_array();
$this->sale_lib->copy_entire_sale($sale_id);
$data = array();
$data['cart'] = $this->sale_lib->get_cart();
$data['payments'] = $this->sale_lib->get_payments();
$data['subtotal'] = $this->sale_lib->get_subtotal();
$data['discounted_subtotal'] = $this->sale_lib->get_subtotal(TRUE);
$data['tax_exclusive_subtotal'] = $this->sale_lib->get_subtotal(TRUE, TRUE);
$data['taxes'] = $this->sale_lib->get_taxes();
$data['total'] = $this->sale_lib->get_total();
$data['discount'] = $this->sale_lib->get_discount();
$data['receipt_title'] = $this->lang->line('sales_receipt');
$data['transaction_time'] = date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($sale_info['sale_time']));
$data['transaction_date'] = date($this->config->item('dateformat'), strtotime($sale_info['sale_time']));
$data['show_stock_locations'] = $this->Stock_location->show_locations('sales');
$data['amount_change'] = $this->sale_lib->get_amount_due() * -1;
$data['amount_due'] = $this->sale_lib->get_amount_due();
$employee_info = $this->Employee->get_info($this->sale_lib->get_employee());
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$this->_load_customer_data($this->sale_lib->get_customer(), $data);
$data['sale_id_num'] = $sale_id;
$data['sale_id'] = 'POS ' . $sale_id;
$data['comments'] = $sale_info['comment'];
$data['invoice_number'] = $sale_info['invoice_number'];
$data['company_info'] = implode("\n", array(
$this->config->item('address'),
$this->config->item('phone'),
$this->config->item('account_number')
));
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
$data['print_after_sale'] = FALSE;
return $this->xss_clean($data);
}
private function _reload($data = array())
{
$data['cart'] = $this->sale_lib->get_cart();
$data['modes'] = array('sale' => $this->lang->line('sales_sale'), 'return' => $this->lang->line('sales_return'));
$data['mode'] = $this->sale_lib->get_mode();
$data['stock_locations'] = $this->Stock_location->get_allowed_locations('sales');
$data['stock_location'] = $this->sale_lib->get_sale_location();
$data['subtotal'] = $this->sale_lib->get_subtotal(TRUE);
$data['tax_exclusive_subtotal'] = $this->sale_lib->get_subtotal(TRUE, TRUE);
$data['taxes'] = $this->sale_lib->get_taxes();
$data['discount'] = $this->sale_lib->get_discount();
$data['total'] = $this->sale_lib->get_total();
$data['comment'] = $this->sale_lib->get_comment();
$data['email_receipt'] = $this->sale_lib->get_email_receipt();
$data['payments_total'] = $this->sale_lib->get_payments_total();
$data['amount_due'] = $this->sale_lib->get_amount_due();
$data['payments'] = $this->sale_lib->get_payments();
$data['payment_options'] = $this->Sale->get_payment_options();
$data['items_module_allowed'] = $this->Employee->has_grant('items', $this->Employee->get_logged_in_employee_info()->person_id);
$customer_info = $this->_load_customer_data($this->sale_lib->get_customer(), $data, TRUE);
$data['invoice_number'] = $this->_substitute_invoice_number($customer_info);
$data['invoice_number_enabled'] = $this->sale_lib->is_invoice_number_enabled();
$data['print_after_sale'] = $this->sale_lib->is_print_after_sale();
$data['payments_cover_total'] = $this->sale_lib->get_amount_due() <= 0;
$data = $this->xss_clean($data);
$this->load->view("sales/register", $data);
}
public function receipt($sale_id)
{
$data = $this->_load_sale_data($sale_id);
$this->load->view('sales/receipt', $data);
$this->sale_lib->clear_all();
}
public function invoice($sale_id)
{
$data = $this->_load_sale_data($sale_id);
$this->load->view('sales/invoice', $data);
$this->sale_lib->clear_all();
}
public function edit($sale_id)
{
$data = array();
$data['employees'] = array();
foreach($this->Employee->get_all()->result() as $employee)
{
foreach(get_object_vars($employee) as $property => $value)
{
$employee->$property = $this->xss_clean($value);
}
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
}
$sale_info = $this->xss_clean($this->Sale->get_info($sale_id)->row_array());
$data['selected_customer_name'] = $sale_info['customer_name'];
$data['selected_customer_id'] = $sale_info['customer_id'];
$data['sale_info'] = $sale_info;
$data['payments'] = array();
foreach($this->Sale->get_sale_payments($sale_id)->result() as $payment)
{
foreach(get_object_vars($payment) as $property => $value)
{
$payment->$property = $this->xss_clean($value);
}
$data['payments'][] = $payment;
}
// don't allow gift card to be a payment option in a sale transaction edit because it's a complex change
$data['payment_options'] = $this->xss_clean($this->Sale->get_payment_options(FALSE));
$this->load->view('sales/form', $data);
}
public function delete($sale_id = -1, $update_inventory = TRUE)
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$sale_ids = $sale_id == -1 ? $this->input->post('ids') : array($sale_id);
if($this->Sale->delete_list($sale_ids, $employee_id, $update_inventory))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('sales_successfully_deleted') . ' ' .
count($sale_ids) . ' ' . $this->lang->line('sales_one_or_multiple'), 'ids' => $sale_ids));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('sales_unsuccessfully_deleted')));
}
}
public function save($sale_id = -1)
{
$newdate = $this->input->post('date');
$date_formatter = date_create_from_format($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), $newdate);
$sale_data = array(
'sale_time' => $date_formatter->format('Y-m-d H:i:s'),
'customer_id' => $this->input->post('customer_id') != '' ? $this->input->post('customer_id') : NULL,
'employee_id' => $this->input->post('employee_id'),
'comment' => $this->input->post('comment'),
'invoice_number' => $this->input->post('invoice_number') != '' ? $this->input->post('invoice_number') : NULL
);
// go through all the payment type input from the form, make sure the form matches the name and iterator number
$payments = array();
$number_of_payments = $this->input->post('number_of_payments');
for ($i = 0; $i < $number_of_payments; ++$i)
{
$payment_amount = $this->input->post('payment_amount_' . $i);
$payment_type = $this->input->post('payment_type_' . $i);
// remove any 0 payment if by mistake any was introduced at sale time
if($payment_amount != 0)
{
// search for any payment of the same type that was already added, if that's the case add up the new payment amount
$key = FALSE;
if(!empty($payments))
{
// search in the multi array the key of the entry containing the current payment_type
// NOTE: in PHP5.5 the array_map could be replaced by an array_column
$key = array_search($payment_type, array_map(function($v){return $v['payment_type'];}, $payments));
}
// if no previous payment is found add a new one
if($key === FALSE)
{
$payments[] = array('payment_type' => $payment_type, 'payment_amount' => $payment_amount);
}
else
{
// add up the new payment amount to an existing payment type
$payments[$key]['payment_amount'] += $payment_amount;
}
}
}
if($this->Sale->update($sale_id, $sale_data, $payments))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('sales_successfully_updated'), 'id' => $sale_id));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('sales_unsuccessfully_updated'), 'id' => $sale_id));
}
}
public function cancel()
{
$this->sale_lib->clear_all();
$this->_reload();
}
public function suspend()
{
$cart = $this->sale_lib->get_cart();
$payments = $this->sale_lib->get_payments();
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$customer_id = $this->sale_lib->get_customer();
$customer_info = $this->Customer->get_info($customer_id);
$invoice_number = $this->_is_custom_invoice_number($customer_info) ? $this->sale_lib->get_invoice_number() : NULL;
$comment = $this->sale_lib->get_comment();
//SAVE sale to database
$data = array();
if($this->Sale_suspended->save($cart, $customer_id, $employee_id, $comment, $invoice_number, $payments) == '-1')
{
$data['error'] = $this->lang->line('sales_unsuccessfully_suspended_sale');
}
else
{
$data['success'] = $this->lang->line('sales_successfully_suspended_sale');
}
$this->sale_lib->clear_all();
$this->_reload($data);
}
public function suspended()
{
$data = array();
$data['suspended_sales'] = $this->xss_clean($this->Sale_suspended->get_all()->result_array());
$this->load->view('sales/suspended', $data);
}
public function unsuspend()
{
$sale_id = $this->input->post('suspended_sale_id');
$this->sale_lib->clear_all();
$this->sale_lib->copy_entire_suspended_sale($sale_id);
$this->Sale_suspended->delete($sale_id);
$this->_reload();
}
public function check_invoice_number()
{
$sale_id = $this->input->post('sale_id');
$invoice_number = $this->input->post('invoice_number');
$exists = !empty($invoice_number) && $this->Sale->check_invoice_number_exists($invoice_number, $sale_id);
echo !$exists ? 'true' : 'false';
}
}
?>

View File

@@ -0,0 +1,109 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Secure_Controller extends CI_Controller
{
/*
* Controllers that are considered secure extend Secure_Controller, optionally a $module_id can
* be set to also check if a user can access a particular module in the system.
*/
public function __construct($module_id = NULL, $submodule_id = NULL)
{
parent::__construct();
$this->load->model('Employee');
$model = $this->Employee;
if(!$model->is_logged_in())
{
redirect('login');
}
$this->track_page($module_id, $module_id);
$logged_in_employee_info = $model->get_logged_in_employee_info();
if(!$model->has_module_grant($module_id, $logged_in_employee_info->person_id) ||
(isset($submodule_id) && !$model->has_module_grant($submodule_id, $logged_in_employee_info->person_id)))
{
redirect('no_access/' . $module_id . '/' . $submodule_id);
}
// load up global data visible to all the loaded views
$data['allowed_modules'] = $this->Module->get_allowed_modules($logged_in_employee_info->person_id);
$data['user_info'] = $logged_in_employee_info;
$data['controller_name'] = $module_id;
$this->load->vars($data);
}
/*
* Internal method to do XSS clean in the derived classes
*/
protected function xss_clean($str, $is_image = FALSE)
{
// This setting is configurable in application/config/config.php.
// Users can disable the XSS clean for performance reasons
// (cases like intranet installation with no Internet access)
if($this->config->item('ospos_xss_clean') == FALSE)
{
return $str;
}
else
{
return $this->security->xss_clean($str, $is_image);
}
}
protected function track_page($path, $page)
{
if(get_instance()->Appconfig->get('statistics'))
{
$this->load->library('tracking_lib');
if(empty($path))
{
$path = 'home';
$page = 'home';
}
$this->tracking_lib->track_page('controller/' . $path, $page);
}
}
protected function track_event($category, $action, $label, $value = NULL)
{
if(get_instance()->Appconfig->get('statistics'))
{
$this->load->library('tracking_lib');
$this->tracking_lib->track_event($category, $action, $label, $value);
}
}
public function numeric($str)
{
return parse_decimals($str);
}
public function check_numeric()
{
$result = TRUE;
foreach($this->input->get() as $str)
{
$result = parse_decimals($str);
}
echo $result !== FALSE ? 'true' : 'false';
}
// this is the basic set of methods most OSPOS Controllers will implement
public function index() { return FALSE; }
public function search() { return FALSE; }
public function suggest_search() { return FALSE; }
public function view($data_item_id = -1) { return FALSE; }
public function save($data_item_id = -1) { return FALSE; }
public function delete() { return FALSE; }
}
?>

View File

@@ -0,0 +1,155 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Persons.php");
class Suppliers extends Persons
{
public function __construct()
{
parent::__construct('suppliers');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_suppliers_manage_table_headers());
$this->load->view('people/manage', $data);
}
/*
Gets one row for a supplier manage table. This is called using AJAX to update one row.
*/
public function get_row($row_id)
{
$data_row = $this->xss_clean(get_supplier_data_row($this->Supplier->get_info($row_id), $this));
echo json_encode($data_row);
}
/*
Returns Supplier table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$suppliers = $this->Supplier->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Supplier->get_found_rows($search);
$data_rows = array();
foreach($suppliers->result() as $supplier)
{
$data_rows[] = get_supplier_data_row($supplier, $this);
}
$data_rows = $this->xss_clean($data_rows);
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
/*
Gives search suggestions based on what is being searched for
*/
public function suggest()
{
$suggestions = $this->xss_clean($this->Supplier->get_search_suggestions($this->input->get('term'), TRUE));
echo json_encode($suggestions);
}
public function suggest_search()
{
$suggestions = $this->xss_clean($this->Supplier->get_search_suggestions($this->input->post('term'), FALSE));
echo json_encode($suggestions);
}
/*
Loads the supplier edit form
*/
public function view($supplier_id = -1)
{
$info = $this->Supplier->get_info($supplier_id);
foreach(get_object_vars($info) as $property => $value)
{
$info->$property = $this->xss_clean($value);
}
$data['person_info'] = $info;
$this->load->view("suppliers/form", $data);
}
/*
Inserts/updates a supplier
*/
public function save($supplier_id = -1)
{
$person_data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'gender' => $this->input->post('gender'),
'email' => $this->input->post('email'),
'phone_number' => $this->input->post('phone_number'),
'address_1' => $this->input->post('address_1'),
'address_2' => $this->input->post('address_2'),
'city' => $this->input->post('city'),
'state' => $this->input->post('state'),
'zip' => $this->input->post('zip'),
'country' => $this->input->post('country'),
'comments' => $this->input->post('comments')
);
$supplier_data = array(
'company_name' => $this->input->post('company_name'),
'agency_name' => $this->input->post('agency_name'),
'account_number' => $this->input->post('account_number') == '' ? NULL : $this->input->post('account_number')
);
if($this->Supplier->save_supplier($person_data, $supplier_data, $supplier_id))
{
$supplier_data = $this->xss_clean($supplier_data);
//New supplier
if($supplier_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('suppliers_successful_adding').' '.
$supplier_data['company_name'], 'id' => $supplier_data['person_id']));
}
else //Existing supplier
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('suppliers_successful_updating').' '.
$supplier_data['company_name'], 'id' => $supplier_id));
}
}
else//failure
{
$supplier_data = $this->xss_clean($supplier_data);
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('suppliers_error_adding_updating').' '.
$supplier_data['company_name'], 'id' => -1));
}
}
/*
This deletes suppliers from the suppliers table
*/
public function delete()
{
$suppliers_to_delete = $this->xss_clean($this->input->post('ids'));
if($this->Supplier->delete_list($suppliers_to_delete))
{
echo json_encode(array('success' => TRUE,'message' => $this->lang->line('suppliers_successful_deleted').' '.
count($suppliers_to_delete).' '.$this->lang->line('suppliers_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE,'message' => $this->lang->line('suppliers_cannot_be_deleted')));
}
}
}
?>

View File

@@ -1,14 +0,0 @@
<?php
class Barcode extends CI_Controller
{
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->view('barcode');
}
}
?>

View File

@@ -1,52 +0,0 @@
<?php
require_once ("secure_area.php");
class Config extends Secure_area
{
function __construct()
{
parent::__construct('config');
}
function index()
{
$this->load->view("config");
}
function save()
{
$batch_save_data=array(
'company'=>$this->input->post('company'),
'address'=>$this->input->post('address'),
'phone'=>$this->input->post('phone'),
'email'=>$this->input->post('email'),
'fax'=>$this->input->post('fax'),
'website'=>$this->input->post('website'),
'default_tax_1_rate'=>$this->input->post('default_tax_1_rate'),
'default_tax_1_name'=>$this->input->post('default_tax_1_name'),
'default_tax_2_rate'=>$this->input->post('default_tax_2_rate'),
'default_tax_2_name'=>$this->input->post('default_tax_2_name'),
'currency_symbol'=>$this->input->post('currency_symbol'),
'currency_side'=>$this->input->post('currency_side'),/**GARRISON ADDED 4/20/2013**/
'return_policy'=>$this->input->post('return_policy'),
'language'=>$this->input->post('language'),
'timezone'=>$this->input->post('timezone'),
'print_after_sale'=>$this->input->post('print_after_sale'),
'custom1_name'=>$this->input->post('custom1_name'),/**GARRISON ADDED 4/20/2013**/
'custom2_name'=>$this->input->post('custom2_name'),/**GARRISON ADDED 4/20/2013**/
'custom3_name'=>$this->input->post('custom3_name'),/**GARRISON ADDED 4/20/2013**/
'custom4_name'=>$this->input->post('custom4_name'),/**GARRISON ADDED 4/20/2013**/
'custom5_name'=>$this->input->post('custom5_name'),/**GARRISON ADDED 4/20/2013**/
'custom6_name'=>$this->input->post('custom6_name'),/**GARRISON ADDED 4/20/2013**/
'custom7_name'=>$this->input->post('custom7_name'),/**GARRISON ADDED 4/20/2013**/
'custom8_name'=>$this->input->post('custom8_name'),/**GARRISON ADDED 4/20/2013**/
'custom9_name'=>$this->input->post('custom9_name'),/**GARRISON ADDED 4/20/2013**/
'custom10_name'=>$this->input->post('custom10_name')/**GARRISON ADDED 4/20/2013**/
);
if( $this->Appconfig->batch_save( $batch_save_data ) )
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('config_saved_successfully')));
}
}
}
?>

View File

@@ -1,201 +0,0 @@
<?php
require_once ("person_controller.php");
class Customers extends Person_controller
{
function __construct()
{
parent::__construct('customers');
}
function index()
{
$config['base_url'] = site_url('/customers/index');
$config['total_rows'] = $this->Customer->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_people_manage_table( $this->Customer->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('people/manage',$data);
}
/*
Returns customer table data rows. This will be called with AJAX.
*/
function search()
{
$search=$this->input->post('search');
$data_rows=get_people_manage_table_data_rows($this->Customer->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Customer->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/*
Loads the customer edit form
*/
function view($customer_id=-1)
{
$data['person_info']=$this->Customer->get_info($customer_id);
$this->load->view("customers/form",$data);
}
/*
Inserts/updates a customer
*/
function save($customer_id=-1)
{
$person_data = array(
'first_name'=>$this->input->post('first_name'),
'last_name'=>$this->input->post('last_name'),
'email'=>$this->input->post('email'),
'phone_number'=>$this->input->post('phone_number'),
'address_1'=>$this->input->post('address_1'),
'address_2'=>$this->input->post('address_2'),
'city'=>$this->input->post('city'),
'state'=>$this->input->post('state'),
'zip'=>$this->input->post('zip'),
'country'=>$this->input->post('country'),
'comments'=>$this->input->post('comments')
);
$customer_data=array(
'account_number'=>$this->input->post('account_number')=='' ? null:$this->input->post('account_number'),
'taxable'=>$this->input->post('taxable')=='' ? 0:1,
);
if($this->Customer->save($person_data,$customer_data,$customer_id))
{
//New customer
if($customer_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('customers_successful_adding').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>$customer_data['person_id']));
}
else //previous customer
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('customers_successful_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>$customer_id));
}
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('customers_error_adding_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>-1));
}
}
/*
This deletes customers from the customers table
*/
function delete()
{
$customers_to_delete=$this->input->post('ids');
if($this->Customer->delete_list($customers_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('customers_successful_deleted').' '.
count($customers_to_delete).' '.$this->lang->line('customers_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('customers_cannot_be_deleted')));
}
}
function excel()
{
$data = file_get_contents("import_customers.csv");
$name = 'import_customers.csv';
force_download($name, $data);
}
function excel_import()
{
$this->load->view("customers/excel_import", null);
}
function do_excel_import()
{
$msg = 'do_excel_import';
$failCodes = array();
if ($_FILES['file_path']['error']!=UPLOAD_ERR_OK)
{
$msg = $this->lang->line('items_excel_import_failed');
echo json_encode( array('success'=>false,'message'=>$msg) );
return;
}
else
{
if (($handle = fopen($_FILES['file_path']['tmp_name'], "r")) !== FALSE)
{
//Skip first row
fgetcsv($handle);
$i=1;
while (($data = fgetcsv($handle)) !== FALSE)
{
$person_data = array(
'first_name'=>$data[0],
'last_name'=>$data[1],
'email'=>$data[2],
'phone_number'=>$data[3],
'address_1'=>$data[4],
'address_2'=>$data[5],
'city'=>$data[6],
'state'=>$data[7],
'zip'=>$data[8],
'country'=>$data[9],
'comments'=>$data[10]
);
$customer_data=array(
'account_number'=>$data[11]=='' ? null:$data[11],
'taxable'=>$data[12]=='' ? 0:1,
);
if(!$this->Customer->save($person_data,$customer_data))
{
$failCodes[] = $i;
}
$i++;
}
}
else
{
echo json_encode( array('success'=>false,'message'=>'Your upload file has no data or not in supported format.') );
return;
}
}
$success = true;
if(count($failCodes) > 1)
{
$msg = "Most customers imported. But some were not, here is list of their CODE (" .count($failCodes) ."): ".implode(", ", $failCodes);
$success = false;
}
else
{
$msg = "Import Customers successful";
}
echo json_encode( array('success'=>$success,'message'=>$msg) );
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 350;
}
}
?>

View File

@@ -1,132 +0,0 @@
<?php
require_once ("person_controller.php");
class Employees extends Person_controller
{
function __construct()
{
parent::__construct('employees');
}
function index()
{
$config['base_url'] = site_url('/employees/index');
$config['total_rows'] = $this->Employee->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_people_manage_table( $this->Employee->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('people/manage',$data);
}
/*
Returns employee table data rows. This will be called with AJAX.
*/
function search()
{
$search=$this->input->post('search');
$data_rows=get_people_manage_table_data_rows($this->Employee->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Employee->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/*
Loads the employee edit form
*/
function view($employee_id=-1)
{
$data['person_info']=$this->Employee->get_info($employee_id);
$data['all_modules']=$this->Module->get_all_modules();
$this->load->view("employees/form",$data);
}
/*
Inserts/updates an employee
*/
function save($employee_id=-1)
{
$person_data = array(
'first_name'=>$this->input->post('first_name'),
'last_name'=>$this->input->post('last_name'),
'email'=>$this->input->post('email'),
'phone_number'=>$this->input->post('phone_number'),
'address_1'=>$this->input->post('address_1'),
'address_2'=>$this->input->post('address_2'),
'city'=>$this->input->post('city'),
'state'=>$this->input->post('state'),
'zip'=>$this->input->post('zip'),
'country'=>$this->input->post('country'),
'comments'=>$this->input->post('comments')
);
$permission_data = $this->input->post("permissions")!=false ? $this->input->post("permissions"):array();
//Password has been changed OR first time password set
if($this->input->post('password')!='')
{
$employee_data=array(
'username'=>$this->input->post('username'),
'password'=>md5($this->input->post('password'))
);
}
else //Password not changed
{
$employee_data=array('username'=>$this->input->post('username'));
}
if($this->Employee->save($person_data,$employee_data,$permission_data,$employee_id))
{
//New employee
if($employee_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('employees_successful_adding').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>$employee_data['person_id']));
}
else //previous employee
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('employees_successful_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>$employee_id));
}
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('employees_error_adding_updating').' '.
$person_data['first_name'].' '.$person_data['last_name'],'person_id'=>-1));
}
}
/*
This deletes employees from the employees table
*/
function delete()
{
$employees_to_delete=$this->input->post('ids');
if($this->Employee->delete_list($employees_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('employees_successful_deleted').' '.
count($employees_to_delete).' '.$this->lang->line('employees_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('employees_cannot_be_deleted')));
}
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 650;
}
}
?>

View File

@@ -1,117 +0,0 @@
<?php
require_once ("secure_area.php");
require_once ("interfaces/idata_controller.php");
class Giftcards extends Secure_area implements iData_controller
{
function __construct()
{
parent::__construct('giftcards');
}
function index()
{
$config['base_url'] = site_url('/giftcards/index');
$config['total_rows'] = $this->Giftcard->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_giftcards_manage_table( $this->Giftcard->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('giftcards/manage',$data);
}
function search()
{
$search=$this->input->post('search');
$data_rows=get_giftcards_manage_table_data_rows($this->Giftcard->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Giftcard->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/** GARRISON ADDED 5/3/2013 **/
/*
Gives search suggestions for person_id based on what is being searched for
*/
function suggest_person()
{
$suggestions = $this->Giftcard->get_person_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/** END GARRISON ADDED **/
function get_row()
{
$giftcard_id = $this->input->post('row_id');
$data_row=get_giftcard_data_row($this->Giftcard->get_info($giftcard_id),$this);
echo $data_row;
}
function view($giftcard_id=-1)
{
$data['giftcard_info']=$this->Giftcard->get_info($giftcard_id);
$this->load->view("giftcards/form",$data);
}
function save($giftcard_id=-1)
{
$giftcard_data = array(
'giftcard_number'=>$this->input->post('giftcard_number'),
'value'=>$this->input->post('value'),
'person_id'=>$this->input->post('person_id')/**GARRISON ADDED 4/22/2013**/
);
if( $this->Giftcard->save( $giftcard_data, $giftcard_id ) )
{
//New giftcard
if($giftcard_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('giftcards_successful_adding').' '.
$giftcard_data['giftcard_number'],'giftcard_id'=>$giftcard_data['giftcard_id']));
$giftcard_id = $giftcard_data['giftcard_id'];
}
else //previous giftcard
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('giftcards_successful_updating').' '.
$giftcard_data['giftcard_number'],'giftcard_id'=>$giftcard_id));
}
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('giftcards_error_adding_updating').' '.
$giftcard_data['giftcard_number'],'giftcard_id'=>-1));
}
}
function delete()
{
$giftcards_to_delete=$this->input->post('ids');
if($this->Giftcard->delete_list($giftcards_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('giftcards_successful_deleted').' '.
count($giftcards_to_delete).' '.$this->lang->line('giftcards_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('giftcards_cannot_be_deleted')));
}
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 360;
}
}
?>

View File

@@ -1,21 +0,0 @@
<?php
require_once ("secure_area.php");
class Home extends Secure_area
{
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->view("home");
}
function logout()
{
$this->Employee->logout();
}
}
?>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -1,17 +0,0 @@
<?php
/*
This interface is implemented by any controller that keeps track of data items, such
as the customers, employees, and items controllers.
*/
interface iData_controller
{
public function index();
public function search();
public function suggest();
public function get_row();
public function view($data_item_id=-1);
public function save($data_item_id=-1);
public function delete();
public function get_form_width();
}
?>

View File

@@ -1,11 +0,0 @@
<?php
/*
This interface is implemented by any controller that keeps track of people, such
as customers and employees.
*/
require_once("idata_controller.php");
interface iPerson_controller extends iData_controller
{
public function mailto();
}
?>

View File

@@ -1,138 +0,0 @@
<?php
require_once ("secure_area.php");
require_once ("interfaces/idata_controller.php");
class Item_kits extends Secure_area implements iData_controller
{
function __construct()
{
parent::__construct('item_kits');
}
function index()
{
$config['base_url'] = site_url('/item_kits/index');
$config['total_rows'] = $this->Item_kit->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_item_kits_manage_table( $this->Item_kit->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('item_kits/manage',$data);
}
function search()
{
$search=$this->input->post('search');
$data_rows=get_item_kits_manage_table_data_rows($this->Item_kit->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Item_kit->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
function get_row()
{
$item_kit_id = $this->input->post('row_id');
$data_row=get_item_kit_data_row($this->Item_kit->get_info($item_kit_id),$this);
echo $data_row;
}
function view($item_kit_id=-1)
{
$data['item_kit_info']=$this->Item_kit->get_info($item_kit_id);
$this->load->view("item_kits/form",$data);
}
function save($item_kit_id=-1)
{
$item_kit_data = array(
'name'=>$this->input->post('name'),
'description'=>$this->input->post('description')
);
if($this->Item_kit->save($item_kit_data,$item_kit_id))
{
//New item kit
if($item_kit_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('item_kits_successful_adding').' '.
$item_kit_data['name'],'item_kit_id'=>$item_kit_data['item_kit_id']));
$item_kit_id = $item_kit_data['item_kit_id'];
}
else //previous item
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('item_kits_successful_updating').' '.
$item_kit_data['name'],'item_kit_id'=>$item_kit_id));
}
if ($this->input->post('item_kit_item'))
{
$item_kit_items = array();
foreach($this->input->post('item_kit_item') as $item_id => $quantity)
{
$item_kit_items[] = array(
'item_id' => $item_id,
'quantity' => $quantity
);
}
$this->Item_kit_items->save($item_kit_items, $item_kit_id);
}
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('item_kits_error_adding_updating').' '.
$item_kit_data['name'],'item_kit_id'=>-1));
}
}
function delete()
{
$item_kits_to_delete=$this->input->post('ids');
if($this->Item_kit->delete_list($item_kits_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('item_kits_successful_deleted').' '.
count($item_kits_to_delete).' '.$this->lang->line('item_kits_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('item_kits_cannot_be_deleted')));
}
}
function generate_barcodes($item_kit_ids)
{
$result = array();
$item_kit_ids = explode(':', $item_kit_ids);
foreach ($item_kit_ids as $item_kid_id)
{
$item_kit_info = $this->Item_kit->get_info($item_kid_id);
$result[] = array('name' =>$item_kit_info->name, 'id'=> 'KIT '.$item_kid_id);
}
$data['items'] = $result;
$this->load->view("barcode_sheet", $data);
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 360;
}
}
?>

View File

@@ -1,556 +0,0 @@
<?php
require_once ("secure_area.php");
require_once ("interfaces/idata_controller.php");
class Items extends Secure_area implements iData_controller
{
function __construct()
{
parent::__construct('items');
}
function index()
{
$config['base_url'] = site_url('/items/index');
$config['total_rows'] = $this->Item->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_items_manage_table( $this->Item->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('items/manage',$data);
}
function refresh()
{
$low_inventory=$this->input->post('low_inventory');
$is_serialized=$this->input->post('is_serialized');
$no_description=$this->input->post('no_description');
$search_custom=$this->input->post('search_custom');//GARRISON ADDED 4/13/2013
$is_deleted=$this->input->post('is_deleted'); // Parq 131215
$data['search_section_state']=$this->input->post('search_section_state');
$data['low_inventory']=$this->input->post('low_inventory');
$data['is_serialized']=$this->input->post('is_serialized');
$data['no_description']=$this->input->post('no_description');
$data['search_custom']=$this->input->post('search_custom');//GARRISON ADDED 4/13/2013
$data['is_deleted']=$this->input->post('is_deleted'); // Parq 131215
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_items_manage_table($this->Item->get_all_filtered($low_inventory,$is_serialized,$no_description,$search_custom,$is_deleted),$this);//GARRISON MODIFIED 4/13/2013, Parq 131215
$this->load->view('items/manage',$data);
}
function find_item_info()
{
$item_number=$this->input->post('scan_item_number');
echo json_encode($this->Item->find_item_info($item_number));
}
function search()
{
$search=$this->input->post('search');
$data_rows=get_items_manage_table_data_rows($this->Item->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Item->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
function item_search()
{
$suggestions = $this->Item->get_item_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_category()
{
$suggestions = $this->Item->get_category_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/**GARRISON ADDED 5/18/2013**/
/*
Gives search suggestions based on what is being searched for
*/
function suggest_location()
{
$suggestions = $this->Item->get_location_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom1()
{
$suggestions = $this->Item->get_custom1_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom2()
{
$suggestions = $this->Item->get_custom2_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom3()
{
$suggestions = $this->Item->get_custom3_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom4()
{
$suggestions = $this->Item->get_custom4_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom5()
{
$suggestions = $this->Item->get_custom5_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom6()
{
$suggestions = $this->Item->get_custom6_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom7()
{
$suggestions = $this->Item->get_custom7_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom8()
{
$suggestions = $this->Item->get_custom8_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom9()
{
$suggestions = $this->Item->get_custom9_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest_custom10()
{
$suggestions = $this->Item->get_custom10_suggestions($this->input->post('q'));
echo implode("\n",$suggestions);
}
/**END GARRISON ADDED**/
function get_row()
{
$item_id = $this->input->post('row_id');
$data_row=get_item_data_row($this->Item->get_info($item_id),$this);
echo $data_row;
}
function view($item_id=-1)
{
$data['item_info']=$this->Item->get_info($item_id);
$data['item_tax_info']=$this->Item_taxes->get_info($item_id);
$suppliers = array('' => $this->lang->line('items_none'));
foreach($this->Supplier->get_all()->result_array() as $row)
{
$suppliers[$row['person_id']] = $row['company_name'] .' ('.$row['first_name'] .' '. $row['last_name'].')';
}
$data['suppliers']=$suppliers;
$data['selected_supplier'] = $this->Item->get_info($item_id)->supplier_id;
$data['default_tax_1_rate']=($item_id==-1) ? $this->Appconfig->get('default_tax_1_rate') : '';
$data['default_tax_2_rate']=($item_id==-1) ? $this->Appconfig->get('default_tax_2_rate') : '';
$this->load->view("items/form",$data);
}
//Ramel Inventory Tracking
function inventory($item_id=-1)
{
$data['item_info']=$this->Item->get_info($item_id);
$this->load->view("items/inventory",$data);
}
function count_details($item_id=-1)
{
$data['item_info']=$this->Item->get_info($item_id);
$this->load->view("items/count_details",$data);
} //------------------------------------------- Ramel
function generate_barcodes($item_ids)
{
$result = array();
$item_ids = explode(':', $item_ids);
foreach ($item_ids as $item_id)
{
$item_info = $this->Item->get_info($item_id);
$result[] = array('name' =>$item_info->name, 'id'=> $item_id);
}
$data['items'] = $result;
$this->load->view("barcode_sheet", $data);
}
function bulk_edit()
{
$data = array();
$suppliers = array('' => $this->lang->line('items_none'));
foreach($this->Supplier->get_all()->result_array() as $row)
{
$suppliers[$row['person_id']] = $row['first_name'] .' '. $row['last_name'];
}
$data['suppliers'] = $suppliers;
$data['allow_alt_description_choices'] = array(
''=>$this->lang->line('items_do_nothing'),
1 =>$this->lang->line('items_change_all_to_allow_alt_desc'),
0 =>$this->lang->line('items_change_all_to_not_allow_allow_desc'));
$data['serialization_choices'] = array(
''=>$this->lang->line('items_do_nothing'),
1 =>$this->lang->line('items_change_all_to_serialized'),
0 =>$this->lang->line('items_change_all_to_unserialized'));
$this->load->view("items/form_bulk", $data);
}
function save($item_id=-1)
{
$item_data = array(
'name'=>$this->input->post('name'),
'description'=>$this->input->post('description'),
'category'=>$this->input->post('category'),
'supplier_id'=>$this->input->post('supplier_id')=='' ? null:$this->input->post('supplier_id'),
'item_number'=>$this->input->post('item_number')=='' ? null:$this->input->post('item_number'),
'cost_price'=>$this->input->post('cost_price'),
'unit_price'=>$this->input->post('unit_price'),
'quantity'=>$this->input->post('quantity'),
'reorder_level'=>$this->input->post('reorder_level'),
'location'=>$this->input->post('location'),
'allow_alt_description'=>$this->input->post('allow_alt_description'),
'is_serialized'=>$this->input->post('is_serialized'),
'deleted'=>$this->input->post('is_deleted'), /** Parq 131215 **/
'custom1'=>$this->input->post('custom1'), /**GARRISON ADDED 4/21/2013**/
'custom2'=>$this->input->post('custom2'),/**GARRISON ADDED 4/21/2013**/
'custom3'=>$this->input->post('custom3'),/**GARRISON ADDED 4/21/2013**/
'custom4'=>$this->input->post('custom4'),/**GARRISON ADDED 4/21/2013**/
'custom5'=>$this->input->post('custom5'),/**GARRISON ADDED 4/21/2013**/
'custom6'=>$this->input->post('custom6'),/**GARRISON ADDED 4/21/2013**/
'custom7'=>$this->input->post('custom7'),/**GARRISON ADDED 4/21/2013**/
'custom8'=>$this->input->post('custom8'),/**GARRISON ADDED 4/21/2013**/
'custom9'=>$this->input->post('custom9'),/**GARRISON ADDED 4/21/2013**/
'custom10'=>$this->input->post('custom10')/**GARRISON ADDED 4/21/2013**/
);
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->Item->get_info($item_id);
if($this->Item->save($item_data,$item_id))
{
//New item
if($item_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('items_successful_adding').' '.
$item_data['name'],'item_id'=>$item_data['item_id']));
$item_id = $item_data['item_id'];
}
else //previous item
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('items_successful_updating').' '.
$item_data['name'],'item_id'=>$item_id));
}
$inv_data = array
(
'trans_date'=>date('Y-m-d H:i:s'),
'trans_items'=>$item_id,
'trans_user'=>$employee_id,
'trans_comment'=>$this->lang->line('items_manually_editing_of_quantity'),
'trans_inventory'=>$cur_item_info ? $this->input->post('quantity') - $cur_item_info->quantity : $this->input->post('quantity')
);
$this->Inventory->insert($inv_data);
$items_taxes_data = array();
$tax_names = $this->input->post('tax_names');
$tax_percents = $this->input->post('tax_percents');
for($k=0;$k<count($tax_percents);$k++)
{
if (is_numeric($tax_percents[$k]))
{
$items_taxes_data[] = array('name'=>$tax_names[$k], 'percent'=>$tax_percents[$k] );
}
}
$this->Item_taxes->save($items_taxes_data, $item_id);
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('items_error_adding_updating').' '.
$item_data['name'],'item_id'=>-1));
}
}
//Ramel Inventory Tracking
function save_inventory($item_id=-1)
{
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->Item->get_info($item_id);
$inv_data = array
(
'trans_date'=>date('Y-m-d H:i:s'),
'trans_items'=>$item_id,
'trans_user'=>$employee_id,
'trans_comment'=>$this->input->post('trans_comment'),
'trans_inventory'=>$this->input->post('newquantity')
);
$this->Inventory->insert($inv_data);
//Update stock quantity
$item_data = array(
'quantity'=>$cur_item_info->quantity + $this->input->post('newquantity')
);
if($this->Item->save($item_data,$item_id))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('items_successful_updating').' '.
$cur_item_info->name,'item_id'=>$item_id));
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('items_error_adding_updating').' '.
$cur_item_info->name,'item_id'=>-1));
}
}//---------------------------------------------------------------------Ramel
function bulk_update()
{
$items_to_update=$this->input->post('item_ids');
$item_data = array();
foreach($_POST as $key=>$value)
{
//This field is nullable, so treat it differently
if ($key == 'supplier_id')
{
$item_data["$key"]=$value == '' ? null : $value;
}
elseif($value!='' and !(in_array($key, array('item_ids', 'tax_names', 'tax_percents'))))
{
$item_data["$key"]=$value;
}
}
//Item data could be empty if tax information is being updated
if(empty($item_data) || $this->Item->update_multiple($item_data,$items_to_update))
{
$items_taxes_data = array();
$tax_names = $this->input->post('tax_names');
$tax_percents = $this->input->post('tax_percents');
for($k=0;$k<count($tax_percents);$k++)
{
if (is_numeric($tax_percents[$k]))
{
$items_taxes_data[] = array('name'=>$tax_names[$k], 'percent'=>$tax_percents[$k] );
}
}
$this->Item_taxes->save_multiple($items_taxes_data, $items_to_update);
echo json_encode(array('success'=>true,'message'=>$this->lang->line('items_successful_bulk_edit')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('items_error_updating_multiple')));
}
}
function delete()
{
$items_to_delete=$this->input->post('ids');
if($this->Item->delete_list($items_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('items_successful_deleted').' '.
count($items_to_delete).' '.$this->lang->line('items_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('items_cannot_be_deleted')));
}
}
function excel()
{
$data = file_get_contents("import_items.csv");
$name = 'import_items.csv';
force_download($name, $data);
}
function excel_import()
{
$this->load->view("items/excel_import", null);
}
function do_excel_import()
{
$msg = 'do_excel_import';
$failCodes = array();
if ($_FILES['file_path']['error']!=UPLOAD_ERR_OK)
{
$msg = $this->lang->line('items_excel_import_failed');
echo json_encode( array('success'=>false,'message'=>$msg) );
return;
}
else
{
if (($handle = fopen($_FILES['file_path']['tmp_name'], "r")) !== FALSE)
{
//Skip first row
fgetcsv($handle);
$i=1;
while (($data = fgetcsv($handle)) !== FALSE)
{
$item_data = array(
'name' => $data[1],
'description' => $data[13],
'location' => $data[12],
'category' => $data[2],
'cost_price' => $data[4],
'unit_price' => $data[5],
'quantity' => $data[10],
'reorder_level' => $data[11],
'supplier_id' => $this->Supplier->exists($data[3]) ? $data[3] : null,
'allow_alt_description' => $data[14] != '' ? '1' : '0',
'is_serialized' => $data[15] != '' ? '1' : '0',
'custom1' => $data[16], /** GARRISON ADDED 5/6/2013 **/
'custom2' => $data[17], /** GARRISON ADDED 5/6/2013 **/
'custom3' => $data[18], /** GARRISON ADDED 5/6/2013 **/
'custom4' => $data[19], /** GARRISON ADDED 5/6/2013 **/
'custom5' => $data[20], /** GARRISON ADDED 5/6/2013 **/
'custom6' => $data[21], /** GARRISON ADDED 5/6/2013 **/
'custom7' => $data[22], /** GARRISON ADDED 5/6/2013 **/
'custom8' => $data[23], /** GARRISON ADDED 5/6/2013 **/
'custom9' => $data[24], /** GARRISON ADDED 5/6/2013 **/
'custom10' => $data[25] /** GARRISON ADDED 5/6/2013 **/
);
$item_number = $data[0];
if ($item_number != "")
{
$item_data['item_number'] = $item_number;
}
if($this->Item->save($item_data))
{
$items_taxes_data = null;
//tax 1
if( is_numeric($data[7]) && $data[6]!='' )
{
$items_taxes_data[] = array('name'=>$data[6], 'percent'=>$data[7] );
}
//tax 2
if( is_numeric($data[9]) && $data[8]!='' )
{
$items_taxes_data[] = array('name'=>$data[8], 'percent'=>$data[9] );
}
// save tax values
if(count($items_taxes_data) > 0)
{
$this->Item_taxes->save($items_taxes_data, $item_data['item_id']);
}
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$emp_info=$this->Employee->get_info($employee_id);
$comment ='Qty CSV Imported';
$excel_data = array
(
'trans_items'=>$item_data['item_id'],
'trans_user'=>$employee_id,
'trans_comment'=>$comment,
'trans_inventory'=>$data[10]
);
$this->db->insert('inventory',$excel_data);
//------------------------------------------------Ramel
}
else//insert or update item failure
{
$failCodes[] = $i;
}
}
$i++;
}
else
{
echo json_encode( array('success'=>false,'message'=>'Your upload file has no data or not in supported format.') );
return;
}
}
$success = true;
if(count($failCodes) > 1)
{
$msg = "Most items imported. But some were not, here is list of their CODE (" .count($failCodes) ."): ".implode(", ", $failCodes);
$success = false;
}
else
{
$msg = "Import items successful";
}
echo json_encode( array('success'=>$success,'message'=>$msg) );
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 360;
}
}
?>

View File

@@ -1,192 +0,0 @@
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
// ---------------------------------------------------------------------
class Languagecheck extends CI_Controller {
/*
* use this language as comparison reference.
* this should be the one that is complete.
*/
private $reference = 'english';
private $lang_path = 'language';
// -----------------------------------------------------------------
/*
* controller constructor
*/
function Languagecheck()
{
parent::Controller();
}
// -----------------------------------------------------------------
/*
* use remap to capture all calls to this controller
*/
function _remap()
{
// load the required helpers
$this->load->helper('directory');
// for simplicity, we don't use views
$this->output('h1', 'Open Source Point of Sale - Language file checking and validation');
// determine the language file path
if ( ! is_dir($this->lang_path) )
{
$this->lang_path = APPPATH . $this->lang_path;
if ( ! is_dir($this->lang_path) )
{
$this->output('h2', 'Defined language path "'.$this->lang_path.'" not found!', TRUE);
exit;
}
}
// fetch the languages directory map
$languages = directory_map( $this->lang_path, TRUE );
// is our reference language present?
if ( ! in_array($this->reference, $languages ) )
{
$this->output('h2', 'Reference language "'.$this->reference.'" not found!', TRUE);
exit;
}
// load the list of language files for the reference language
$references = directory_map( $this->lang_path . '/' . $this->reference, TRUE );
// now process the list
foreach( $references as $reference )
{
// skip non-language files in the language directory
if ( strpos($reference, '_lang'.EXT) === FALSE )
{
continue;
}
// process it
$this->output('h2', 'Processing '.$this->reference . ' &raquo; ' .$reference);
// load the language file
include $this->lang_path . '/' . $this->reference . '/' . $reference;
// did the file contain any language strings?
if ( empty($lang) )
{
// language file was empty or not properly defined
$this->output('h3', 'Language file doesn\'t contain any language strings. Skipping file!', TRUE);
continue;
}
// store the loaded language strings
$lang_ref = $lang;
unset($lang);
// now loop through the available languages
foreach ( $languages as $language )
{
// skip the reference language
if ( $language == $this->reference )
{
continue;
}
// language file to check
$file = $this->lang_path . '/' . $language . '/' . $reference;
// check if the language file exists for this language
if ( ! file_exists( $file ) )
{
// file not found
$this->output('h3', 'Language file doesn\'t exist for the language '.$language.'!', TRUE);
}
else
{
// load the file to compare
include $file;
// did the file contain any language strings?
if ( empty($lang) )
{
// language file was empty or not properly defined
$this->output('h3', 'Language file for the language '.$language.' doesn\'t contain any language strings!', TRUE);
}
else
{
// start comparing
$this->output('h3', 'Comparing with the '.$language.' version:');
// assume all goes well
$failures = 0;
// start comparing language keys
foreach( $lang_ref as $key => $value )
{
if ( ! isset($lang[$key]) )
{
// report the missing key
$this->output('', 'Missing language string "'.$key.'"', TRUE);
// increment the failure counter
$failures++;
}
}
if ( ! $failures )
{
$this->output('', 'The two language files have matching strings.');
}
}
// make sure the lang array is deleted before the next check
if ( isset($lang) )
{
unset($lang);
}
}
}
}
$this->output('h2', 'Language file checking and validation completed');
}
// -----------------------------------------------------------------
private function output($type = '', $line = '', $highlight = FALSE)
{
switch ($type)
{
case 'h1':
$html = "<h1>{line}</h1>\n<hr />\n";
break;
case 'h2':
$html = "<h2>{line}</h2>\n";
break;
case 'h3':
$html = "<h3>&nbsp;&nbsp;&nbsp;{line}</h3>\n";
break;
default:
$html = "&nbsp;&nbsp;&nbsp;&nbsp;&raquo;&nbsp;{line}<br />";
break;
}
if ( $highlight )
{
$line = '<span style="color:red;font-weight:bold;">' . $line . '</span>';
}
echo str_replace('{line}', $line, $html);
}
// -----------------------------------------------------------------
}
/* End of file languagecheck.php */
/* Location: ./application/controllers/languagecheck.php */

View File

@@ -1,43 +0,0 @@
<?php
class Login extends CI_Controller
{
function __construct()
{
parent::__construct();
}
function index()
{
if($this->Employee->is_logged_in())
{
redirect('home');
}
else
{
$this->form_validation->set_rules('username', 'lang:login_undername', 'callback_login_check');
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
if($this->form_validation->run() == FALSE)
{
$this->load->view('login');
}
else
{
redirect('home');
}
}
}
function login_check($username)
{
$password = $this->input->post("password");
if(!$this->Employee->login($username,$password))
{
$this->form_validation->set_message('login_check', $this->lang->line('login_invalid_username_and_password'));
return false;
}
return true;
}
}
?>

View File

@@ -1,15 +0,0 @@
<?php
class No_Access extends CI_Controller
{
function __construct()
{
parent::__construct();
}
function index($module_id='')
{
$data['module_name']=$this->Module->get_module_name($module_id);
$this->load->view('no_access',$data);
}
}
?>

View File

@@ -1,54 +0,0 @@
<?php
require_once ("interfaces/iperson_controller.php");
require_once ("secure_area.php");
abstract class Person_controller extends Secure_area implements iPerson_controller
{
function __construct($module_id=null)
{
parent::__construct($module_id);
}
/*
This returns a mailto link for persons with a certain id. This is called with AJAX.
*/
function mailto()
{
$people_to_email=$this->input->post('ids');
if($people_to_email!=false)
{
$mailto_url='mailto:';
foreach($this->Person->get_multiple_info($people_to_email)->result() as $person)
{
$mailto_url.=$person->email.',';
}
//remove last comma
$mailto_url=substr($mailto_url,0,strlen($mailto_url)-1);
echo $mailto_url;
exit;
}
echo '#';
}
/** GARRISON ADDED 4/25/2013 IN PROGRESS **/
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Person->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/*
Gets one row for a person manage table. This is called using AJAX to update one row.
*/
function get_row()
{
$person_id = $this->input->post('row_id');
$data_row=get_person_data_row($this->Person->get_info($person_id),$this);
echo $data_row;
}
}
?>

View File

@@ -1,199 +0,0 @@
<?php
require_once ("secure_area.php");
class Receivings extends Secure_area
{
function __construct()
{
parent::__construct('receivings');
$this->load->library('receiving_lib');
}
function index()
{
$this->_reload();
}
function item_search()
{
$suggestions = $this->Item->get_item_search_suggestions($this->input->post('q'),$this->input->post('limit'));
$suggestions = array_merge($suggestions, $this->Item_kit->get_item_kit_search_suggestions($this->input->post('q'),$this->input->post('limit')));
echo implode("\n",$suggestions);
}
function supplier_search()
{
$suggestions = $this->Supplier->get_suppliers_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
function select_supplier()
{
$supplier_id = $this->input->post("supplier");
$this->receiving_lib->set_supplier($supplier_id);
$this->_reload();
}
function change_mode()
{
$mode = $this->input->post("mode");
$this->receiving_lib->set_mode($mode);
$this->_reload();
}
function add()
{
$data=array();
$mode = $this->receiving_lib->get_mode();
$item_id_or_number_or_item_kit_or_receipt = $this->input->post("item");
$quantity = $mode=="receive" ? 1:-1;
if($this->receiving_lib->is_valid_receipt($item_id_or_number_or_item_kit_or_receipt) && $mode=='return')
{
$this->receiving_lib->return_entire_receiving($item_id_or_number_or_item_kit_or_receipt);
}
elseif($this->receiving_lib->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt))
{
$this->receiving_lib->add_item_kit($item_id_or_number_or_item_kit_or_receipt);
}
elseif(!$this->receiving_lib->add_item($item_id_or_number_or_item_kit_or_receipt,$quantity))
{
$data['error']=$this->lang->line('recvs_unable_to_add_item');
}
$this->_reload($data);
}
function edit_item($item_id)
{
$data= array();
$this->form_validation->set_rules('price', 'lang:items_price', 'required|numeric');
$this->form_validation->set_rules('quantity', 'lang:items_quantity', 'required|integer');
$this->form_validation->set_rules('discount', 'lang:items_discount', 'required|integer');
$description = $this->input->post("description");
$serialnumber = $this->input->post("serialnumber");
$price = $this->input->post("price");
$quantity = $this->input->post("quantity");
$discount = $this->input->post("discount");
if ($this->form_validation->run() != FALSE)
{
$this->receiving_lib->edit_item($item_id,$description,$serialnumber,$quantity,$discount,$price);
}
else
{
$data['error']=$this->lang->line('recvs_error_editing_item');
}
$this->_reload($data);
}
function delete_item($item_number)
{
$this->receiving_lib->delete_item($item_number);
$this->_reload();
}
function delete_supplier()
{
$this->receiving_lib->delete_supplier();
$this->_reload();
}
function complete()
{
$data['cart']=$this->receiving_lib->get_cart();
$data['total']=$this->receiving_lib->get_total();
$data['receipt_title']=$this->lang->line('recvs_receipt');
$data['transaction_time']= date('m/d/Y h:i:s a');
$supplier_id=$this->receiving_lib->get_supplier();
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$comment = $this->input->post('comment');
$emp_info=$this->Employee->get_info($employee_id);
$payment_type = $this->input->post('payment_type');
$data['payment_type']=$this->input->post('payment_type');
if ($this->input->post('amount_tendered'))
{
$data['amount_tendered'] = $this->input->post('amount_tendered');
$data['amount_change'] = to_currency($data['amount_tendered'] - round($data['total'], 2));
}
$data['employee']=$emp_info->first_name.' '.$emp_info->last_name;
if($supplier_id!=-1)
{
$suppl_info=$this->Supplier->get_info($supplier_id);
$data['supplier']=$suppl_info->first_name.' '.$suppl_info->last_name;
}
//SAVE receiving to database
$data['receiving_id']='RECV '.$this->Receiving->save($data['cart'], $supplier_id,$employee_id,$comment,$payment_type);
if ($data['receiving_id'] == 'RECV -1')
{
$data['error_message'] = $this->lang->line('receivings_transaction_failed');
}
$this->load->view("receivings/receipt",$data);
$this->receiving_lib->clear_all();
$this->_remove_duplicate_cookies();
}
function receipt($receiving_id)
{
$receiving_info = $this->Receiving->get_info($receiving_id)->row_array();
$this->receiving_lib->copy_entire_receiving($receiving_id);
$data['cart']=$this->receiving_lib->get_cart();
$data['total']=$this->receiving_lib->get_total();
$data['receipt_title']=$this->lang->line('recvs_receipt');
$data['transaction_time']= date('m/d/Y h:i:s a', strtotime($receiving_info['receiving_time']));
$supplier_id=$this->receiving_lib->get_supplier();
$emp_info=$this->Employee->get_info($receiving_info['employee_id']);
$data['payment_type']=$receiving_info['payment_type'];
$data['employee']=$emp_info->first_name.' '.$emp_info->last_name;
if($supplier_id!=-1)
{
$supplier_info=$this->Supplier->get_info($supplier_id);
$data['supplier']=$supplier_info->first_name.' '.$supplier_info->last_name;
}
$data['receiving_id']='RECV '.$receiving_id;
$this->load->view("receivings/receipt",$data);
$this->receiving_lib->clear_all();
$this->_remove_duplicate_cookies();
}
function _reload($data=array())
{
$person_info = $this->Employee->get_logged_in_employee_info();
$data['cart']=$this->receiving_lib->get_cart();
$data['modes']=array('receive'=>$this->lang->line('recvs_receiving'),'return'=>$this->lang->line('recvs_return'));
$data['mode']=$this->receiving_lib->get_mode();
$data['total']=$this->receiving_lib->get_total();
$data['items_module_allowed'] = $this->Employee->has_permission('items', $person_info->person_id);
$data['payment_options']=array(
$this->lang->line('sales_cash') => $this->lang->line('sales_cash'),
$this->lang->line('sales_check') => $this->lang->line('sales_check'),
$this->lang->line('sales_debit') => $this->lang->line('sales_debit'),
$this->lang->line('sales_credit') => $this->lang->line('sales_credit')
);
$supplier_id=$this->receiving_lib->get_supplier();
if($supplier_id!=-1)
{
$info=$this->Supplier->get_info($supplier_id);
$data['supplier']=$info->first_name.' '.$info->last_name;
}
$this->load->view("receivings/receiving",$data);
$this->_remove_duplicate_cookies();
}
function cancel_receiving()
{
$this->receiving_lib->clear_all();
$this->_reload();
}
}
?>

View File

@@ -1,917 +0,0 @@
<?php
require_once ("secure_area.php");
require_once (APPPATH."libraries/ofc-library/open-flash-chart.php");
define("FORM_WIDTH", "400");
class Reports extends Secure_area
{
function __construct()
{
parent::__construct('reports');
$this->load->helper('report');
}
//Initial report listing screen
function index()
{
$this->load->view("reports/listing",array());
}
function _get_common_report_data()
{
$data = array();
$data['report_date_range_simple'] = get_simple_date_ranges();
$data['months'] = get_months();
$data['days'] = get_days();
$data['years'] = get_years();
$data['selected_month']=date('n');
$data['selected_day']=date('d');
$data['selected_year']=date('Y');
return $data;
}
//Input for reports that require only a date range and an export to excel. (see routes.php to see that all summary reports route here)
function date_input_excel_export()
{
$data = $this->_get_common_report_data();
$this->load->view("reports/date_input_excel_export",$data);
}
function get_detailed_sales_row($sale_id, $sale_type=1)
{
$this->load->model('reports/Detailed_sales');
$model = $this->Detailed_sales;
$report_data = $model->getDataBySaleId($sale_id, $sale_type);
$summary_data = array(anchor('sales/edit/'.$report_data['sale_id'] . '/width:'.FORM_WIDTH,
'POS '.$report_data['sale_id'],
array('class' => 'thickbox')),
$report_data['sale_date'],
$report_data['items_purchased'],
$report_data['employee_name'],
$report_data['customer_name'],
to_currency($report_data['subtotal']),
to_currency($report_data['total']),
to_currency($report_data['tax']),
to_currency($report_data['profit']),
$report_data['payment_type'],
$report_data['comment']);
echo get_detailed_sales_data_row($summary_data, $this);
}
function get_summary_data($start_date, $end_date = NULL, $sale_type=0)
{
$end_date = $end_date ?: $start_date;
$this->load->model('reports/Summary_sales');
$model = $this->Summary_sales;
$summary = $model->getSummaryData(array(
'start_date'=>$start_date,
'end_date'=>$end_date,
'sale_type' => $sale_type));
echo get_sales_summary_totals($summary, $this);
}
//Summary sales report
function summary_sales($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_sales');
$model = $this->Summary_sales;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['sale_date'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_sales_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary categories report
function summary_categories($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_categories');
$model = $this->Summary_categories;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['category'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_categories_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary customers report
function summary_customers($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_customers');
$model = $this->Summary_customers;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['customer'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_customers_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary suppliers report
function summary_suppliers($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_suppliers');
$model = $this->Summary_suppliers;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['supplier'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_suppliers_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary items report
function summary_items($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_items');
$model = $this->Summary_items;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array(character_limiter($row['name'], 16), $row['quantity_purchased'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_items_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary employees report
function summary_employees($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_employees');
$model = $this->Summary_employees;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['employee'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']));
}
$data = array(
"title" => $this->lang->line('reports_employees_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary taxes report
function summary_taxes($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_taxes');
$model = $this->Summary_taxes;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['percent'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']));
}
$data = array(
"title" => $this->lang->line('reports_taxes_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Summary discounts report
function summary_discounts($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_discounts');
$model = $this->Summary_discounts;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['discount_percent'],$row['count']);
}
$data = array(
"title" => $this->lang->line('reports_discounts_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
function summary_payments($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Summary_payments');
$model = $this->Summary_payments;
$tabular_data = array();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
foreach($report_data as $row)
{
$tabular_data[] = array($row['payment_type'],to_currency($row['payment_amount']));
}
$data = array(
"title" => $this->lang->line('reports_payments_summary_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
//Input for reports that require only a date range. (see routes.php to see that all graphical summary reports route here)
function date_input()
{
$data = $this->_get_common_report_data();
$this->load->view("reports/date_input",$data);
}
//Graphical summary sales report
function graphical_summary_sales($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_sales');
$model = $this->Summary_sales;
$data = array(
"title" => $this->lang->line('reports_sales_summary_report'),
"data_file" => site_url("reports/graphical_summary_sales_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_sales_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_sales');
$model = $this->Summary_sales;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[date('m/d/Y', strtotime($row['sale_date']))]= $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_sales_summary_report'),
"yaxis_label"=>$this->lang->line('reports_revenue'),
"xaxis_label"=>$this->lang->line('reports_date'),
"data" => $graph_data
);
$this->load->view("reports/graphs/line",$data);
}
//Graphical summary items report
function graphical_summary_items($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_items');
$model = $this->Summary_items;
$data = array(
"title" => $this->lang->line('reports_items_summary_report'),
"data_file" => site_url("reports/graphical_summary_items_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_items_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_items');
$model = $this->Summary_items;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['name']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_items_summary_report'),
"xaxis_label"=>$this->lang->line('reports_revenue'),
"yaxis_label"=>$this->lang->line('reports_items'),
"data" => $graph_data
);
$this->load->view("reports/graphs/hbar",$data);
}
//Graphical summary customers report
function graphical_summary_categories($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_categories');
$model = $this->Summary_categories;
$data = array(
"title" => $this->lang->line('reports_categories_summary_report'),
"data_file" => site_url("reports/graphical_summary_categories_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_categories_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_categories');
$model = $this->Summary_categories;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['category']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_categories_summary_report'),
"data" => $graph_data
);
$this->load->view("reports/graphs/pie",$data);
}
function graphical_summary_suppliers($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_suppliers');
$model = $this->Summary_suppliers;
$data = array(
"title" => $this->lang->line('reports_suppliers_summary_report'),
"data_file" => site_url("reports/graphical_summary_suppliers_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_suppliers_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_suppliers');
$model = $this->Summary_suppliers;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['supplier']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_suppliers_summary_report'),
"data" => $graph_data
);
$this->load->view("reports/graphs/pie",$data);
}
function graphical_summary_employees($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_employees');
$model = $this->Summary_employees;
$data = array(
"title" => $this->lang->line('reports_employees_summary_report'),
"data_file" => site_url("reports/graphical_summary_employees_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_employees_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_employees');
$model = $this->Summary_employees;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['employee']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_employees_summary_report'),
"data" => $graph_data
);
$this->load->view("reports/graphs/pie",$data);
}
function graphical_summary_taxes($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_taxes');
$model = $this->Summary_taxes;
$data = array(
"title" => $this->lang->line('reports_taxes_summary_report'),
"data_file" => site_url("reports/graphical_summary_taxes_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_taxes_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_taxes');
$model = $this->Summary_taxes;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['percent']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_taxes_summary_report'),
"data" => $graph_data
);
$this->load->view("reports/graphs/pie",$data);
}
//Graphical summary customers report
function graphical_summary_customers($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_customers');
$model = $this->Summary_customers;
$data = array(
"title" => $this->lang->line('reports_customers_summary_report'),
"data_file" => site_url("reports/graphical_summary_customers_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_customers_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_customers');
$model = $this->Summary_customers;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['customer']] = $row['total'];
}
$data = array(
"title" => $this->lang->line('reports_customers_summary_report'),
"xaxis_label"=>$this->lang->line('reports_revenue'),
"yaxis_label"=>$this->lang->line('reports_customers'),
"data" => $graph_data
);
$this->load->view("reports/graphs/hbar",$data);
}
//Graphical summary discounts report
function graphical_summary_discounts($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_discounts');
$model = $this->Summary_discounts;
$data = array(
"title" => $this->lang->line('reports_discounts_summary_report'),
"data_file" => site_url("reports/graphical_summary_discounts_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_discounts_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_discounts');
$model = $this->Summary_discounts;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['discount_percent']] = $row['count'];
}
$data = array(
"title" => $this->lang->line('reports_discounts_summary_report'),
"yaxis_label"=>$this->lang->line('reports_count'),
"xaxis_label"=>$this->lang->line('reports_discount_percent'),
"data" => $graph_data
);
$this->load->view("reports/graphs/bar",$data);
}
function graphical_summary_payments($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_payments');
$model = $this->Summary_payments;
$data = array(
"title" => $this->lang->line('reports_payments_summary_report'),
"data_file" => site_url("reports/graphical_summary_payments_graph/$start_date/$end_date/$sale_type"),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type))
);
$this->load->view("reports/graphical",$data);
}
//The actual graph data
function graphical_summary_payments_graph($start_date, $end_date, $sale_type)
{
$this->load->model('reports/Summary_payments');
$model = $this->Summary_payments;
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$graph_data = array();
foreach($report_data as $row)
{
$graph_data[$row['payment_type']] = $row['payment_amount'];
}
$data = array(
"title" => $this->lang->line('reports_payments_summary_report'),
"yaxis_label"=>$this->lang->line('reports_revenue'),
"xaxis_label"=>$this->lang->line('reports_payment_type'),
"data" => $graph_data
);
$this->load->view("reports/graphs/pie",$data);
}
function specific_customer_input()
{
$data = $this->_get_common_report_data();
$data['specific_input_name'] = $this->lang->line('reports_customer');
$customers = array();
foreach($this->Customer->get_all()->result() as $customer)
{
$customers[$customer->person_id] = $customer->first_name .' '.$customer->last_name;
}
$data['specific_input_data'] = $customers;
$this->load->view("reports/specific_input",$data);
}
function specific_customer($start_date, $end_date, $customer_id, $sale_type, $export_excel=0)
{
$this->load->model('reports/Specific_customer');
$model = $this->Specific_customer;
$headers = $model->getDataColumns();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'customer_id' =>$customer_id, 'sale_type' => $sale_type));
$summary_data = array();
$details_data = array();
foreach($report_data['summary'] as $key=>$row)
{
$summary_data[] = array(anchor('sales/edit/'.$row['sale_id'], 'POS '.$row['sale_id'], array('target' => '_blank')), $row['sale_date'], $row['items_purchased'], $row['employee_name'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']), $row['payment_type'], $row['comment']);
foreach($report_data['details'][$key] as $drow)
{
$details_data[$key][] = array($drow['name'], $drow['category'], $drow['serialnumber'], $drow['description'], $drow['quantity_purchased'], to_currency($drow['subtotal']), to_currency($drow['total']), to_currency($drow['tax']),to_currency($drow['profit']), $drow['discount_percent'].'%');
}
}
$customer_info = $this->Customer->get_info($customer_id);
$data = array(
"title" => $customer_info->first_name .' '. $customer_info->last_name.' '.$this->lang->line('reports_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"summary_data" => $summary_data,
"details_data" => $details_data,
"overall_summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date,'customer_id' =>$customer_id, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular_details",$data);
}
function specific_employee_input()
{
$data = $this->_get_common_report_data();
$data['specific_input_name'] = $this->lang->line('reports_employee');
$employees = array();
foreach($this->Employee->get_all()->result() as $employee)
{
$employees[$employee->person_id] = $employee->first_name .' '.$employee->last_name;
}
$data['specific_input_data'] = $employees;
$this->load->view("reports/specific_input",$data);
}
function specific_employee($start_date, $end_date, $employee_id, $sale_type, $export_excel=0)
{
$this->load->model('reports/Specific_employee');
$model = $this->Specific_employee;
$headers = $model->getDataColumns();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'employee_id' =>$employee_id, 'sale_type' => $sale_type));
$summary_data = array();
$details_data = array();
foreach($report_data['summary'] as $key=>$row)
{
$summary_data[] = array(anchor('sales/edit/'.$row['sale_id'], 'POS '.$row['sale_id'], array('target' => '_blank')), $row['sale_date'], $row['items_purchased'], $row['customer_name'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']), $row['payment_type'], $row['comment']);
foreach($report_data['details'][$key] as $drow)
{
$details_data[$key][] = array($drow['name'], $drow['category'], $drow['serialnumber'], $drow['description'], $drow['quantity_purchased'], to_currency($drow['subtotal']), to_currency($drow['total']), to_currency($drow['tax']),to_currency($drow['profit']), $drow['discount_percent'].'%');
}
}
$employee_info = $this->Employee->get_info($employee_id);
$data = array(
"title" => $employee_info->first_name .' '. $employee_info->last_name.' '.$this->lang->line('reports_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"summary_data" => $summary_data,
"details_data" => $details_data,
"overall_summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date,'employee_id' =>$employee_id, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular_details",$data);
}
function specific_discount_input()
{
$data = $this->_get_common_report_data();
$data['specific_input_name'] = $this->lang->line('reports_discount');
$discounts = array();
for($i = 0; $i <= 100; $i += 10)
{
$discounts[$i] = $i . '%';
}
$data['specific_input_data'] = $discounts;
$this->load->view("reports/specific_input",$data);
}
function specific_discount($start_date, $end_date, $discount, $sale_type, $export_excel = 0)
{
$this->load->model('reports/Specific_discount');
$model = $this->Specific_discount;
$headers = $model->getDataColumns();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'discount' =>$discount, 'sale_type' => $sale_type));
$summary_data = array();
$details_data = array();
foreach($report_data['summary'] as $key=>$row)
{
$summary_data[] = array(anchor('sales/receipt/'.$row['sale_id'], 'POS '.$row['sale_id'], array('target' => '_blank')), $row['sale_date'], $row['items_purchased'], $row['customer_name'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),/*to_currency($row['profit']),*/ $row['payment_type'], $row['comment']);
foreach($report_data['details'][$key] as $drow)
{
$details_data[$key][] = array($drow['name'], $drow['category'], $drow['description'], $drow['quantity_purchased'], to_currency($drow['subtotal']), to_currency($drow['total']), to_currency($drow['tax']),/*to_currency($drow['profit']),*/ $drow['discount_percent'].'%');
}
}
$data = array(
"title" => $discount. '% '.$this->lang->line('reports_discount') . ' ' . $this->lang->line('reports_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $headers,
"summary_data" => $summary_data,
"details_data" => $details_data,
"header_width" => intval(100 / count($headers['summary'])),
"overall_summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date,'discount' =>$discount, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular_details",$data);
}
function detailed_sales($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Detailed_sales');
$model = $this->Detailed_sales;
$headers = $model->getDataColumns();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$summary_data = array();
$details_data = array();
foreach($report_data['summary'] as $key=>$row)
{
$summary_data[] = array(anchor('sales/edit/'.$row['sale_id'] . '/width:'.FORM_WIDTH, 'POS '.$row['sale_id'], array('class' => 'thickbox')), $row['sale_date'], $row['items_purchased'], $row['employee_name'], $row['customer_name'], to_currency($row['subtotal']), to_currency($row['total']), to_currency($row['tax']),to_currency($row['profit']), $row['payment_type'], $row['comment']);
foreach($report_data['details'][$key] as $drow)
{
$details_data[$key][] = array($drow['name'], $drow['category'], $drow['serialnumber'], $drow['description'], $drow['quantity_purchased'], to_currency($drow['subtotal']), to_currency($drow['total']), to_currency($drow['tax']),to_currency($drow['profit']), $drow['discount_percent'].'%');
}
}
$data = array(
"title" =>$this->lang->line('reports_detailed_sales_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"editable" => true,
"summary_data" => $summary_data,
"details_data" => $details_data,
"header_width" => intval(100 / count($headers['summary'])),
"overall_summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular_details",$data);
}
function detailed_receivings($start_date, $end_date, $sale_type, $export_excel=0)
{
$this->load->model('reports/Detailed_receivings');
$model = $this->Detailed_receivings;
$headers = $model->getDataColumns();
$report_data = $model->getData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type));
$summary_data = array();
$details_data = array();
foreach($report_data['summary'] as $key=>$row)
{
$summary_data[] = array(anchor('receivings/receipt/'.$row['receiving_id'], 'RECV '.$row['receiving_id'], array('target' => '_blank')), $row['receiving_date'], $row['items_purchased'], $row['employee_name'], $row['supplier_name'], to_currency($row['total']), $row['payment_type'], $row['comment']);
foreach($report_data['details'][$key] as $drow)
{
$details_data[$key][] = array($drow['name'], $drow['category'], $drow['quantity_purchased'], to_currency($drow['total']), $drow['discount_percent'].'%');
}
}
$data = array(
"title" =>$this->lang->line('reports_detailed_receivings_report'),
"subtitle" => date('m/d/Y', strtotime($start_date)) .'-'.date('m/d/Y', strtotime($end_date)),
"headers" => $model->getDataColumns(),
"summary_data" => $summary_data,
"details_data" => $details_data,
"overall_summary_data" => $model->getSummaryData(array('start_date'=>$start_date, 'end_date'=>$end_date, 'sale_type' => $sale_type)),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular_details",$data);
}
function excel_export()
{
$this->load->view("reports/excel_export",array());
}
function inventory_low($export_excel=0)
{
$this->load->model('reports/Inventory_low');
$model = $this->Inventory_low;
$tabular_data = array();
$report_data = $model->getData(array());
foreach($report_data as $row)
{
$tabular_data[] = array($row['name'], $row['item_number'], $row['description'], $row['quantity'], $row['reorder_level']);
}
$data = array(
"title" => $this->lang->line('reports_low_inventory_report'),
"subtitle" => '',
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array()),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
function inventory_summary($export_excel=0)
{
$this->load->model('reports/Inventory_summary');
$model = $this->Inventory_summary;
$tabular_data = array();
$report_data = $model->getData(array());
foreach($report_data as $row)
{
$tabular_data[] = array($row['name'], $row['item_number'], $row['description'], $row['quantity'], $row['reorder_level']);
}
$data = array(
"title" => $this->lang->line('reports_inventory_summary_report'),
"subtitle" => '',
"headers" => $model->getDataColumns(),
"data" => $tabular_data,
"summary_data" => $model->getSummaryData(array()),
"export_excel" => $export_excel
);
$this->load->view("reports/tabular",$data);
}
}
?>

View File

@@ -1,441 +0,0 @@
<?php
require_once ("secure_area.php");
class Sales extends Secure_area
{
function __construct()
{
parent::__construct('sales');
$this->load->library('sale_lib');
}
function index()
{
$this->_reload();
}
function item_search()
{
$suggestions = $this->Item->get_item_search_suggestions($this->input->post('q'),$this->input->post('limit'));
$suggestions = array_merge($suggestions, $this->Item_kit->get_item_kit_search_suggestions($this->input->post('q'),$this->input->post('limit')));
echo implode("\n",$suggestions);
}
function customer_search()
{
$suggestions = $this->Customer->get_customer_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
function select_customer()
{
$customer_id = $this->input->post("customer");
$this->sale_lib->set_customer($customer_id);
$this->_reload();
}
function change_mode()
{
$mode = $this->input->post("mode");
$this->sale_lib->set_mode($mode);
$this->_reload();
}
function set_comment()
{
$this->sale_lib->set_comment($this->input->post('comment'));
}
function set_email_receipt()
{
$this->sale_lib->set_email_receipt($this->input->post('email_receipt'));
}
//Alain Multiple Payments
function add_payment()
{
$data = array();
$this->form_validation->set_rules( 'amount_tendered', 'lang:sales_amount_tendered', 'numeric' );
if ( $this->form_validation->run() == FALSE )
{
if ( $this->input->post( 'payment_type' ) == $this->lang->line( 'sales_gift_card' ) )
$data['error']=$this->lang->line('sales_must_enter_numeric_giftcard');
else
$data['error']=$this->lang->line('sales_must_enter_numeric');
$this->_reload( $data );
return;
}
$payment_type = $this->input->post( 'payment_type' );
if ( $payment_type == $this->lang->line( 'sales_giftcard' ) )
{
$payments = $this->sale_lib->get_payments();
$payment_type = $this->input->post( 'payment_type' ) . ':' . $payment_amount = $this->input->post( 'amount_tendered' );
$current_payments_with_giftcard = isset( $payments[$payment_type] ) ? $payments[$payment_type]['payment_amount'] : 0;
$cur_giftcard_value = $this->Giftcard->get_giftcard_value( $this->input->post( 'amount_tendered' ) ) - $current_payments_with_giftcard;
if ( $cur_giftcard_value <= 0 )
{
$data['error'] = 'Giftcard balance is ' . to_currency( $this->Giftcard->get_giftcard_value( $this->input->post( 'amount_tendered' ) ) ) . ' !';
$this->_reload( $data );
return;
}
$new_giftcard_value = $this->Giftcard->get_giftcard_value( $this->input->post( 'amount_tendered' ) ) - $this->sale_lib->get_amount_due( );
$new_giftcard_value = ( $new_giftcard_value >= 0 ) ? $new_giftcard_value : 0;
$data['warning'] = 'Giftcard ' . $this->input->post( 'amount_tendered' ) . ' balance is ' . to_currency( $new_giftcard_value ) . ' !';
$payment_amount = min( $this->sale_lib->get_amount_due( ), $this->Giftcard->get_giftcard_value( $this->input->post( 'amount_tendered' ) ) );
}
else
{
$payment_amount = $this->input->post( 'amount_tendered' );
}
if( !$this->sale_lib->add_payment( $payment_type, $payment_amount ) )
{
$data['error']='Unable to Add Payment! Please try again!';
}
$this->_reload($data);
}
//Alain Multiple Payments
function delete_payment( $payment_id )
{
$this->sale_lib->delete_payment( $payment_id );
$this->_reload();
}
function add()
{
$data=array();
$mode = $this->sale_lib->get_mode();
$item_id_or_number_or_item_kit_or_receipt = $this->input->post("item");
$quantity = $mode=="sale" ? 1:-1;
if($this->sale_lib->is_valid_receipt($item_id_or_number_or_item_kit_or_receipt) && $mode=='return')
{
$this->sale_lib->return_entire_sale($item_id_or_number_or_item_kit_or_receipt);
}
elseif($this->sale_lib->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt))
{
$this->sale_lib->add_item_kit($item_id_or_number_or_item_kit_or_receipt);
}
elseif(!$this->sale_lib->add_item($item_id_or_number_or_item_kit_or_receipt,$quantity))
{
$data['error']=$this->lang->line('sales_unable_to_add_item');
}
if($this->sale_lib->out_of_stock($item_id_or_number_or_item_kit_or_receipt))
{
$data['warning'] = $this->lang->line('sales_quantity_less_than_zero');
}
$this->_reload($data);
}
function edit_item($line)
{
$data= array();
$this->form_validation->set_rules('price', 'lang:items_price', 'required|numeric');
$this->form_validation->set_rules('quantity', 'lang:items_quantity', 'required|numeric');
$description = $this->input->post("description");
$serialnumber = $this->input->post("serialnumber");
$price = $this->input->post("price");
$quantity = $this->input->post("quantity");
$discount = $this->input->post("discount");
if ($this->form_validation->run() != FALSE)
{
$this->sale_lib->edit_item($line,$description,$serialnumber,$quantity,$discount,$price);
}
else
{
$data['error']=$this->lang->line('sales_error_editing_item');
}
if($this->sale_lib->out_of_stock($this->sale_lib->get_item_id($line)))
{
$data['warning'] = $this->lang->line('sales_quantity_less_than_zero');
}
$this->_reload($data);
}
function delete_item($item_number)
{
$this->sale_lib->delete_item($item_number);
$this->_reload();
}
function remove_customer()
{
$this->sale_lib->remove_customer();
$this->_reload();
}
function complete()
{
$data['cart']=$this->sale_lib->get_cart();
$data['subtotal']=$this->sale_lib->get_subtotal();
$data['taxes']=$this->sale_lib->get_taxes();
$data['total']=$this->sale_lib->get_total();
$data['receipt_title']=$this->lang->line('sales_receipt');
$data['transaction_time']= date('m/d/Y h:i:s a');
$customer_id=$this->sale_lib->get_customer();
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$comment = $this->sale_lib->get_comment();
$emp_info=$this->Employee->get_info($employee_id);
$data['payments']=$this->sale_lib->get_payments();
$data['amount_change']=to_currency($this->sale_lib->get_amount_due() * -1);
$data['employee']=$emp_info->first_name.' '.$emp_info->last_name;
if($customer_id!=-1)
{
$cust_info=$this->Customer->get_info($customer_id);
$data['customer']=$cust_info->first_name.' '.$cust_info->last_name;
}
//SAVE sale to database
$data['sale_id']='POS '.$this->Sale->save($data['cart'], $customer_id,$employee_id,$comment,$data['payments']);
if ($data['sale_id'] == 'POS -1')
{
$data['error_message'] = $this->lang->line('sales_transaction_failed');
}
else
{
if ($this->sale_lib->get_email_receipt() && !empty($cust_info->email))
{
$this->load->library('email');
$config['mailtype'] = 'html';
$this->email->initialize($config);
$this->email->from($this->config->item('email'), $this->config->item('company'));
$this->email->to($cust_info->email);
$this->email->subject($this->lang->line('sales_receipt'));
$this->email->message($this->load->view("sales/receipt_email",$data, true));
$this->email->send();
}
}
$this->load->view("sales/receipt",$data);
$this->sale_lib->clear_all();
$this->_remove_duplicate_cookies();
}
function receipt($sale_id)
{
$sale_info = $this->Sale->get_info($sale_id)->row_array();
$this->sale_lib->copy_entire_sale($sale_id);
$data['cart']=$this->sale_lib->get_cart();
$data['payments']=$this->sale_lib->get_payments();
$data['subtotal']=$this->sale_lib->get_subtotal();
$data['taxes']=$this->sale_lib->get_taxes();
$data['total']=$this->sale_lib->get_total();
$data['receipt_title']=$this->lang->line('sales_receipt');
$data['transaction_time']= date('m/d/Y h:i:s a', strtotime($sale_info['sale_time']));
$customer_id=$this->sale_lib->get_customer();
$emp_info=$this->Employee->get_info($sale_info['employee_id']);
$data['payment_type']=$sale_info['payment_type'];
$data['amount_change']=to_currency($this->sale_lib->get_amount_due() * -1);
$data['employee']=$emp_info->first_name.' '.$emp_info->last_name;
if($customer_id!=-1)
{
$cust_info=$this->Customer->get_info($customer_id);
$data['customer']=$cust_info->first_name.' '.$cust_info->last_name;
}
$data['sale_id']='POS '.$sale_id;
$this->load->view("sales/receipt",$data);
$this->sale_lib->clear_all();
$this->_remove_duplicate_cookies();
}
function edit($sale_id)
{
$data = array();
$data['customers'] = array('' => 'No Customer');
foreach ($this->Customer->get_all()->result() as $customer)
{
$data['customers'][$customer->person_id] = $customer->first_name . ' '. $customer->last_name;
}
$data['employees'] = array();
foreach ($this->Employee->get_all()->result() as $employee)
{
$data['employees'][$employee->person_id] = $employee->first_name . ' '. $employee->last_name;
}
$sale_info = $this->Sale->get_info($sale_id)->row_array();
$person_name = $sale_info['first_name'] . " " . $sale_info['last_name'];
$data['selected_customer'] = !empty($sale_info['customer_id']) ? $sale_info['customer_id'] . "|" . $person_name : "";
$data['sale_info'] = $sale_info;
$this->load->view('sales/form', $data);
}
function delete($sale_id = -1, $update_inventory=TRUE) {
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$sale_ids= $sale_id == -1 ? $this->input->post('ids') : array($sale_id);
if($this->Sale->delete_list($sale_ids, $employee_id, $update_inventory))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('sales_delete_successful').' '.
count($sale_ids).' '.$this->lang->line('sales_one_or_multiple'),'ids'=>$sale_ids));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('sales_delete_unsuccessful')));
}
}
function save($sale_id)
{
$sale_data = array(
'sale_time' => date('Y-m-d', strtotime($this->input->post('date'))),
'customer_id' => $this->input->post('customer_id') ? $this->input->post('customer_id') : null,
'employee_id' => $this->input->post('employee_id'),
'comment' => $this->input->post('comment')
);
if ($this->Sale->update($sale_data, $sale_id))
{
echo json_encode(array(
'success'=>true,
'message'=>$this->lang->line('sales_successfully_updated'),
'id'=>$sale_id)
);
}
else
{
echo json_encode(array(
'success'=>false,
'message'=>$this->lang->line('sales_unsuccessfully_updated'),
'id'=>$sale_id)
);
}
}
function _payments_cover_total()
{
$total_payments = 0;
foreach($this->sale_lib->get_payments() as $payment)
{
$total_payments += $payment['payment_amount'];
}
/* Changed the conditional to account for floating point rounding */
if ( ( $this->sale_lib->get_mode() == 'sale' ) && ( ( to_currency_no_money( $this->sale_lib->get_total() ) - $total_payments ) > 1e-6 ) )
{
return false;
}
return true;
}
function _reload($data=array())
{
$person_info = $this->Employee->get_logged_in_employee_info();
$data['cart']=$this->sale_lib->get_cart();
$data['modes']=array('sale'=>$this->lang->line('sales_sale'),'return'=>$this->lang->line('sales_return'));
$data['mode']=$this->sale_lib->get_mode();
$data['subtotal']=$this->sale_lib->get_subtotal();
$data['taxes']=$this->sale_lib->get_taxes();
$data['total']=$this->sale_lib->get_total();
$data['items_module_allowed'] = $this->Employee->has_permission('items', $person_info->person_id);
$data['comment'] = $this->sale_lib->get_comment();
$data['email_receipt'] = $this->sale_lib->get_email_receipt();
$data['payments_total']=$this->sale_lib->get_payments_total();
$data['amount_due']=$this->sale_lib->get_amount_due();
$data['payments']=$this->sale_lib->get_payments();
$data['payment_options']=array(
$this->lang->line('sales_cash') => $this->lang->line('sales_cash'),
$this->lang->line('sales_check') => $this->lang->line('sales_check'),
$this->lang->line('sales_giftcard') => $this->lang->line('sales_giftcard'),
$this->lang->line('sales_debit') => $this->lang->line('sales_debit'),
$this->lang->line('sales_credit') => $this->lang->line('sales_credit')
);
$customer_id=$this->sale_lib->get_customer();
if($customer_id!=-1)
{
$info=$this->Customer->get_info($customer_id);
$data['customer']=$info->first_name.' '.$info->last_name;
$data['customer_email']=$info->email;
}
$data['payments_cover_total'] = $this->_payments_cover_total();
$this->load->view("sales/register",$data);
$this->_remove_duplicate_cookies();
}
function cancel_sale()
{
$this->sale_lib->clear_all();
$this->_reload();
}
function suspend()
{
$data['cart']=$this->sale_lib->get_cart();
$data['subtotal']=$this->sale_lib->get_subtotal();
$data['taxes']=$this->sale_lib->get_taxes();
$data['total']=$this->sale_lib->get_total();
$data['receipt_title']=$this->lang->line('sales_receipt');
$data['transaction_time']= date('m/d/Y h:i:s a');
$customer_id=$this->sale_lib->get_customer();
$employee_id=$this->Employee->get_logged_in_employee_info()->person_id;
$comment = $this->input->post('comment');
$emp_info=$this->Employee->get_info($employee_id);
$payment_type = $this->input->post('payment_type');
$data['payment_type']=$this->input->post('payment_type');
//Alain Multiple payments
$data['payments']=$this->sale_lib->get_payments();
$data['amount_change']=to_currency($this->sale_lib->get_amount_due() * -1);
$data['employee']=$emp_info->first_name.' '.$emp_info->last_name;
if($customer_id!=-1)
{
$cust_info=$this->Customer->get_info($customer_id);
$data['customer']=$cust_info->first_name.' '.$cust_info->last_name;
}
$total_payments = 0;
foreach($data['payments'] as $payment)
{
$total_payments += $payment['payment_amount'];
}
//SAVE sale to database
$data['sale_id']='POS '.$this->Sale_suspended->save($data['cart'], $customer_id,$employee_id,$comment,$data['payments']);
if ($data['sale_id'] == 'POS -1')
{
$data['error_message'] = $this->lang->line('sales_transaction_failed');
}
$this->sale_lib->clear_all();
$this->_reload(array('success' => $this->lang->line('sales_successfully_suspended_sale')));
}
function suspended()
{
$data = array();
$data['suspended_sales'] = $this->Sale_suspended->get_all()->result_array();
$this->load->view('sales/suspended', $data);
}
function unsuspend()
{
$sale_id = $this->input->post('suspended_sale_id');
$this->sale_lib->clear_all();
$this->sale_lib->copy_entire_suspended_sale($sale_id);
$this->Sale_suspended->delete($sale_id);
$this->_reload();
}
}
?>

View File

@@ -1,82 +0,0 @@
<?php
class Secure_area extends CI_Controller
{
/*
Controllers that are considered secure extend Secure_area, optionally a $module_id can
be set to also check if a user can access a particular module in the system.
*/
function __construct($module_id=null)
{
parent::__construct();
$this->load->model('Employee');
if(!$this->Employee->is_logged_in())
{
redirect('login');
}
if(!$this->Employee->has_permission($module_id,$this->Employee->get_logged_in_employee_info()->person_id))
{
redirect('no_access/'.$module_id);
}
//load up global data
$logged_in_employee_info=$this->Employee->get_logged_in_employee_info();
$data['allowed_modules']=$this->Module->get_allowed_modules($logged_in_employee_info->person_id);
$data['user_info']=$logged_in_employee_info;
$this->load->vars($data);
}
function _remove_duplicate_cookies ()
{
//php < 5.3 doesn't have header remove so this function will fatal error otherwise
if (function_exists('header_remove'))
{
$CI = &get_instance();
// clean up all the cookies that are set...
$headers = headers_list();
$cookies_to_output = array ();
$header_session_cookie = '';
$session_cookie_name = $CI->config->item('sess_cookie_name');
foreach ($headers as $header)
{
list ($header_type, $data) = explode (':', $header, 2);
$header_type = trim ($header_type);
$data = trim ($data);
if (strtolower ($header_type) == 'set-cookie')
{
header_remove ('Set-Cookie');
$cookie_value = current(explode (';', $data));
list ($key, $val) = explode ('=', $cookie_value);
$key = trim ($key);
if ($key == $session_cookie_name)
{
// OVERWRITE IT (yes! do it!)
$header_session_cookie = $data;
continue;
}
else
{
// Not a session related cookie, add it as normal. Might be a CSRF or some other cookie we are setting
$cookies_to_output[] = array ('header_type' => $header_type, 'data' => $data);
}
}
}
if ( ! empty ($header_session_cookie))
{
$cookies_to_output[] = array ('header_type' => 'Set-Cookie', 'data' => $header_session_cookie);
}
foreach ($cookies_to_output as $cookie)
{
header ("{$cookie['header_type']}: {$cookie['data']}", false);
}
}
}
}
?>

View File

@@ -1,131 +0,0 @@
<?php
require_once ("person_controller.php");
class Suppliers extends Person_controller
{
function __construct()
{
parent::__construct('suppliers');
}
function index()
{
$config['base_url'] = site_url('/suppliers/index');
$config['total_rows'] = $this->Supplier->count_all();
$config['per_page'] = '20';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$data['controller_name']=strtolower(get_class());
$data['form_width']=$this->get_form_width();
$data['manage_table']=get_supplier_manage_table( $this->Supplier->get_all( $config['per_page'], $this->uri->segment( $config['uri_segment'] ) ), $this );
$this->load->view('suppliers/manage',$data);
}
/*
Returns supplier table data rows. This will be called with AJAX.
*/
function search()
{
$search=$this->input->post('search');
$data_rows=get_supplier_manage_table_data_rows($this->Supplier->search($search),$this);
echo $data_rows;
}
/*
Gives search suggestions based on what is being searched for
*/
function suggest()
{
$suggestions = $this->Supplier->get_search_suggestions($this->input->post('q'),$this->input->post('limit'));
echo implode("\n",$suggestions);
}
/*
Loads the supplier edit form
*/
function view($supplier_id=-1)
{
$data['person_info']=$this->Supplier->get_info($supplier_id);
$this->load->view("suppliers/form",$data);
}
/*
Inserts/updates a supplier
*/
function save($supplier_id=-1)
{
$person_data = array(
'first_name'=>$this->input->post('first_name'),
'last_name'=>$this->input->post('last_name'),
'email'=>$this->input->post('email'),
'phone_number'=>$this->input->post('phone_number'),
'address_1'=>$this->input->post('address_1'),
'address_2'=>$this->input->post('address_2'),
'city'=>$this->input->post('city'),
'state'=>$this->input->post('state'),
'zip'=>$this->input->post('zip'),
'country'=>$this->input->post('country'),
'comments'=>$this->input->post('comments')
);
$supplier_data=array(
'company_name'=>$this->input->post('company_name'),
'account_number'=>$this->input->post('account_number')=='' ? null:$this->input->post('account_number'),
);
if($this->Supplier->save($person_data,$supplier_data,$supplier_id))
{
//New supplier
if($supplier_id==-1)
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('suppliers_successful_adding').' '.
$supplier_data['company_name'],'person_id'=>$supplier_data['person_id']));
}
else //previous supplier
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('suppliers_successful_updating').' '.
$supplier_data['company_name'],'person_id'=>$supplier_id));
}
}
else//failure
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('suppliers_error_adding_updating').' '.
$supplier_data['company_name'],'person_id'=>-1));
}
}
/*
This deletes suppliers from the suppliers table
*/
function delete()
{
$suppliers_to_delete=$this->input->post('ids');
if($this->Supplier->delete_list($suppliers_to_delete))
{
echo json_encode(array('success'=>true,'message'=>$this->lang->line('suppliers_successful_deleted').' '.
count($suppliers_to_delete).' '.$this->lang->line('suppliers_one_or_multiple')));
}
else
{
echo json_encode(array('success'=>false,'message'=>$this->lang->line('suppliers_cannot_be_deleted')));
}
}
/*
Gets one row for a supplier manage table. This is called using AJAX to update one row.
*/
function get_row()
{
$person_id = $this->input->post('row_id');
$data_row=get_supplier_data_row($this->Supplier->get_info($person_id),$this);
echo $data_row;
}
/*
get the width for the add/edit form
*/
function get_form_width()
{
return 360;
}
}
?>

View File

@@ -0,0 +1,96 @@
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
class MY_Lang extends CI_Lang
{
function __construct()
{
parent::__construct();
}
function switch_to( $idiom )
{
$CI =& get_instance();
if( is_string( $idiom ) )
{
$CI->config->set_item( 'language', $idiom );
$loaded = $this->is_loaded;
$this->is_loaded = array();
foreach($loaded as $file)
{
$this->load(strtr($file, '', '_lang.php'));
}
}
}
/**
* Fetch a single line of text from the language array. Takes variable number
* of arguments and supports wildcards in the form of '%1', '%2', etc.
* Overloaded function.
*
* @access public
* @return mixed false if not found or the language string
*/
function line($line = '', $log_errors = true)
{
//get the arguments passed to the function
$args = func_get_args();
//count the number of arguments
$c = count($args);
//if one or more arguments, perform the necessary processing
if ($c)
{
//first argument should be the actual language line key
//so remove it from the array (pop from front)
$line = array_shift($args);
//check to make sure the key is valid and load the line
if ($line == '')
{
$line = FALSE;
}
else
{
if (isset($this->language[$line]))
{
$line = $this->language[$line];
//if the line exists and more function arguments remain
//perform wildcard replacements
if ($args)
{
$i = 1;
foreach ($args as $arg)
{
$line = preg_replace('/\%'.$i.'/', $arg, $line);
++$i;
}
}
}
else
{
// just return label name (with TBD)
$line = $this->line_tbd($line);
log_message('error', 'Could not find the language line "'.$line.'"');
}
}
}
else
{
//if no arguments given, no language line available
$line = false;
}
return $line;
}
function line_tbd($line='')
{
return $line . ' (TBD)';
}
}
?>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -1,10 +0,0 @@
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
<h4>A PHP Error was encountered</h4>
<p>Severity: <?php echo $severity; ?></p>
<p>Message: <?php echo $message; ?></p>
<p>Filename: <?php echo $filepath; ?></p>
<p>Line Number: <?php echo $line; ?></p>
</div>

View File

@@ -1,28 +0,0 @@
<?php
/** GARRISON MODIFIED 4/20/2013 **/
function to_currency($number)
{
$CI =& get_instance();
$currency_symbol = $CI->config->item('currency_symbol') ? $CI->config->item('currency_symbol') : '$';
if($number >= 0)
{
if($CI->config->item('currency_side') !== 'currency_side')
return $currency_symbol.number_format($number, 2, '.', '');
else
return number_format($number, 2, '.', '').$currency_symbol;
}
else
{
if($CI->config->item('currency_side') !== 'currency_side')
return '-'.$currency_symbol.number_format(abs($number), 2, '.', '');
else
return '-'.number_format(abs($number), 2, '.', '').$currency_symbol;
}
}
/** END MODIFIED **/
function to_currency_no_money($number)
{
return number_format($number, 2, '.', '');
}
?>

View File

@@ -0,0 +1,31 @@
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
function pdf_create($html, $filename = '')
{
// need to enable magic quotes for the
$magic_quotes_enabled = get_magic_quotes_runtime();
if(!$magic_quotes_enabled)
{
ini_set('magic_quotes_runtime', TRUE);
}
$dompdf = new Dompdf\Dompdf();
$dompdf->loadHtml($html);
$dompdf->render();
if(!$magic_quotes_enabled)
{
ini_set('magic_quotes_runtime', $magic_quotes_enabled);
}
if($filename != '')
{
$dompdf->stream($filename . '.pdf');
}
else
{
return $dompdf->output();
}
}
?>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -0,0 +1,192 @@
<?php
/*
* Currency locale
*/
function current_language_code()
{
return get_instance()->config->item('language_code');
}
function current_language()
{
return get_instance()->config->item('language');
}
function currency_side()
{
$config = get_instance()->config;
$fmt = new \NumberFormatter($config->item('number_locale'), \NumberFormatter::CURRENCY);
$fmt->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, $config->item('currency_symbol'));
return !preg_match('/^¤/', $fmt->getPattern());
}
function quantity_decimals()
{
$config = get_instance()->config;
return $config->item('quantity_decimals') ? $config->item('quantity_decimals') : 0;
}
function totals_decimals()
{
$config = get_instance()->config;
return $config->item('currency_decimals') ? $config->item('currency_decimals') : 0;
}
function to_currency($number)
{
return to_decimals($number, 'currency_decimals', \NumberFormatter::CURRENCY);
}
function to_currency_no_money($number)
{
return to_decimals($number, 'currency_decimals');
}
function to_tax_decimals($number)
{
// taxes that are NULL, '' or 0 don't need to be displayed
// NOTE: do not remove this line otherwise the items edit form will show a tax with 0 and it will save it
if(empty($number))
{
return $number;
}
return to_decimals($number, 'tax_decimals');
}
function to_quantity_decimals($number)
{
return to_decimals($number, 'quantity_decimals');
}
function to_decimals($number, $decimals, $type=\NumberFormatter::DECIMAL)
{
// ignore empty strings and return
// NOTE: do not change it to empty otherwise tables will show a 0 with no decimal nor currency symbol
if(!isset($number))
{
return $number;
}
$config = get_instance()->config;
$fmt = new \NumberFormatter($config->item('number_locale'), $type);
$fmt->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, $config->item($decimals));
$fmt->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $config->item($decimals));
if (empty($config->item('thousands_separator')))
{
$fmt->setAttribute(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
}
$fmt->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, $config->item('currency_symbol'));
return $fmt->format($number);
}
function parse_decimals($number)
{
// ignore empty strings and return
if(empty($number))
{
return $number;
}
$config = get_instance()->config;
$fmt = new \NumberFormatter( $config->item('number_locale'), \NumberFormatter::DECIMAL );
if (empty($config->item('thousands_separator')))
{
$fmt->setAttribute(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
}
return $fmt->parse($number);
}
/*
* Time locale conversion utility
*/
function dateformat_momentjs($php_format)
{
$SYMBOLS_MATCHING = array(
'd' => 'DD',
'D' => 'ddd',
'j' => 'D',
'l' => 'dddd',
'N' => 'E',
'S' => 'o',
'w' => 'e',
'z' => 'DDD',
'W' => 'W',
'F' => 'MMMM',
'm' => 'MM',
'M' => 'MMM',
'n' => 'M',
't' => '', // no equivalent
'L' => '', // no equivalent
'o' => 'YYYY',
'Y' => 'YYYY',
'y' => 'YY',
'a' => 'a',
'A' => 'A',
'B' => '', // no equivalent
'g' => 'h',
'G' => 'H',
'h' => 'hh',
'H' => 'HH',
'i' => 'mm',
's' => 'ss',
'u' => 'SSS',
'e' => 'zz', // deprecated since version $1.6.0 of moment.js
'I' => '', // no equivalent
'O' => '', // no equivalent
'P' => '', // no equivalent
'T' => '', // no equivalent
'Z' => '', // no equivalent
'c' => '', // no equivalent
'r' => '', // no equivalent
'U' => 'X'
);
return strtr($php_format, $SYMBOLS_MATCHING);
}
function dateformat_bootstrap($php_format)
{
$SYMBOLS_MATCHING = array(
// Day
'd' => 'dd',
'D' => 'd',
'j' => 'd',
'l' => 'dd',
'N' => '',
'S' => '',
'w' => '',
'z' => '',
// Week
'W' => '',
// Month
'F' => 'MM',
'm' => 'mm',
'M' => 'M',
'n' => 'm',
't' => '',
// Year
'L' => '',
'o' => '',
'Y' => 'yyyy',
'y' => 'yy',
// Time
'a' => 'p',
'A' => 'P',
'B' => '',
'g' => 'H',
'G' => 'h',
'h' => 'HH',
'H' => 'hh',
'i' => 'ii',
's' => 'ss',
'u' => ''
);
return strtr($php_format, $SYMBOLS_MATCHING);
}
?>

View File

@@ -1,87 +1,30 @@
<?php
function get_simple_date_ranges()
{
$CI =& get_instance();
$CI->load->language('reports');
$today = date('Y-m-d');
$yesterday = date('Y-m-d', mktime(0,0,0,date("m"),date("d")-1,date("Y")));
$six_days_ago = date('Y-m-d', mktime(0,0,0,date("m"),date("d")-6,date("Y")));
$start_of_this_month = date('Y-m-d', mktime(0,0,0,date("m"),1,date("Y")));
$end_of_this_month = date('Y-m-d',strtotime('-1 second',strtotime('+1 month',strtotime(date('m').'/01/'.date('Y').' 00:00:00'))));
$start_of_last_month = date('Y-m-d', mktime(0,0,0,date("m")-1,1,date("Y")));
$end_of_last_month = date('Y-m-d',strtotime('-1 second',strtotime('+1 month',strtotime((date('m') - 1).'/01/'.date('Y').' 00:00:00'))));
$start_of_this_year = date('Y-m-d', mktime(0,0,0,1,1,date("Y")));
$end_of_this_year = date('Y-m-d', mktime(0,0,0,12,31,date("Y")));
$start_of_last_year = date('Y-m-d', mktime(0,0,0,1,1,date("Y")-1));
$end_of_last_year = date('Y-m-d', mktime(0,0,0,12,31,date("Y")-1));
$start_of_time = date('Y-m-d', 0);
return array(
$today. '/' . $today => $CI->lang->line('reports_today'),
$yesterday. '/' . $yesterday => $CI->lang->line('reports_yesterday'),
$six_days_ago. '/' . $today => $CI->lang->line('reports_last_7'),
$start_of_this_month . '/' . $end_of_this_month => $CI->lang->line('reports_this_month'),
$start_of_last_month . '/' . $end_of_last_month => $CI->lang->line('reports_last_month'),
$start_of_this_year . '/' . $end_of_this_year => $CI->lang->line('reports_this_year'),
$start_of_last_year . '/' . $end_of_last_year => $CI->lang->line('reports_last_year'),
$start_of_time . '/' . $today => $CI->lang->line('reports_all_time'),
);
}
function get_months()
function show_report_if_allowed($report_prefix, $report_name, $person_id, $permission_id = '')
{
$months = array();
for($k=1;$k<=12;$k++)
$CI =& get_instance();
$permission_id = empty($permission_id) ? 'reports_' . $report_name : $permission_id;
if($CI->Employee->has_grant($permission_id, $person_id))
{
$cur_month = mktime(0, 0, 0, $k, 1, 2000);
$months[date("m", $cur_month)] = date("M",$cur_month);
show_report($report_prefix, $report_name, $permission_id);
}
return $months;
}
function get_days()
function show_report($report_prefix, $report_name, $lang_key='')
{
$days = array();
for($k=1;$k<=31;$k++)
$CI =& get_instance();
$lang_key = empty($lang_key) ? $report_name : $lang_key;
$report_label = $CI->lang->line($lang_key);
$report_prefix = empty($report_prefix) ? '' : $report_prefix . '_';
// no summary nor detailed reports for receivings
if(!empty($report_label) && $report_label != $lang_key . ' (TBD)')
{
$cur_day = mktime(0, 0, 0, 1, $k, 2000);
$days[date('d',$cur_day)] = date('j',$cur_day);
?>
<a class="list-group-item" href="<?php echo site_url('reports/' . $report_prefix . preg_replace('/reports_(.*)/', '$1', $report_name));?>"><?php echo $report_label; ?></a>
<?php
}
return $days;
}
function get_years()
{
$years = array();
for($k=0;$k<10;$k++)
{
$years[date("Y")-$k] = date("Y")-$k;
}
return $years;
}
function get_random_colors($how_many)
{
$colors = array();
for($k=0;$k<$how_many;$k++)
{
$colors[] = '#'.random_color();
}
return $colors;
}
function random_color()
{
mt_srand((double)microtime()*1000000);
$c = '';
while(strlen($c)<6){
$c .= sprintf("%02X", mt_rand(0, 255));
}
return $c;
}
?>

View File

@@ -1,364 +1,365 @@
<?php
/*
Gets the html table to manage people.
*/
function get_people_manage_table($people,$controller)
function get_sales_manage_table_headers()
{
$CI =& get_instance();
$table='<table class="tablesorter" id="sortable_table">';
$headers = array('<input type="checkbox" id="select_all" />',
$CI->lang->line('common_last_name'),
$CI->lang->line('common_first_name'),
$CI->lang->line('common_email'),
$CI->lang->line('common_phone_number'),
'&nbsp');
$table.='<thead><tr>';
foreach($headers as $header)
{
$table.="<th>$header</th>";
}
$table.='</tr></thead><tbody>';
$table.=get_people_manage_table_data_rows($people,$controller);
$table.='</tbody></table>';
return $table;
}
/*
Gets the html data rows for the people.
*/
function get_people_manage_table_data_rows($people,$controller)
{
$CI =& get_instance();
$table_data_rows='';
foreach($people->result() as $person)
{
$table_data_rows.=get_person_data_row($person,$controller);
}
if($people->num_rows()==0)
{
$table_data_rows.="<tr><td colspan='6'><div class='warning_message' style='padding:7px;'>".$CI->lang->line('common_no_persons_to_display')."</div></td></tr>";
}
return $table_data_rows;
}
function get_person_data_row($person,$controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
$width = $controller->get_form_width();
$table_data_row='<tr>';
$table_data_row.="<td width='5%'><input type='checkbox' id='person_$person->person_id' value='".$person->person_id."'/></td>";
$table_data_row.='<td width="20%">'.character_limiter($person->last_name,13).'</td>';
$table_data_row.='<td width="20%">'.character_limiter($person->first_name,13).'</td>';
$table_data_row.='<td width="30%">'.mailto($person->email,character_limiter($person->email,22)).'</td>';
$table_data_row.='<td width="20%">'.character_limiter($person->phone_number,13).'</td>';
$table_data_row.='<td width="5%">'.anchor($controller_name."/view/$person->person_id/width:$width", $CI->lang->line('common_edit'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_update'))).'</td>';
$table_data_row.='</tr>';
return $table_data_row;
}
function get_detailed_sales_data_row($sale, $controller)
{
$table_data_row='<tr>';
$table_data_row.='<td><a href="#" class="expand">+</a></td>';
foreach($sale as $cell)
{
$table_data_row.='<td>';
$table_data_row.=$cell;
$table_data_row.='</td>';
}
$table_data_row.='</tr>';
return $table_data_row;
}
/*
Gets the html table to manage suppliers.
*/
function get_supplier_manage_table($suppliers,$controller)
{
$CI =& get_instance();
$table='<table class="tablesorter" id="sortable_table">';
$headers = array('<input type="checkbox" id="select_all" />',
$CI->lang->line('suppliers_company_name'),
$CI->lang->line('common_last_name'),
$CI->lang->line('common_first_name'),
$CI->lang->line('common_email'),
$CI->lang->line('common_phone_number'),
'&nbsp');
$table.='<thead><tr>';
foreach($headers as $header)
{
$table.="<th>$header</th>";
}
$table.='</tr></thead><tbody>';
$table.=get_supplier_manage_table_data_rows($suppliers,$controller);
$table.='</tbody></table>';
return $table;
}
/*
Gets the html data rows for the supplier.
*/
function get_supplier_manage_table_data_rows($suppliers,$controller)
{
$CI =& get_instance();
$table_data_rows='';
foreach($suppliers->result() as $supplier)
{
$table_data_rows.=get_supplier_data_row($supplier,$controller);
}
if($suppliers->num_rows()==0)
{
$table_data_rows.="<tr><td colspan='7'><div class='warning_message' style='padding:7px;'>".$CI->lang->line('common_no_persons_to_display')."</div></tr></tr>";
}
return $table_data_rows;
}
function get_supplier_data_row($supplier,$controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
$width = $controller->get_form_width();
$table_data_row='<tr>';
$table_data_row.="<td width='5%'><input type='checkbox' id='person_$supplier->person_id' value='".$supplier->person_id."'/></td>";
$table_data_row.='<td width="17%">'.character_limiter($supplier->company_name,13).'</td>';
$table_data_row.='<td width="17%">'.character_limiter($supplier->last_name,13).'</td>';
$table_data_row.='<td width="17%">'.character_limiter($supplier->first_name,13).'</td>';
$table_data_row.='<td width="22%">'.mailto($supplier->email,character_limiter($supplier->email,22)).'</td>';
$table_data_row.='<td width="17%">'.character_limiter($supplier->phone_number,13).'</td>';
$table_data_row.='<td width="5%">'.anchor($controller_name."/view/$supplier->person_id/width:$width", $CI->lang->line('common_edit'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_update'))).'</td>';
$table_data_row.='</tr>';
return $table_data_row;
}
/*
Gets the html table to manage items.
*/
function get_items_manage_table($items,$controller)
{
$CI =& get_instance();
$table='<table class="tablesorter" id="sortable_table">';
$headers = array('<input type="checkbox" id="select_all" />',
$CI->lang->line('items_item_number'),
$CI->lang->line('items_name'),
$CI->lang->line('items_category'),
$CI->lang->line('items_cost_price'),
$CI->lang->line('items_unit_price'),
$CI->lang->line('items_tax_percents'),
$CI->lang->line('items_quantity'),
'&nbsp;',
$CI->lang->line('items_inventory')
$headers = array(
array('sale_id' => $CI->lang->line('common_id')),
array('sale_time' => $CI->lang->line('sales_sale_time')),
array('customer_name' => $CI->lang->line('customers_customer')),
array('amount_due' => $CI->lang->line('sales_amount_due')),
array('amount_tendered' => $CI->lang->line('sales_amount_tendered')),
array('change_due' => $CI->lang->line('sales_change_due')),
array('payment_type' => $CI->lang->line('sales_payment_type'))
);
$table.='<thead><tr>';
foreach($headers as $header)
if($CI->config->item('invoice_enable') == TRUE)
{
$table.="<th>$header</th>";
$headers[] = array('invoice_number' => $CI->lang->line('sales_invoice_number'));
$headers[] = array('invoice' => '&nbsp', 'sortable' => FALSE);
}
$table.='</tr></thead><tbody>';
$table.=get_items_manage_table_data_rows($items,$controller);
$table.='</tbody></table>';
return $table;
return transform_headers(array_merge($headers, array(array('receipt' => '&nbsp', 'sortable' => FALSE))));
}
/*
Gets the html data rows for the items.
*/
function get_items_manage_table_data_rows($items,$controller)
Gets the html data rows for the sales.
*/
function get_sale_data_last_row($sales, $controller)
{
$CI =& get_instance();
$table_data_rows='';
foreach($items->result() as $item)
$sum_amount_due = 0;
$sum_amount_tendered = 0;
$sum_change_due = 0;
foreach($sales->result() as $key=>$sale)
{
$table_data_rows.=get_item_data_row($item,$controller);
$sum_amount_due += $sale->amount_due;
$sum_amount_tendered += $sale->amount_tendered;
$sum_change_due += $sale->change_due;
}
if($items->num_rows()==0)
{
$table_data_rows.="<tr><td colspan='11'><div class='warning_message' style='padding:7px;'>".$CI->lang->line('items_no_items_to_display')."</div></tr></tr>";
}
return $table_data_rows;
return array(
'sale_id' => '-',
'sale_time' => '<b>'.$CI->lang->line('sales_total').'</b>',
'amount_due' => '<b>'.to_currency($sum_amount_due).'</b>',
'amount_tendered' => '<b>'. to_currency($sum_amount_tendered).'</b>',
'change_due' => '<b>'.to_currency($sum_change_due).'</b>'
);
}
function get_item_data_row($item,$controller)
function get_sale_data_row($sale, $controller)
{
$CI =& get_instance();
$item_tax_info=$CI->Item_taxes->get_info($item->item_id);
$controller_name = $CI->uri->segment(1);
$row = array (
'sale_id' => $sale->sale_id,
'sale_time' => date( $CI->config->item('dateformat') . ' ' . $CI->config->item('timeformat'), strtotime($sale->sale_time) ),
'customer_name' => $sale->customer_name,
'amount_due' => to_currency($sale->amount_due),
'amount_tendered' => to_currency($sale->amount_tendered),
'change_due' => to_currency($sale->change_due),
'payment_type' => $sale->payment_type
);
if($CI->config->item('invoice_enable'))
{
$row['invoice_number'] = $sale->invoice_number;
$row['invoice'] = empty($sale->invoice_number) ? '' : anchor($controller_name."/invoice/$sale->sale_id", '<span class="glyphicon glyphicon-list-alt"></span>',
array('title'=>$CI->lang->line('sales_show_invoice'))
);
}
$row['receipt'] = anchor($controller_name."/receipt/$sale->sale_id", '<span class="glyphicon glyphicon-usd"></span>',
array('title' => $CI->lang->line('sales_show_receipt'))
);
$row['edit'] = anchor($controller_name."/edit/$sale->sale_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class' => 'modal-dlg print_hide', 'data-btn-delete' => $CI->lang->line('common_delete'), 'data-btn-submit' => $CI->lang->line('common_submit'), 'title' => $CI->lang->line($controller_name.'_update'))
);
return $row;
}
/*
Get the sales payments summary
*/
function get_sales_manage_payments_summary($payments, $sales, $controller)
{
$CI =& get_instance();
$table = '<div id="report_summary">';
foreach($payments as $key=>$payment)
{
$amount = $payment['payment_amount'];
// WARNING: the strong assumption here is that if a change is due it was a cash transaction always
// therefore we remove from the total cash amount any change due
if( $payment['payment_type'] == $CI->lang->line('sales_cash') )
{
foreach($sales->result_array() as $key=>$sale)
{
$amount -= $sale['change_due'];
}
}
$table .= '<div class="summary_row">' . $payment['payment_type'] . ': ' . to_currency( $amount ) . '</div>';
}
$table .= '</div>';
return $table;
}
function transform_headers_readonly($array)
{
$result = array();
foreach($array as $key => $value)
{
$result[] = array('field' => $key, 'title' => $value, 'sortable' => $value != '', 'switchable' => !preg_match('(^$|&nbsp)', $value));
}
return json_encode($result);
}
function transform_headers($array, $readonly = FALSE, $editable = TRUE)
{
$result = array();
if (!$readonly)
{
$array = array_merge(array(array('checkbox' => 'select', 'sortable' => FALSE)), $array);
}
if ($editable)
{
$array[] = array('edit' => '');
}
foreach($array as $element)
{
$result[] = array('field' => key($element),
'title' => current($element),
'switchable' => isset($element['switchable']) ?
$element['switchable'] : !preg_match('(^$|&nbsp)', current($element)),
'sortable' => isset($element['sortable']) ?
$element['sortable'] : current($element) != '',
'checkbox' => isset($element['checkbox']) ?
$element['checkbox'] : FALSE,
'class' => isset($element['checkbox']) || preg_match('(^$|&nbsp)', current($element)) ?
'print_hide' : '',
'sorter' => isset($element['sorter']) ?
$element ['sorter'] : '');
}
return json_encode($result);
}
function get_people_manage_table_headers()
{
$CI =& get_instance();
$headers = array(
array('people.person_id' => $CI->lang->line('common_id')),
array('last_name' => $CI->lang->line('common_last_name')),
array('first_name' => $CI->lang->line('common_first_name')),
array('email' => $CI->lang->line('common_email')),
array('phone_number' => $CI->lang->line('common_phone_number'))
);
if($CI->Employee->has_grant('messages', $CI->session->userdata('person_id')))
{
$headers[] = array('messages' => '', 'sortable' => FALSE);
}
return transform_headers($headers);
}
function get_person_data_row($person, $controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
return array (
'people.person_id' => $person->person_id,
'last_name' => $person->last_name,
'first_name' => $person->first_name,
'email' => empty($person->email) ? '' : mailto($person->email, $person->email),
'phone_number' => $person->phone_number,
'messages' => empty($person->phone_number) ? '' : anchor("Messages/view/$person->person_id", '<span class="glyphicon glyphicon-phone"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line('messages_sms_send'))),
'edit' => anchor($controller_name."/view/$person->person_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
function get_suppliers_manage_table_headers()
{
$CI =& get_instance();
$headers = array(
array('people.person_id' => $CI->lang->line('common_id')),
array('company_name' => $CI->lang->line('suppliers_company_name')),
array('agency_name' => $CI->lang->line('suppliers_agency_name')),
array('last_name' => $CI->lang->line('common_last_name')),
array('first_name' => $CI->lang->line('common_first_name')),
array('email' => $CI->lang->line('common_email')),
array('phone_number' => $CI->lang->line('common_phone_number'))
);
if($CI->Employee->has_grant('messages', $CI->session->userdata('person_id')))
{
$headers[] = array('messages' => '');
}
return transform_headers($headers);
}
function get_supplier_data_row($supplier, $controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
return array (
'people.person_id' => $supplier->person_id,
'company_name' => $supplier->company_name,
'agency_name' => $supplier->agency_name,
'last_name' => $supplier->last_name,
'first_name' => $supplier->first_name,
'email' => empty($supplier->email) ? '' : mailto($supplier->email, $supplier->email),
'phone_number' => $supplier->phone_number,
'messages' => empty($supplier->phone_number) ? '' : anchor("Messages/view/$supplier->person_id", '<span class="glyphicon glyphicon-phone"></span>',
array('class'=>"modal-dlg", 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line('messages_sms_send'))),
'edit' => anchor($controller_name."/view/$supplier->person_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>"modal-dlg", 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update')))
);
}
function get_items_manage_table_headers()
{
$CI =& get_instance();
$headers = array(
array('items.item_id' => $CI->lang->line('common_id')),
array('item_number' => $CI->lang->line('items_item_number')),
array('name' => $CI->lang->line('items_name')),
array('category' => $CI->lang->line('items_category')),
array('company_name' => $CI->lang->line('suppliers_company_name')),
array('cost_price' => $CI->lang->line('items_cost_price')),
array('unit_price' => $CI->lang->line('items_unit_price')),
array('quantity' => $CI->lang->line('items_quantity')),
array('tax_percents' => $CI->lang->line('items_tax_percents'), 'sortable' => FALSE),
array('item_pic' => $CI->lang->line('items_image'), 'sortable' => FALSE),
array('inventory' => ''),
array('stock' => '')
);
return transform_headers($headers);
}
function get_item_data_row($item, $controller)
{
$CI =& get_instance();
$item_tax_info = $CI->Item_taxes->get_info($item->item_id);
$tax_percents = '';
foreach($item_tax_info as $tax_info)
{
$tax_percents.=$tax_info['percent']. '%, ';
$tax_percents .= to_tax_decimals($tax_info['percent']) . '%, ';
}
$tax_percents=substr($tax_percents, 0, -2);
$controller_name=strtolower(get_class($CI));
$width = $controller->get_form_width();
// remove ', ' from last item
$tax_percents = substr($tax_percents, 0, -2);
$controller_name = strtolower(get_class($CI));
$table_data_row='<tr>';
$table_data_row.="<td width='3%'><input type='checkbox' id='item_$item->item_id' value='".$item->item_id."'/></td>";
$table_data_row.='<td width="15%">'.$item->item_number.'</td>';
$table_data_row.='<td width="20%">'.$item->name.'</td>';
$table_data_row.='<td width="14%">'.$item->category.'</td>';
$table_data_row.='<td width="14%">'.to_currency($item->cost_price).'</td>';
$table_data_row.='<td width="14%">'.to_currency($item->unit_price).'</td>';
$table_data_row.='<td width="14%">'.$tax_percents.'</td>';
$table_data_row.='<td width="14%">'.$item->quantity.'</td>';
$table_data_row.='<td width="5%">'.anchor($controller_name."/view/$item->item_id/width:$width", $CI->lang->line('common_edit'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_update'))).'</td>';
//Ramel Inventory Tracking
$table_data_row.='<td width="10%">'.anchor($controller_name."/inventory/$item->item_id/width:$width", $CI->lang->line('common_inv'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_count')))./*'</td>';//inventory count
$table_data_row.='<td width="5%">'*/'&nbsp;&nbsp;&nbsp;&nbsp;'.anchor($controller_name."/count_details/$item->item_id/width:$width", $CI->lang->line('common_det'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_details_count'))).'</td>';//inventory details
$table_data_row.='</tr>';
return $table_data_row;
$image = '';
if ($item->pic_id != '')
{
$images = glob('./uploads/item_pics/' . $item->pic_id . '.*');
if (sizeof($images) > 0)
{
$image .= '<a class="rollover" href="'. base_url($images[0]) .'"><img src="'.site_url('items/pic_thumb/'.$item->pic_id).'"></a>';
}
}
return array (
'items.item_id' => $item->item_id,
'item_number' => $item->item_number,
'name' => $item->name,
'category' => $item->category,
'company_name' => $item->company_name,
'cost_price' => to_currency($item->cost_price),
'unit_price' => to_currency($item->unit_price),
'quantity' => to_quantity_decimals($item->quantity),
'tax_percents' => !$tax_percents ? '-' : $tax_percents,
'item_pic' => $image,
'inventory' => anchor($controller_name."/inventory/$item->item_id", '<span class="glyphicon glyphicon-pushpin"></span>',
array('class' => 'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title' => $CI->lang->line($controller_name.'_count'))
),
'stock' => anchor($controller_name."/count_details/$item->item_id", '<span class="glyphicon glyphicon-list-alt"></span>',
array('class' => 'modal-dlg', 'title' => $CI->lang->line($controller_name.'_details_count'))
),
'edit' => anchor($controller_name."/view/$item->item_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class' => 'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title' => $CI->lang->line($controller_name.'_update'))
));
}
/*
Gets the html table to manage giftcards.
*/
function get_giftcards_manage_table( $giftcards, $controller )
function get_giftcards_manage_table_headers()
{
$CI =& get_instance();
$table='<table class="tablesorter" id="sortable_table">';
$headers = array('<input type="checkbox" id="select_all" />',
$CI->lang->line('common_last_name'),
$CI->lang->line('common_first_name'),
$CI->lang->line('giftcards_giftcard_number'),
$CI->lang->line('giftcards_card_value'),
'&nbsp',
$headers = array(
array('giftcard_id' => $CI->lang->line('common_id')),
array('last_name' => $CI->lang->line('common_last_name')),
array('first_name' => $CI->lang->line('common_first_name')),
array('giftcard_number' => $CI->lang->line('giftcards_giftcard_number')),
array('value' => $CI->lang->line('giftcards_card_value'))
);
$table.='<thead><tr>';
foreach($headers as $header)
{
$table.="<th>$header</th>";
}
$table.='</tr></thead><tbody>';
$table.=get_giftcards_manage_table_data_rows( $giftcards, $controller );
$table.='</tbody></table>';
return $table;
return transform_headers($headers);
}
/*
Gets the html data rows for the giftcard.
*/
function get_giftcards_manage_table_data_rows( $giftcards, $controller )
{
$CI =& get_instance();
$table_data_rows='';
foreach($giftcards->result() as $giftcard)
{
$table_data_rows.=get_giftcard_data_row( $giftcard, $controller );
}
if($giftcards->num_rows()==0)
{
$table_data_rows.="<tr><td colspan='11'><div class='warning_message' style='padding:7px;'>".$CI->lang->line('giftcards_no_giftcards_to_display')."</div></tr></tr>";
}
return $table_data_rows;
}
/** GARRISON MODIFIED 4/25/2013 **/
function get_giftcard_data_row($giftcard,$controller)
function get_giftcard_data_row($giftcard, $controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
$width = $controller->get_form_width();
$table_data_row='<tr>';
$table_data_row.="<td width='3%'><input type='checkbox' id='giftcard_$giftcard->giftcard_id' value='".$giftcard->giftcard_id."'/></td>";
$table_data_row.='<td width="15%">'.$giftcard->last_name.'</td>';
$table_data_row.='<td width="15%">'.$giftcard->first_name.'</td>';
$table_data_row.='<td width="15%">'.$giftcard->giftcard_number.'</td>';
$table_data_row.='<td width="20%">'.to_currency($giftcard->value).'</td>';
$table_data_row.='<td width="5%">'.anchor($controller_name."/view/$giftcard->giftcard_id/width:$width", $CI->lang->line('common_edit'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_update'))).'</td>';
$table_data_row.='</tr>';
return $table_data_row;
return array (
'giftcard_id' => $giftcard->giftcard_id,
'last_name' => $giftcard->last_name,
'first_name' => $giftcard->first_name,
'giftcard_number' => $giftcard->giftcard_number,
'value' => to_currency($giftcard->value),
'edit' => anchor($controller_name."/view/$giftcard->giftcard_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
/** END GARRISON MODIFIED **/
/*
Gets the html table to manage item kits.
*/
function get_item_kits_manage_table( $item_kits, $controller )
function get_item_kits_manage_table_headers()
{
$CI =& get_instance();
$table='<table class="tablesorter" id="sortable_table">';
$headers = array('<input type="checkbox" id="select_all" />',
$CI->lang->line('item_kits_name'),
$CI->lang->line('item_kits_description'),
'&nbsp',
$headers = array(
array('item_kit_id' => $CI->lang->line('item_kits_kit')),
array('name' => $CI->lang->line('item_kits_name')),
array('description' => $CI->lang->line('item_kits_description')),
array('cost_price' => $CI->lang->line('items_cost_price'), 'sortable' => FALSE),
array('unit_price' => $CI->lang->line('items_unit_price'), 'sortable' => FALSE)
);
$table.='<thead><tr>';
foreach($headers as $header)
{
$table.="<th>$header</th>";
}
$table.='</tr></thead><tbody>';
$table.=get_item_kits_manage_table_data_rows( $item_kits, $controller );
$table.='</tbody></table>';
return $table;
return transform_headers($headers);
}
/*
Gets the html data rows for the item kits.
*/
function get_item_kits_manage_table_data_rows( $item_kits, $controller )
{
$CI =& get_instance();
$table_data_rows='';
foreach($item_kits->result() as $item_kit)
{
$table_data_rows.=get_item_kit_data_row( $item_kit, $controller );
}
if($item_kits->num_rows()==0)
{
$table_data_rows.="<tr><td colspan='11'><div class='warning_message' style='padding:7px;'>".$CI->lang->line('item_kits_no_item_kits_to_display')."</div></tr></tr>";
}
return $table_data_rows;
}
function get_item_kit_data_row($item_kit,$controller)
function get_item_kit_data_row($item_kit, $controller)
{
$CI =& get_instance();
$controller_name=strtolower(get_class($CI));
$width = $controller->get_form_width();
$table_data_row='<tr>';
$table_data_row.="<td width='3%'><input type='checkbox' id='item_kit_$item_kit->item_kit_id' value='".$item_kit->item_kit_id."'/></td>";
$table_data_row.='<td width="15%">'.$item_kit->name.'</td>';
$table_data_row.='<td width="20%">'.character_limiter($item_kit->description, 25).'</td>';
$table_data_row.='<td width="5%">'.anchor($controller_name."/view/$item_kit->item_kit_id/width:$width", $CI->lang->line('common_edit'),array('class'=>'thickbox','title'=>$CI->lang->line($controller_name.'_update'))).'</td>';
$table_data_row.='</tr>';
return $table_data_row;
return array (
'item_kit_id' => $item_kit->item_kit_id,
'name' => $item_kit->name,
'description' => $item_kit->description,
'cost_price' => to_currency($item_kit->total_cost_price),
'unit_price' => to_currency($item_kit->total_unit_price),
'edit' => anchor($controller_name."/view/$item_kit->item_kit_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
?>
?>

View File

@@ -0,0 +1,29 @@
<?php
// Name of function same as mentioned in Hooks Config
function db_log_queries()
{
$CI = & get_instance();
// check if database logging is enabled (see config/config.php)
if($CI->config->item('db_log_enabled'))
{
// Creating Query Log file with today's date in application/logs folder
$filepath = APPPATH . 'logs/Query-log-' . date('Y-m-d') . '.php';
// Opening file with pointer at the end of the file
$handle = fopen($filepath, "a+");
// Get execution time of all the queries executed by controller
$times = $CI->db->query_times;
foreach ($CI->db->queries as $key => $query)
{
// Generating SQL file alongwith execution time
$sql = $query . " \n Execution Time:" . $times[$key];
// Writing it in the log file
fwrite($handle, $sql . "\n\n");
}
// Close the file
fclose($handle);
}
}
?>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -3,37 +3,56 @@
function load_config()
{
$CI =& get_instance();
foreach( $CI->Appconfig->get_all()->result() as $app_config )
{
$CI->config->set_item( $app_config->key, $app_config->value );
foreach($CI->Appconfig->get_all()->result() as $app_config)
{
$CI->config->set_item($CI->security->xss_clean($app_config->key), $CI->security->xss_clean($app_config->value));
}
//Set language from config database
//Loads all the language files from the language directory
if ( $CI->config->item( 'language' ) )
if(!empty(current_language()))
{
$CI->config->set_item( 'language', $CI->config->item( 'language' ) );
$map = directory_map('./application/language/' . $CI->config->item( 'language' ));
foreach($map as $file)
// fallback to English if language folder does not exist
if (!file_exists('../application/language/' . current_language_code()))
{
if ( substr(strrchr($file,'.'),1) == "php")
{
$CI->lang->load( str_replace( '_lang.php', '', $file ) );
}
$CI->config->set_item('language', 'english');
$CI->config->set_item('language_code', 'en');
}
load_language_files('../vendor/codeigniter/framework/system/language', current_language());
load_language_files('../application/language', current_language_code());
}
//Set timezone from config database
if ( $CI->config->item( 'timezone' ) )
if($CI->config->item('timezone'))
{
date_default_timezone_set( $CI->config->item( 'timezone' ) );
date_default_timezone_set($CI->config->item('timezone'));
}
else
{
date_default_timezone_set( 'America/New_York' );
date_default_timezone_set('America/New_York');
}
bcscale(max(2, $CI->config->item('currency_decimals') + $CI->config->item('tax_decimals')));
}
/**
* @param $language
* @param $CI
*/
function load_language_files($path, $language)
{
$CI =& get_instance();
$map = directory_map($path . DIRECTORY_SEPARATOR . $language);
foreach($map as $file)
{
if(!is_array($file) && substr(strrchr($file, '.'), 1) == 'php')
{
$CI->lang->load(strtr($file, '', '_lang.php'), $language);
}
}
}
?>

View File

@@ -0,0 +1,58 @@
<?php
function load_stats()
{
$CI =& get_instance();
$line = $CI->lang->line('common_you_are_using_ospos');
if(count($CI->session->userdata('session_sha1')) == 0)
{
$footer_tags = file_get_contents(APPPATH . 'views/partial/footer.php');
$d = preg_replace('/\$Id:\s.*?\s\$/', '$Id$', $footer_tags);
$session_sha1 = sha1("blob " .strlen( $d ). "\0" . $d);
$CI->session->set_userdata('session_sha1', substr($session_sha1, 0, 7));
preg_match('/\$Id:\s(.*?)\s\$/', $footer_tags, $matches);
$needle = 'Open Source Point Of Sale';
if(!stristr($line, $needle) || $session_sha1 != $matches[1])
{
$CI->load->library('tracking_lib');
$roguer = $CI->Appconfig->get('company') . ' | ' . $CI->Appconfig->get('address') . ' | ' . $CI->Appconfig->get('email') . ' | ' . $CI->Appconfig->get('website') . ' | ' . $CI->config->item('base_url');
$CI->tracking_lib->track_page('rogue/roguer', 'roguer', $roguer);
$CI->tracking_lib->track_page('rogue/footer', 'rogue footer', $footer_tags);
$login_footer = '';
if($handle = @fopen(APPPATH . 'views/login.php', 'r'))
{
while(!feof($handle))
{
$buffer = fgets($handle);
if(strpos($buffer, $needle) !== FALSE)
{
$login_footer = '';
}
elseif(strpos($buffer, 'form_close') !== FALSE)
{
$login_footer = 'Footer: ';
}
elseif($login_footer != '')
{
$login_footer .= $buffer;
}
}
fclose($handle);
}
if($login_footer != '')
{
$CI->tracking_lib->track_page('rogue/login', 'rogue login', $login_footer);
}
}
}
}
?>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
@@ -7,4 +8,4 @@
<p>Directory access is forbidden.</p>
</body>
</html>
</html>

View File

@@ -0,0 +1,10 @@
<?php
$lang["tables_loading"] = "جارى التحميل، برجاء الإنتظار";
$lang["tables_rows_per_page"] = "{0} صف بالصفحة";
$lang["tables_page_from_to"] = "عرض {0} إلى {1} من {2} صفوف";
$lang["tables_hide_show_pagination"] = "عرض/إخفاء أرقام الصفحات";
$lang["tables_refresh"] = "إعادة تحميل";
$lang["tables_toggle"] = "تغيير";
$lang["tables_columns"] = "أعمدة";
$lang["tables_all"] = "الجميع";

View File

@@ -0,0 +1,65 @@
<?php
$lang["common_address_1"] = "العنوان 1";
$lang["common_address_2"] = "العنوان 2";
$lang["common_city"] = "المدينة";
$lang["common_close"] = "إغلاق";
$lang["common_comments"] = "تعليقات";
$lang["common_common"] = "عام";
$lang["common_confirm_search"] = "لقد قمت اختيار أكتر من سجل، سوف تفقد هذه الاختيارات عند إرسال البحث، موافق؟";
$lang["common_country"] = "البلد";
$lang["common_date"] = "التاريخ";
$lang["common_delete"] = "حذف";
$lang["common_print"] = "طباعة";
$lang["common_det"] = "تفاصيل";
$lang["common_edit"] = "تحرير";
$lang["common_email"] = "بريد إلكتروني";
$lang["common_email_invalid_format"] = "شكل البريد الإلكتروني غير صحيح";
$lang["common_fields_required_message"] = "الحقول التي بالأحمر مطلوبة";
$lang["common_first_name"] = "الاسم الأول";
$lang["common_first_name_required"] = "الاسم الأول مطلوب";
$lang["common_first_page"] = "الأول";
$lang["common_gender"] = "النوع";
$lang["common_gender_female"] = "أنثى";
$lang["common_gender_male"] = "ذكر";
$lang["common_inv"] = "المخزن";
$lang["common_last_name"] = "الاسم الأخير";
$lang["common_last_name_required"] = "الاسم الأخير مطلوب";
$lang["common_last_page"] = "الأخيرة";
$lang["common_learn_about_project"] = "للتعرف على أخر المعلومات حول المشروع";
$lang["common_list_of"] = "قائمة بـ";
$lang["common_logout"] = "خروج";
$lang["common_new"] = "جديد";
$lang["common_no_persons_to_display"] = "لا يوجد اناس لعرضهم";
$lang["common_none_selected_text"] = "لم يتم اختيار شيء";
$lang["common_or"] = "أو";
$lang["common_phone_number"] = "رقم التليفون";
$lang["common_phone_number_required"] = "رقم التليفون مطلوب";
$lang["common_please_visit_my"] = "برجاء زيارة";
$lang["common_powered_by"] = "مدعوم بواسطة";
$lang["common_price"] = "السعر";
$lang["common_remove"] = "إزالة";
$lang["common_return_policy"] = "سياسة الاسترجاع";
$lang["common_search"] = "بحث";
$lang["common_search_options"] = "خيارات البحث";
$lang["common_searched_for"] = "بحث عن";
$lang["common_state"] = "المحافظة";
$lang["common_submit"] = "حفظ";
$lang["common_view_recent_sales"] = "عرض أحدث المبيعات";
$lang["common_website"] = "الموقع الإلكترونى";
$lang["common_welcome"] = "مرحباً";
$lang["common_welcome_message"] = "مرحباً فى OSPOS برجاء إختيار أى قسم للبدء";
$lang["common_you_are_using_ospos"] = "أنت تستخدم إصدار Open Source Point Of Sale ";
$lang["common_zip"] = "الرقم البريدى";
$lang["common_import"] = "استيراد";
$lang["common_download_import_template"] = "تنزيل قالب الاستيراد من اكسل (CSV)";
$lang["common_import_excel"] = "استيراد من اكسل";
$lang["common_import_full_path"] = "المسار الكامل لملف اكسل مطلوب";
$lang["common_import_select_file"] = "اختار ملف";
$lang["common_import_change_file"] = "تغيير";
$lang["common_import_remove_file"] = "إزالة";
$lang["common_export_excel"] = "تصدير إلى اكسل";
$lang["common_export_excel_yes"] = "نعم";
$lang["common_export_excel_no"] = "لا";
$lang["common_required"] = "مطلوب";
$lang["common_id"] = "كود";

View File

@@ -0,0 +1,184 @@
<?php
$lang["config_address"] = "عنوان الشركة";
$lang["config_address_required"] = "عنوان الشركة مطلوب";
$lang["config_apostrophe"] = "الفاصلة";
$lang["config_backup_button"] = "نسخ إحتياطى";
$lang["config_backup_database"] = "نسخ إحتياطى لقاعدة البيانات";
$lang["config_barcode"] = "باركود";
$lang["config_barcode_company"] = "اسم الشركة";
$lang["config_barcode_configuration"] = "اعدادات الباركود";
$lang["config_barcode_content"] = "محتويات الباركود";
$lang["config_barcode_first_row"] = "الصف 1";
$lang["config_barcode_font"] = "الخط";
$lang["config_barcode_height"] = "الارتفاع (px)";
$lang["config_barcode_id"] = "كود/اسم الصنف";
$lang["config_barcode_info"] = "معلومات اعدادات الباركود";
$lang["config_barcode_layout"] = "تخطيط الباركود";
$lang["config_barcode_name"] = "الاسم";
$lang["config_barcode_number"] = "الباركود UPC/EAN/ISBN";
$lang["config_barcode_number_in_row"] = "الرقم فى الصف";
$lang["config_barcode_page_cellspacing"] = "المسافة بين الخلايا فى صفحة العرض";
$lang["config_barcode_page_width"] = "عرض الصفحة";
$lang["config_barcode_price"] = "السعر";
$lang["config_barcode_quality"] = "الجودة (1-100)";
$lang["config_barcode_second_row"] = "الصف 2";
$lang["config_barcode_third_row"] = "الصف 3";
$lang["config_barcode_type"] = "نوعية الباركود";
$lang["config_barcode_width"] = "العرض (px)";
$lang["config_barcode_generate_if_empty"] = "توليد اذا كان الباركود فارغ";
$lang["config_bottom"] = "الأسفل";
$lang["config_center"] = "الوسط";
$lang["config_company"] = "اسم الشركة";
$lang["config_company_logo"] = "شعار الشركة";
$lang["config_company_select_image"] = "اختار صورة";
$lang["config_company_change_image"] = "تغيير الصورة";
$lang["config_company_remove_image"] = "إزالة الصورة";
$lang["config_company_required"] = "اسم الشركة مطلوب";
$lang["config_company_website_url"] = "الموقع الإلكترونى للشركة غير صحيح";
$lang["config_comma"] = "فاصلة";
$lang["config_country_codes"] = "أكواد الدولة";
$lang["config_country_codes_tooltip"] = "قائمة مفصولة بفاصلة لاسماء الدول للبحث";
$lang["config_currency_symbol"] = "رمز العملة";
$lang["config_currency_decimals"] = "العلامة العشرية للعملة";
$lang["config_custom1"] = "حقل مخصص 1";
$lang["config_custom2"] = "حقل مخصص 2";
$lang["config_custom3"] = "حقل مخصص 3";
$lang["config_custom4"] = "حقل مخصص 4";
$lang["config_custom5"] = "حقل مخصص 5";
$lang["config_custom6"] = "حقل مخصص 6";
$lang["config_custom7"] = "حقل مخصص 7";
$lang["config_custom8"] = "حقل مخصص 8";
$lang["config_custom9"] = "حقل مخصص 9";
$lang["config_custom10"] = "حقل مخصص 10";
$lang["config_datetimeformat"] = "شكل الوقت و التاريخ";
$lang["config_decimal_point"] = "العلامة العشرية";
$lang["config_default_barcode_font_size_number"] = "الحجم الافتراضي لخط الباركود لابد أن يكون رقم";
$lang["config_default_barcode_font_size_required"] = "الحجم الافتراضي لخط الباركود مطلوب";
$lang["config_default_barcode_height_number"] = "الارتفاع الافتراضي للباركود لابد ان يكون رقم";
$lang["config_default_barcode_height_required"] = "الارتفاع الافتراضي للباركود مطلوب";
$lang["config_default_barcode_num_in_row_number"] = "رقم الباركود فى اى سطر لابد ان يكون رقم";
$lang["config_default_barcode_num_in_row_required"] = "رقم الباركود فى اى سطر مطلوب";
$lang["config_default_barcode_page_cellspacing_number"] = "المسافة الافتراضية بين خلايا الباركود لابد أن تكون رقم";
$lang["config_default_barcode_page_cellspacing_required"] = "المسافة الافتراضية بين خلايا الباركود مطلوبة";
$lang["config_default_barcode_page_width_number"] = "عرض الصفحة الافتراضي للباركود لابد ان يكون رقم";
$lang["config_default_barcode_page_width_required"] = "عرض الصفحة الافتراضي للباركود مطلوب";
$lang["config_default_barcode_quality_number"] = "الجودة الافتراضية للباركود لابد ان تكون رقم";
$lang["config_default_barcode_quality_required"] = "الجودة الافتراضية للباركود مطلوبة";
$lang["config_default_barcode_width_number"] = "العرض الافتراضي للباركود لابد ان يكون رقم";
$lang["config_default_barcode_width_required"] = "العرض الافتراضي للباركود مطلوب";
$lang["config_default_sales_discount"] = "نسبة الخصم الافتراضية %";
$lang["config_default_sales_discount_number"] = "نسبة الخصم الافتراضية لابد ان تكون رقم";
$lang["config_default_sales_discount_required"] = "نسبة الخصم الافتراضية مطلوبة";
$lang["config_default_tax_rate"] = "معدل الضريبة الافتراضي %";
$lang["config_default_tax_rate_1"] = "معدل الضريبة 1";
$lang["config_default_tax_rate_2"] = "معدل الضريبة 2";
$lang["config_default_tax_rate_number"] = "معدل الضريبة الافتراضي يجب أن يكون رقم";
$lang["config_default_tax_rate_required"] = "معدل الضريبة الافتراضي مطلوب";
$lang["config_default_tax_name_required"] = "اسم الضريبة الافتراضية مطلوب";
$lang["config_dot"] = "نقطة";
$lang["config_email"] = "البريد الإلكتروني";
$lang["config_email_configuration"] = "إعدادات البريد الإلكتروني";
$lang["config_email_protocol"] = "بروتوكول";
$lang["config_email_mailpath"] = "مسار ارسال البريد";
$lang["config_email_smtp_host"] = "خادم SMTP";
$lang["config_email_smtp_port"] = "رقم منفذ SMTP";
$lang["config_email_smtp_crypto"] = "تشفير SMTP";
$lang["config_email_smtp_timeout"] = "وقت فشل المحاولة (ثوانى) لـ SMTP";
$lang["config_email_smtp_user"] = "اسم مستخدم SMTP";
$lang["config_email_smtp_pass"] = "كلمة سر SMTP";
$lang["config_fax"] = "الفاكس";
$lang["config_general"] = "عام";
$lang["config_general_configuration"] = "إعدادات عامة";
$lang["config_info"] = "معلومات";
$lang["config_info_configuration"] = "معلومات الشركة";
$lang["config_invoice"] = "الفاتورة";
$lang["config_invoice_configuration"] = "إعدادات طباعة الفاتورة";
$lang["config_invoice_default_comments"] = "التعليق الافتراضي على الفاتورة";
$lang["config_invoice_enable"] = "تفعيل الفوترة";
$lang["config_invoice_email_message"] = "قالب البريد الإلكتروني للفاتورة";
$lang["config_invoice_printer"] = "طابعة الفواتير";
$lang["config_jsprintsetup_required"] = "تحذير! هذه الخاصية غير المفعلة سوف تعمل فقط مع وجود الاضافة jsPrintSetup على متصفح فايرفوكس. حفظ على أى حال؟";
$lang["config_language"] = "اللغة";
$lang["config_left"] = "يسار";
$lang["config_license"] = "الرخصة";
$lang["config_license_configuration"] = "نص الرخصة";
$lang["config_lines_per_page"] = "عدد السطور فى الصفحة";
$lang["config_lines_per_page_number"] = "عدد السطور فى الصفحة يجب أن يكون رقم";
$lang["config_lines_per_page_required"] = "عدد السطور فى الصفحة مطلوب";
$lang["config_locale"] = "إقليمية";
$lang["config_locale_configuration"] = "الإعدادات الإقليمية";
$lang["config_locale_info"] = "معلومات التهيئة الإقليمية";
$lang["config_location"] = "المخزون";
$lang["config_location_configuration"] = "أماكن المخزون";
$lang["config_location_info"] = "معلومات تهيئة الأماكن";
$lang["config_logout"] = "هل تريد عمل نسخة إحتياطية قبل الخروج؟ اضغط [نعم] لعمل النسخة أو [الغاء] للخروج";
$lang["config_message"] = "الرسائل";
$lang["config_message_configuration"] = "إعدادات الرسائل";
$lang["config_msg_msg"] = "الرسائل النصية المحفوظة";
$lang["config_msg_msg_placeholder"] = "إذا أردت إستخدام قالب للرسائل القصيرة احفظه هنا. عدا ذلك أترك هذا الحقل فارغ";
$lang["config_msg_uid"] = "SMS-API اسم المستخدم لـ";
$lang["config_msg_uid_required"] = "مطلوب SMS-API اسم المستخدم لـ";
$lang["config_msg_pwd"] = "SMS-API كلمة السر لـ";
$lang["config_msg_pwd_required"] = "مطلوب SMS-API كلمة السر لـ";
$lang["config_msg_src"] = "SMS-API كود المرسل لـ";
$lang["config_msg_src_required"] = "مطلوب SMS-API كود المرسل لـ";
$lang["config_none"] = "لايوجد";
$lang["config_notify_alignment"] = "مكان عرض رسائل المعلومات";
$lang["config_number_format"] = "شكل الرقم";
$lang["config_payment_options_order"] = "ترتيب خيارات الدفع";
$lang["config_phone"] = "هاتف الشركة";
$lang["config_phone_required"] = "هاتف الشركة مطلوب";
$lang["config_print_bottom_margin"] = "الهامش السفلي";
$lang["config_print_bottom_margin_number"] = "الهامش السفلي يجب أن يكون رقم";
$lang["config_print_bottom_margin_required"] = "الهامش السفلي مطلوب";
$lang["config_print_footer"] = "طباعة تذييل المتصفح";
$lang["config_print_header"] = "طباعة ترويسة المتصفح";
$lang["config_print_left_margin"] = "الهامش الأيسر";
$lang["config_print_left_margin_number"] = "الهامش الأيسر يجب ان يكون رقم";
$lang["config_print_left_margin_required"] = "الهامش الأيسر مطلوب";
$lang["config_print_right_margin"] = "الهامش الأيمن";
$lang["config_print_right_margin_number"] = "الهامش الأيمن يجب أن يكون رقم";
$lang["config_print_right_margin_required"] = "الهامش الأيمن مطلوب";
$lang["config_print_silently"] = "عرض صندوق حوار طباعة";
$lang["config_print_top_margin"] = "الهامش العلوى";
$lang["config_print_top_margin_number"] = "الهامش العلوى يجب أن يكون رقم";
$lang["config_print_top_margin_required"] = "الهامش العلوى مطلوب";
$lang["config_quantity_decimals"] = "العلامة العشرية للكمية";
$lang["config_receipt"] = "الإيصال";
$lang["config_receipt_configuration"] = "إعدادات طباعة الايصالات";
$lang["config_receipt_info"] = "معلومات تهيئة الإيصالات";
$lang["config_receipt_printer"] = "طابعة تذاكر";
$lang["config_receipt_show_taxes"] = "عرض الضرائب";
$lang["config_receipt_show_total_discount"] = "عرض إجمالى الخصم";
$lang["config_receipt_show_description"] = "عرض الوصف";
$lang["config_receipt_show_serialnumber"] = "عرض الرقم المسلسل";
$lang["config_receipt_template"] = "قالب الايصال";
$lang["config_receipt_default"] = "افتراضى";
$lang["config_receipt_short"] = "مختصر";
$lang["config_receiving_calculate_average_price"] = "حساب متوسط سعر الأصناف المستلمة";
$lang["config_recv_invoice_format"] = "شكل فاتورة الإستلام";
$lang["config_return_policy_required"] = "سياسة الإسترجاع مطلوب";
$lang["config_right"] = "يمين";
$lang["config_sales_invoice_format"] = "شكل فاتورة البيع";
$lang["config_saved_successfully"] = "تم حفظ التهيئة بنجاح";
$lang["config_saved_unsuccessfully"] = "لم يتم حفظ التهيئة بنجاح";
$lang["config_statistics"] = "Send statistics";
$lang["config_statistics_tooltip"] = "Send statistics for development and feature improvement purposes";
$lang["config_stock_location"] = "مكان المخزون";
$lang["config_stock_location_duplicate"] = "من فضلك إستخدم اسم مكان غير مكرر";
$lang["config_stock_location_invalid_chars"] = "مكان المخزون لايمكن أن يحتوى على '_'";
$lang["config_stock_location_required"] = "مكان المخزون مطلوب";
$lang["config_takings_printer"] = "طابعة الإيراد";
$lang["config_tax_decimals"] = "العلامة العشرية للضريبة";
$lang["config_tax_included"] = "شامل الضريبة";
$lang["config_thousands_separator"] = "فاصل الاف";
$lang["config_timezone"] = "المنطقة الزمنية";
$lang["config_top"] = "علوى";
$lang["config_website"] = "موقع الشركة";
$lang["config_number_locale"] = "التهيئة الاقليمية";
$lang["config_return_policy_required"] = "سياسة الإسترجاع مطلوب";
$lang["config_number_locale_required"] = "رقم التهيئة الإقليمية مطلوب";
$lang["config_number_locale_invalid"] = "التهيئة الإقليمية المختارة غير صحية، راجع الرابط الموجود فى الملاحظة لاختيار تهيئة مناسبة";
$lang["config_number_locale_tooltip"] = "إيجاد تهيئة إقليمية مناسبة عبر الرابط";
$lang["config_theme"] = "السمة";

View File

@@ -0,0 +1,24 @@
<?php
$lang["customers_account_number"] = "رقم الحساب";
$lang["customers_account_number_duplicate"] = "رقم الحساب هذا موجود فى قاعدة البيانات من قبل";
$lang["customers_cannot_be_deleted"] = "لايمكن حذف هؤلاء العملاء، أحدهم/كلهم مرتبط/مرتبطين بمبيعات";
$lang["customers_company_name"] = "اسم الشركة";
$lang["customers_confirm_delete"] = "هل تريد حذف هؤلاء العملاء حقاً؟";
$lang["customers_customer"] = "العميل";
$lang["customers_discount"] = "نسبة الخصم";
$lang["customers_error_adding_updating"] = "خطاء فى إضافة أو تحديث العميل";
$lang["customers_new"] = "عميل جديد";
$lang["customers_none_selected"] = "لم تختار عملاء للحذف";
$lang["customers_one_or_multiple"] = "عميل/عملاء";
$lang["customers_successful_adding"] = "لقد أضفت عميل بنجاح";
$lang["customers_successful_deleted"] = "لقد قمت بالحذف بنجاح";
$lang["customers_successful_updating"] = "لقد قمت بتحديث بيانات العميل بنجاح";
$lang["customers_taxable"] = "خاضع للضريبة";
$lang["customers_total"] = "المجموع";
$lang["customers_update"] = "تحديث بيانات عميل";
$lang["customers_import_items_excel"] = "استيراد العملا ء من ورقة عمل اكسل";
$lang["customers_excel_import_failed"] = "فشل الإستيراد من اكسل";
$lang["customers_excel_import_nodata_wrongformat"] = "الملف الذى رفعته إما فارغ أو أنه مختلف البنية";
$lang["customers_excel_import_success"] = "تم استيراد العملاء بنجاح";
$lang["customers_excel_import_partially_failed"] = "تم استيراد معظم العملاء. البعض لم يتم استيرادهم ، وهذه هى القائمة";

View File

@@ -0,0 +1,21 @@
<?php
$lang["datepicker_today"] = "اليوم";
$lang["datepicker_weekstart"] = "0";
$lang["datepicker_all_time"] = "جميع الأوقات";
$lang["datepicker_last_7"] = "أخر سبعة أيام";
$lang["datepicker_last_30"] = "أخر 30 يوم";
$lang["datepicker_last_month"] = "أخر شهر";
$lang["datepicker_last_year"] = "السنة الماضية";
$lang["datepicker_this_month"] = "هذا الشهر";
$lang["datepicker_this_month_last_year"] = "نفس الشهر من العام الماضي";
$lang["datepicker_same_month_to_today"] = "هذا الشهر حتى اليوم";
$lang["datepicker_same_month_to_same_day_last_year"] = "نفس الشهر حتى اليوم من السنة الماضية";
$lang["datepicker_this_year"] = "السنة الحالية";
$lang["datepicker_today_last_year"] = "نفس اليوم من السنة الماضية";
$lang["datepicker_yesterday"] = "أمس";
$lang["datepicker_apply"] = "تطبيق";
$lang["datepicker_cancel"] = "إلغاء";
$lang["datepicker_from"] = "من";
$lang["datepicker_to"] = "إلى";
$lang["datepicker_custom"] = "مخصص";

View File

@@ -0,0 +1,28 @@
<?php
$lang["employees_basic_information"] = "المعلومات الأساسية للموظف";
$lang["employees_cannot_be_deleted"] = "لايمكن حذف الموظفين ، واحد أو أكثر من المظفين قام بإجراء مبيعات :)";
$lang["employees_confirm_delete"] = "هل أنت متأكد أنك تريد حذف الموظفين المختارين؟";
$lang["employees_employee"] = "موظف";
$lang["employees_error_adding_updating"] = "خطاء فى إضافة/تعديل موظف";
$lang["employees_error_deleting_demo_admin"] = "لايمكن حذف المستخدم admin الخاص بنسخة العرض";
$lang["employees_error_updating_demo_admin"] = "لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض";
$lang["employees_login_info"] = "معلومات دخول الموظف";
$lang["employees_new"] = "موظف جديد";
$lang["employees_none_selected"] = "لم تختار أى من الموظفين للحذف";
$lang["employees_one_or_multiple"] = "موظف/موظفين";
$lang["employees_password"] = "كلمة السر";
$lang["employees_password_minlength"] = "كلمة السر يجب أن تكون 8 حروف على الأقل";
$lang["employees_password_must_match"] = "كلمتى السر لا تتطابقان";
$lang["employees_password_required"] = "كلمة السر مطلوبة";
$lang["employees_permission_desc"] = "قم بإضافة الصلاحيات بلإختيار من الأسفل";
$lang["employees_permission_info"] = "اذونات المستخدمين";
$lang["employees_repeat_password"] = "كلمة السر مرة اخرى";
$lang["employees_successful_adding"] = "لقد تم إضافة الموظف بنجاح";
$lang["employees_successful_deleted"] = "لقد تم حذف الموظف بنجاح";
$lang["employees_successful_updating"] = "لقد تم تحديث بيانات الموظف بنجاح";
$lang["employees_update"] = "تحديث بيانات موظف";
$lang["employees_username"] = "اسم المستخدم";
$lang["employees_username_minlength"] = "اسم المستخدم يجب أن يكون 5 حروف على الأقل";
$lang["employees_username_required"] = "اسم المستخدم مطلوب";
$lang["employees_subpermission_required"] = "يجب إختيار صلاحية واحدة على الأقل لكل قسم";

View File

@@ -0,0 +1,4 @@
<?php
$lang["error_no_permission_module"] = "ليس لديك صلاحيات للوصول لهذا القسم";
$lang["error_unknown"] = "غير معروف";

View File

@@ -0,0 +1,69 @@
<?php
$lang["giftcards_add_minus"] = "المخزن المضاف أو المطروح منه";
$lang["giftcards_allow_alt_description"] = "السماح بوصف بديل";
$lang["giftcards_amazon"] = "Amazon";
$lang["giftcards_remaining_balance"] = "كارت الهدية %1 القيمة المتبقية منه %2!";
$lang["giftcards_bulk_edit"] = "تحرير جماعى";
$lang["giftcards_cannot_be_deleted"] = "لايمكن حذف بطاقات الهدية المختارة، واحد أو أكثر منها لديه مبيعات";
$lang["giftcards_cannot_find_giftcard"] = "لايمكن إيجاد معلومات حول كارت الهدية";
$lang["giftcards_card_value"] = "القيمة";
$lang["giftcards_category"] = "الفئة";
$lang["giftcards_change_all_to_allow_alt_desc"] = "السماح بوصف بديل للكل";
$lang["giftcards_change_all_to_not_allow_allow_desc"] = "غير مسموح بوصف بديل للكل";
$lang["giftcards_change_all_to_serialized"] = "تغيير الجميع لأرقام مسلسلة";
$lang["giftcards_change_all_to_unserialized"] = "تغير الجميع لأرقام غير مسلسلة";
$lang["giftcards_confirm_bulk_edit"] = "هل أنت متأكد انك تريد تحرير كل بطاقات الهدايا المختارة؟";
$lang["giftcards_confirm_delete"] = "هل أنت متأكد انك تريد حذف كل بطاقات الهدايا المختارة؟";
$lang["giftcards_cost_price"] = "سعر التكلفة";
$lang["giftcards_count"] = "تحديث المخزون";
$lang["giftcards_current_quantity"] = "الكميات الحالية";
$lang["giftcards_description"] = "الوصف";
$lang["giftcards_details_count"] = "حركة الكارت";
$lang["giftcards_do_nothing"] = "لا تفعل شىء";
$lang["giftcards_edit_fields_you_want_to_update"] = "قم بتحديث الحقول المراد تحديثها لكل بطاقات الهدايا المختارة";
$lang["giftcards_edit_multiple_giftcards"] = "تحرير مجموعة من بطاقات الهدايا";
$lang["giftcards_error_adding_updating"] = "خطاء فى إضافة/تحديث بطاقة هدية";
$lang["giftcards_error_updating_multiple"] = "خطاء فى تحديث بيانات بطاقات الهدايا";
$lang["giftcards_excel_import_failed"] = "فشل الإستيراد من اكسل";
$lang["giftcards_generate_barcodes"] = "توليد أكواد الباركود";
$lang["giftcards_giftcard"] = "بطاقة هدية";
$lang["giftcards_giftcard_number"] = "رقم بطاقة الهدية";
$lang["giftcards_info_provided_by"] = "المعلومات مقدمة بواسطة";
$lang["giftcards_inventory_comments"] = "تعليقات";
$lang["giftcards_is_serialized"] = "بطاقة الهدية لها رقم مسلسل";
$lang["giftcards_low_inventory_giftcards"] = "مخزون قليل من بطاقات الهدايا";
$lang["giftcards_manually_editing_of_quantity"] = "تحرير الكميات يدويا";
$lang["giftcards_must_select_giftcard_for_barcode"] = "يجب إختيار بطاقة هدية واحدة على الأقل لتوليد أكواد الباركود";
$lang["giftcards_new"] = "بطاقة هدية جديدة";
$lang["giftcards_no_description_giftcards"] = "لايوجد وصف لبطاقات الهدايا";
$lang["giftcards_no_giftcards_to_display"] = "لايوجد بطاقات هدايا لعرضها";
$lang["giftcards_none"] = "لايوجد";
$lang["giftcards_none_selected"] = "لم تقم بإختيار أى بطاقة هدية";
$lang["giftcards_number"] = "رقم بطاقة الهدية يجب أن يكون رقم";
$lang["giftcards_number_information"] = "رقم بطاقة الهدية";
$lang["giftcards_number_required"] = "رقم بطاقة الهدية مطلوب";
$lang["giftcards_one_or_multiple"] = "بطاقة/بطاقات الهدية";
$lang["giftcards_person_id"] = "العميل";
$lang["giftcards_quantity"] = "الكمية";
$lang["giftcards_quantity_required"] = "الكمية مطلوبة";
$lang["giftcards_reorder_level"] = "نقطة إعادة الطلب";
$lang["giftcards_retrive_giftcard_info"] = "إسترجاع بيانات بطاقة هدية";
$lang["giftcards_sales_tax_1"] = "ضريبة المبيعات";
$lang["giftcards_sales_tax_2"] = "ضريبة المبيعات 2";
$lang["giftcards_serialized_giftcards"] = "بطاقات هدايا مسلسلة";
$lang["giftcards_successful_adding"] = "تم إضافة بطاقة هدية بنجاح";
$lang["giftcards_successful_bulk_edit"] = "تم تحديث بطاقات الهدايا بنجاح";
$lang["giftcards_successful_deleted"] = "تم الحذف بنجاح";
$lang["giftcards_successful_updating"] = "تم تحديث بطاقة الهدية بنجاح";
$lang["giftcards_supplier"] = "المورد";
$lang["giftcards_tax_1"] = "الضريبة 1";
$lang["giftcards_tax_2"] = "الضريبة 2";
$lang["giftcards_tax_percent"] = "نسبة الضريبة";
$lang["giftcards_tax_percents"] = "نسبة/نسب الضريبة";
$lang["giftcards_unit_price"] = "سعر الوحدة";
$lang["giftcards_upc_database"] = "UPC قاعدة بيانات";
$lang["giftcards_update"] = "تحديث بطاقة هدية";
$lang["giftcards_use_inventory_menu"] = "استخدام تحديث المخزن";
$lang["giftcards_value"] = "قيمة بطاقة الهدية يجب ان تكون رقم";
$lang["giftcards_value_required"] = "قيمة بطاقة الهدية مطلوبة";

View File

@@ -0,0 +1,21 @@
<?php
$lang["item_kits_add_item"] = "إضافة مجموعة";
$lang["item_kits_cannot_be_deleted"] = "لايمكن حذف مجموعة/مجموعات";
$lang["item_kits_confirm_delete"] = "هل أنت متأكد أنك تريد حذف المجموعة؟";
$lang["item_kits_description"] = "وصف المجموعة";
$lang["item_kits_error_adding_updating"] = "خطاء فى إضافة/تحديث المجموعة";
$lang["item_kits_info"] = "معلومات المجموعة";
$lang["item_kits_item"] = "صنف";
$lang["item_kits_items"] = "أصناف";
$lang["item_kits_kit"] = "كود المجموعة";
$lang["item_kits_name"] = "اسم المجموعة";
$lang["item_kits_new"] = "مجموعة جديده";
$lang["item_kits_no_item_kits_to_display"] = "لاتوجد مجموعات لعرضها";
$lang["item_kits_none_selected"] = "لم تقم بإختيار مجموعات";
$lang["item_kits_one_or_multiple"] = "مجموعة/مجموعات";
$lang["item_kits_quantity"] = "الكمية";
$lang["item_kits_successful_adding"] = "لقد تم إضافة المجموعة بنجاح";
$lang["item_kits_successful_deleted"] = "لقد تم حذف المجموعة بنجاح";
$lang["item_kits_successful_updating"] = "لقد تم تحديث بيانات المجموعة بنجاح";
$lang["item_kits_update"] = "تحديث بيانات مجموعة";

View File

@@ -0,0 +1,92 @@
<?php
$lang["items_add_minus"] = "الكمية المطلوب خصمها أو اضافتها";
$lang["items_allow_alt_desciption"] = "وصف بديل";
$lang["items_allow_alt_description"] = "السماح بوصف بديل";
$lang["items_amazon"] = "Amazon";
$lang["items_bulk_edit"] = "تحرير جماعى";
$lang["items_buy_price_required"] = "سعر الشراء مطلوب";
$lang["items_cannot_be_deleted"] = "لايمكن حذف الأصناف المختارة، واحد أو أكثر منها لديه مبيعات";
$lang["items_cannot_find_item"] = "لايمكن ايجاد معلومات حول الصنف";
$lang["items_category"] = "التصنيف";
$lang["items_category_required"] = "التصنيف مطلوب";
$lang["items_change_all_to_allow_alt_desc"] = "السماح بوصف بديل للجميع";
$lang["items_change_all_to_not_allow_allow_desc"] = "عدم السماح بوصف بديل للجميع";
$lang["items_change_all_to_serialized"] = "تغير الجميع لمتسلسل";
$lang["items_change_all_to_unserialized"] = "تغيير الجميع لغير متسلسل";
$lang["items_confirm_bulk_edit"] = "هل أنت متأكد انك تريد تحرير كل الأصناف المختارة؟";
$lang["items_confirm_bulk_edit_wipe_taxes"] = "سوف يتم مسح معلومات الضرائب لجميع الأصناف";
$lang["items_confirm_delete"] = "هل أنت متأكد انك تريد حذف كل الأصناف المختارة؟";
$lang["items_cost_price"] = "سعر التكلفة";
$lang["items_cost_price_number"] = "سعر التكلفة يجب أن يكون رقم";
$lang["items_cost_price_required"] = "سعر التكلفة مطلوب";
$lang["items_count"] = "تحديث المخزون";
$lang["items_current_quantity"] = "الكمية الحالية";
$lang["items_description"] = "الوصف";
$lang["items_details_count"] = "حركة الصنف";
$lang["items_do_nothing"] = "لاتفعل شئ";
$lang["items_edit_fields_you_want_to_update"] = "قم بتحديث الحقول المراد تحديثها لكل الأصناف المختارة";
$lang["items_edit_multiple_items"] = "تحريد مجموعة اصناف";
$lang["items_error_adding_updating"] = "خطاء فى إضافة/تحديث صنف";
$lang["items_error_updating_multiple"] = "خطاء فى تحديث بيانات أصناف";
$lang["items_excel_import_failed"] = "فشل الإستيراد من اكسل";
$lang["items_excel_import_nodata_wrongformat"] = "الملف الذى رفعته إما فارغ أو أنه مختلف البنية";
$lang["items_excel_import_success"] = "تم استيراد الأصناف بنجاح";
$lang["items_excel_import_partially_failed"] = "تم استيراد معظم الأصناف. البعض لم يتم استيرادهم ، وهذه هى القائمة";
$lang["items_generate_barcodes"] = "توليد أكواد الباركود";
$lang["items_image"] = "صورة";
$lang["items_info_provided_by"] = "المعلومات مقدمة بواسطة";
$lang["items_inventory"] = "المخزن";
$lang["items_inventory_comments"] = "تعليقات";
$lang["items_is_deleted"] = "حذفت";
$lang["items_is_serialized"] = "الصنف له رقم مسلسل";
$lang["items_item"] = "صنف";
$lang["items_item_number"] = "الباركود UPC/EAN/ISBN";
$lang["items_item_number_duplicate"] = "رقم الصنف موجود فى قاعدة البيانات من قبل";
$lang["items_location"] = "مكان";
$lang["items_empty_upc_items"] = "تفريغ اصناف UPC";
$lang["items_low_inventory_items"] = "الأصناف التى لا يوجد لها مخزون";
$lang["items_manually_editing_of_quantity"] = "تحرير الكمية يدوياً";
$lang["items_name"] = "اسم الصنف";
$lang["items_name_required"] = "اسم الصنف مطلوب";
$lang["items_new"] = "صنف جديد";
$lang["items_no_description_items"] = "الأصناف التى بلا وصف";
$lang["items_no_items_to_display"] = "لايوجد أصناف لعرضها";
$lang["items_none"] = "لاشىء";
$lang["items_none_selected"] = "لم تختار أى أصناف لتحريرها";
$lang["items_number_information"] = "رقم الصنف";
$lang["items_number_required"] = "مطلوب UPC/EAN/ISBN رقم الباركود ";
$lang["items_one_or_multiple"] = "صنف/أصناف";
$lang["items_quantity"] = "الكمية";
$lang["items_quantity_number"] = "الكمية يجب أن تكون رقم";
$lang["items_quantity_required"] = "الكمية مطلوبة";
$lang["items_receiving_quantity"] = "الكمية المستلمة";
$lang["items_reorder_level"] = "نقطة إعادة الطلب";
$lang["items_reorder_level_number"] = "نقطة إعادة الطلب يجب أن تكون رقم";
$lang["items_reorder_level_required"] = "نقطة إعادة الطلب مطلوبة";
$lang["items_retrive_item_info"] = "استرجاع بيانات الصنف";
$lang["items_sales_tax_1"] = "ضريبة المبيعات";
$lang["items_sales_tax_2"] = "ضريبة المبيعات 2";
$lang["items_search_custom_items"] = "بحث الحقول المخصصة";
$lang["items_serialized_items"] = "أصناف مسلسلة";
$lang["items_stock_location"] = "مكان المخزون";
$lang["items_successful_adding"] = "لقد تم إضافة صنف بنجاح";
$lang["items_successful_bulk_edit"] = "لقد تم تحديث بيانات صنف/أصناف بنجاح";
$lang["items_successful_deleted"] = "لقد تم الحذف بنجاح";
$lang["items_successful_updating"] = "لقد تم تحديث بيانات صنف بنجاح";
$lang["items_supplier"] = "المورد";
$lang["items_tax_1"] = "الضريبة 1";
$lang["items_tax_2"] = "الضريبة 2";
$lang["items_tax_percent"] = "نسبة الضريبة";
$lang["items_tax_percent_required"] = "نسبة الضريبة مطلوبة";
$lang["items_tax_percents"] = "نسبة/نسب الضريبة";
$lang["items_unit_price"] = "السعر";
$lang["items_unit_price_number"] = "السعر يجب أن يكون رقم";
$lang["items_unit_price_required"] = "السعر مطلوب";
$lang["items_upc_database"] = "UPC قاعدة بيانات";
$lang["items_update"] = "تحديث بيانات صنف";
$lang["items_use_inventory_menu"] = "استخدام تحديث المخزن";
$lang["items_import_items_excel"] = "استيراد من اكسل";
$lang["items_select_image"] = "اختار صورة";
$lang["items_change_image"] = "تغيير الصورة";
$lang["items_remove_image"] = "ازالة الصورة";

View File

@@ -0,0 +1,7 @@
<?php
$lang["login_go"] = "البدء";
$lang["login_invalid_username_and_password"] = "اسم مستخدم/كلمة سر غير صحيح";
$lang["login_login"] = "دخول";
$lang["login_password"] = "كلمة السر";
$lang["login_username"] = "اسم المستخدم";

View File

@@ -0,0 +1,14 @@
<?php
$lang["messages_sms_send"] = "إرسال SMS";
$lang["messages_first_name"] = "الإسم الأول";
$lang["messages_last_name"] = "الأسم الأخير";
$lang["messages_phone"] = "رقم المحمول";
$lang["messages_phone_placeholder"] = "رقم/أرقام المحمول هنا...";
$lang["messages_phone_number_required"] = "رقم المحمول مطلوب";
$lang["messages_message"] = "الرسالة";
$lang["messages_message_placeholder"] = "رسالتك هنا...";
$lang["messages_message_required"] = "الرسالة مطلوبة";
$lang["messages_multiple_phones"] = " فى حالة إرسال الرسالة لأكثر من شخص قم بفصل الأرقام بعلامة الفاصلة";
$lang["messages_successfully_sent"] = "تم إرسال الرسالة بنجاح إلى: ";
$lang["messages_unsuccessfully_sent"] = "لم يتم إرسال الرسالة بنجاح إلى: ";

View File

@@ -0,0 +1,25 @@
<?php
$lang["module_config"] = "إعدادات الشركة";
$lang["module_config_desc"] = "تغيير إعدادات الشركة";
$lang["module_customers"] = "العملاء";
$lang["module_customers_desc"] = "إضافة، تحديث ، بحث و حذف العملاء";
$lang["module_employees"] = "الموظفين";
$lang["module_employees_desc"] = "إضافة، تحديث ، بحث و حذف الموظفين";
$lang["module_giftcards"] = "بطاقات الهدايا";
$lang["module_giftcards_desc"] = "إضافة، تحديث ، بحث و حذف بطاقات الهدايا";
$lang["module_home"] = "الرئيسية";
$lang["module_item_kits"] = "مجموعات الأصناف";
$lang["module_item_kits_desc"] = "إضافة، تحديث ، بحث و حذف مجموعات الأصناف";
$lang["module_items"] = "الأصناف";
$lang["module_items_desc"] = "إضافة، تحديث ، بحث و حذف الأصناف";
$lang["module_receivings"] = "استلام الأصناف";
$lang["module_receivings_desc"] = "معالجة أوامر الشراء و استلام الأصناف";
$lang["module_reports"] = "التقارير";
$lang["module_reports_desc"] = "عرض وتوليد التقارير";
$lang["module_sales"] = "المبيعات";
$lang["module_sales_desc"] = "معالجة المبيعات و المرتجعات";
$lang["module_suppliers"] = "الموردين";
$lang["module_suppliers_desc"] = "إضافة، تحديث ، بحث و حذف مجموعات الموردين";
$lang["module_messages"] = "الرسائل";
$lang["module_messages_desc"] = "إرسال رسائل للعملاء ، الموردين او الموظفين";

View File

@@ -0,0 +1,52 @@
<?php
$lang["receivings_transaction_failed"] = "حركات الإستلام فشلت";
$lang["receivings_cancel_receiving"] = "إلغاء";
$lang["receivings_cannot_be_deleted"] = "لايمكن حذف الإستلام/الإستلامات";
$lang["receivings_comments"] = "تعليقات";
$lang["receivings_complete_receiving"] = "إنهاء";
$lang["receivings_confirm_cancel_receiving"] = "هل أنت متاكد أنك تريد إلغاء هذا الإستلام؟ سيتم حذف كل الأصناف.";
$lang["receivings_confirm_finish_receiving"] = "هل أنت متاكد أنك تريد تنفيذ هذا الإستلام؟ لايمكن التراجع بعد الإرسال";
$lang["receivings_cost"] = "التكلفة";
$lang["receivings_date"] = "تاريخ الإستلام";
$lang["receivings_date_required"] = "يجب إدخال تاريخ صحيح";
$lang["receivings_date_type"] = "التاريخ مطلوب";
$lang["receivings_confirm_delete"] = "هل أنت متاكد أنك تريد حذف هذا الإستلام؟ سيتم حذف كل الأصناف. لايمكن التراجع بعد الحذف";
$lang["receivings_delete_entire_sale"] = "حذف عملية البيع بالكامل";
$lang["receivings_discount"] = "نسبة الخصم";
$lang["receivings_edit"] = "تحرير";
$lang["receivings_edit_sale"] = "تحرير إستلام";
$lang["receivings_employee"] = "الموظف";
$lang["receivings_error_editing_item"] = "خطاء فى تحرير الصنف";
$lang["receivings_error_requisition"] = "غير قادر على تحريك الصنف من و إلى نفس المكان";
$lang["receivings_find_or_scan_item"] = "بحث/مسح باركود صنف";
$lang["receivings_find_or_scan_item_or_receipt"] = "بحث/مسح باركود صنف أو إيصال";
$lang["receivings_id"] = "كود الإستلام";
$lang["receivings_reference"] = "رقم المرجع";
$lang["receivings_item_name"] = "اسم الصنف";
$lang["receivings_mode"] = "وضع الإستلام";
$lang["receivings_new_supplier"] = "مورد جديد";
$lang["receivings_one_or_multiple"] = "إستلام/إستلامات";
$lang["receivings_print_after_sale"] = "طباعة بعد الإستلام";
$lang["receivings_quantity"] = "الكمية";
$lang["receivings_receipt"] = "إيصال إستلام";
$lang["receivings_receipt_number"] = "كود الإستلام";
$lang["receivings_receiving"] = "إستلام";
$lang["receivings_register"] = "استلام الأصناف";
$lang["receivings_requisition"] = "طلب شراء";
$lang["receivings_return"] = "إرتجاع لمورد";
$lang["receivings_select_supplier"] = "اختار المورد (اختيارى)";
$lang["receivings_start_typing_supplier_name"] = "ابداء بكتابة اسم المورد....";
$lang["receivings_stock_destination"] = "المخزون المحول له";
$lang["receivings_stock_locaiton"] = "مكان المخزون";
$lang["receivings_stock_source"] = "مصدر المخزون";
$lang["receivings_successfully_deleted"] = "لقد تم الحذف";
$lang["receivings_successfully_updated"] = "لقد تم التحديث";
$lang["receivings_supplier"] = "المورد";
$lang["receivings_supplier_email"] = "البريد الإلكتروني";
$lang["receivings_supplier_address"] = "العنوان";
$lang["receivings_supplier_location"] = "المكان";
$lang["receivings_total"] = "الإجمالى";
$lang["receivings_unable_to_add_item"] = "غير قادر على إضافة صنف للإستلام";
$lang["receivings_unsuccessfully_updated"] = "لم يتم تحديث الإستلام بنجاح";
$lang["receivings_update"] = "تحديث";

View File

@@ -0,0 +1,97 @@
<?php
$lang["reports_all"] = "الكل";
$lang["reports_categories"] = "التصنيفات";
$lang["reports_categories_summary_report"] = "تقرير ملخص التصنيفات";
$lang["reports_category"] = "تصنيف";
$lang["reports_comments"] = "التعليقات";
$lang["reports_count"] = "عدد";
$lang["reports_customer"] = "عميل";
$lang["reports_customers"] = "عملاء";
$lang["reports_customers_summary_report"] = "تقرير ملخص العملاء";
$lang["reports_date"] = "التاريخ";
$lang["reports_date_range"] = "الفترة الزمنية";
$lang["reports_description"] = "الوصف";
$lang["reports_detailed_receivings_report"] = "تقرير مفصل لاستلام البضاعة";
$lang["reports_detailed_reports"] = "التقارير التفصيلية";
$lang["reports_detailed_requisition_report"] = "تقرير مفصل لطلبات الشراء";
$lang["reports_detailed_sales_report"] = "تقرير مفصل للمبيعات";
$lang["reports_discount"] = "الخصم";
$lang["reports_discount_percent"] = "نسبة الخصم";
$lang["reports_discounts"] = "الخصومات";
$lang["reports_discounts_summary_report"] = "تقرير ملخص الخصومات";
$lang["reports_employee"] = "موظف";
$lang["reports_employees"] = "الموظفين";
$lang["reports_employees_summary_report"] = "تقرير ملخص الموظفين";
$lang["reports_graphical_reports"] = "تقارير رسومية";
$lang["reports_inventory"] = "المخزن";
$lang["reports_inventory_low"] = "نواقص المخزون";
$lang["reports_inventory_low_report"] = "تقرير نواقص المخزون";
$lang["reports_inventory_reports"] = "تقارير المخزن";
$lang["reports_inventory_summary"] = "ملخص المخزن";
$lang["reports_inventory_summary_report"] = "تقرير ملخص المخزن";
$lang["reports_item"] = "صنف";
$lang["reports_item_name"] = "اسم الصنف";
$lang["reports_item_number"] = "رقم الصنف";
$lang["reports_items"] = "الأصناف";
$lang["reports_items_purchased"] = "الأصناف مشتراه";
$lang["reports_items_received"] = "الأصناف مستلمة";
$lang["reports_items_summary_report"] = "تقرير ملخص الأصناف";
$lang["reports_low_inventory"] = "النواقص";
$lang["reports_low_inventory_report"] = "تقرير نواقص المخزون";
$lang["reports_name"] = "الاسم";
$lang["reports_payment_type"] = "طريقة الدفع";
$lang["reports_payments"] = "المدفوعات";
$lang["reports_payments_summary_report"] = "ملخص المدفوعات";
$lang["reports_profit"] = "الربح";
$lang["reports_cost"] = "التكلفة";
$lang["reports_quantity"] = "الكمية المشتراه";
$lang["reports_quantity_purchased"] = "المستلم";
$lang["reports_received_by"] = "مستلمة بواسطة";
$lang["reports_receiving_id"] = "كود الاستلام";
$lang["reports_receiving_type"] = "نوع الاستلام";
$lang["reports_receivings"] = "استلام البضاعة";
$lang["reports_reorder_level"] = "نقطة اعادة الطلب";
$lang["reports_report"] = "تقرير";
$lang["reports_report_input"] = "مدخلات التقرير";
$lang["reports_reports"] = "تقارير";
$lang["reports_requisition"] = "طلب الشراء";
$lang["reports_requisition_by"] = "القائم بطلب الشراء";
$lang["reports_requisition_id"] = "كود طلب الشراء";
$lang["reports_requisition_item"] = "الصنف";
$lang["reports_requisition_item_quantity"] = "الكمية المطلوبة";
$lang["reports_requisition_related_item"] = "الصنف";
$lang["reports_requisition_related_item_total_quantity"] = "إجمالى الكمية";
$lang["reports_requisition_related_item_unit_quantity"] = "الكمية";
$lang["reports_requisitions"] = "طلبات الشراء";
$lang["reports_returns"] = "المرتجعات";
$lang["reports_revenue"] = "العائد";
$lang["reports_sale_id"] = "كود عملية البيع";
$lang["reports_sale_type"] = "طريقة البيع";
$lang["reports_sales"] = "بيع";
$lang["reports_sales_amount"] = "كمية المبيعات";
$lang["reports_sales_summary_report"] = "تقرير ملخص المبيعات";
$lang["reports_serial_number"] = "مسلسل";
$lang["reports_sold_by"] = "البائع";
$lang["reports_sold_to"] = "مباع الى";
$lang["reports_stock_location"] = "مكان المخزون";
$lang["reports_subtotal"] = "المجموع الفرعى";
$lang["reports_summary_reports"] = "تقارير ملخصة";
$lang["reports_supplied_by"] = "مورده بواسطة";
$lang["reports_supplier"] = "المورد";
$lang["reports_suppliers"] = "الموردين";
$lang["reports_suppliers_summary_report"] = "تقرير ملخص الموردين";
$lang["reports_tax"] = "الضريبة";
$lang["reports_tax_percent"] = "نسبة الضريبة";
$lang["reports_taxes"] = "الضرائب";
$lang["reports_taxes_summary_report"] = "تقرير ملخص الضرائب";
$lang["reports_total"] = "الإجمالى";
$lang["reports_type"] = "النوع";
$lang["reports_item_count"] = "تصفية عداد الصنف";
$lang["reports_cost_price"] = "سعر التكلفة";
$lang["reports_unit_price"] = "السعر";
$lang["reports_sub_total_value"] = "المجموع الفرعى";
$lang["reports_total_inventory_value"] = "إجمالى قيمة المخزن";
$lang["reports_zero_and_less"] = "صفر و أقل";
$lang["reports_more_than_zero"] = "أكثر من صفر";
$lang["reports_no_reports_to_display"] = "لايوجد أصناف لعرضها";

Some files were not shown because too many files have changed in this diff Show More